From 59d87eabc56a8fb0d83897423596cb70cd856cfa Mon Sep 17 00:00:00 2001 From: Tomasz Boruc Date: Fri, 30 May 2025 20:02:46 +0200 Subject: [PATCH] =?UTF-8?q?Pierwszy=20commit=20-=20dodawanie=20plik=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 123.php | 23 + abc.php | 41 + compress.php | 172 + config.php | 572 + config_cp.php | 153 + config_fonts.php | 304 + css/lightbox.css | 27 + dx.php | 24 + eksport_harmonogram.php | 46 + eksport_raport.php | 60 + eksport_raport_all.php | 59 + eksport_raport_pm.php | 59 + fpdf.php | 1647 ++ funkcje.php | 544 + funkcje_show.php | 7724 +++++++ funkcje_show.php.add | 11 + graph.php | 721 + harmonogram.php | 1942 ++ index.html | 1 + index.html_ | 1 + index.php | 5 + info_o_cookie.js | 52 + js/builder.js | 136 + js/effects.js | 1122 + js/lightbox.js | 497 + js/prototype.js | 4221 ++++ js/scriptaculous.js | 58 + kalendarz.js | 205 + kategorie.php | 133 + kilometry.php | 1177 ++ konta.php | 862 + lista_towarow.php | 84 + login.JPG | Bin 0 -> 7062 bytes loguj.php | 38 + magazyn.php | 550 + mail_class.php | 105 + mpdf.css | 20 + mpdf.php | 32723 +++++++++++++++++++++++++++++ panel.php | 400 + pdf.php | 50 + pos.php | 1 + progbar.css | 66 + raporty.php | 3324 +++ raporty1.php | 3246 +++ samochod.old | 461 + samochod.php | 979 + style.css | 136 + tankowania.php | 880 + test.php | 12 + ustawienia.php | 259 + vending.php | 3001 +++ wydruk_harmonogram.php | 79 + wyloguj.php | 9 + zaliczki.php | 1410 ++ zaliczki.php.add | 12 + zaliczki_zestawienie.php | 26 + zestawienia.php | 6 + zestawienie_czas_raport.php | 47 + zestawienie_czasu.php | 104 + zestawienie_klometrow.php | 130 + zestawienie_klometry_raport.php | 47 + zestawienie_klometry_raport2.php | 46 + zestawienie_paliwo.php | 68 + zestawienie_zaliczek.php | 162 + zestawienie_zaliczek_raport.php | 47 + 65 files changed, 71127 insertions(+) create mode 100644 123.php create mode 100644 abc.php create mode 100644 compress.php create mode 100644 config.php create mode 100644 config_cp.php create mode 100644 config_fonts.php create mode 100644 css/lightbox.css create mode 100644 dx.php create mode 100644 eksport_harmonogram.php create mode 100644 eksport_raport.php create mode 100644 eksport_raport_all.php create mode 100644 eksport_raport_pm.php create mode 100644 fpdf.php create mode 100644 funkcje.php create mode 100644 funkcje_show.php create mode 100644 funkcje_show.php.add create mode 100644 graph.php create mode 100644 harmonogram.php create mode 100644 index.html create mode 100644 index.html_ create mode 100644 index.php create mode 100644 info_o_cookie.js create mode 100644 js/builder.js create mode 100644 js/effects.js create mode 100644 js/lightbox.js create mode 100644 js/prototype.js create mode 100644 js/scriptaculous.js create mode 100644 kalendarz.js create mode 100644 kategorie.php create mode 100644 kilometry.php create mode 100644 konta.php create mode 100644 lista_towarow.php create mode 100644 login.JPG create mode 100644 loguj.php create mode 100644 magazyn.php create mode 100644 mail_class.php create mode 100644 mpdf.css create mode 100644 mpdf.php create mode 100644 panel.php create mode 100644 pdf.php create mode 100644 pos.php create mode 100644 progbar.css create mode 100644 raporty.php create mode 100644 raporty1.php create mode 100644 samochod.old create mode 100644 samochod.php create mode 100644 style.css create mode 100644 tankowania.php create mode 100644 test.php create mode 100644 ustawienia.php create mode 100644 vending.php create mode 100644 wydruk_harmonogram.php create mode 100644 wyloguj.php create mode 100644 zaliczki.php create mode 100644 zaliczki.php.add create mode 100644 zaliczki_zestawienie.php create mode 100644 zestawienia.php create mode 100644 zestawienie_czas_raport.php create mode 100644 zestawienie_czasu.php create mode 100644 zestawienie_klometrow.php create mode 100644 zestawienie_klometry_raport.php create mode 100644 zestawienie_klometry_raport2.php create mode 100644 zestawienie_paliwo.php create mode 100644 zestawienie_zaliczek.php create mode 100644 zestawienie_zaliczek_raport.php diff --git a/123.php b/123.php new file mode 100644 index 0000000..8d11469 --- /dev/null +++ b/123.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/abc.php b/abc.php new file mode 100644 index 0000000..5ad81c3 --- /dev/null +++ b/abc.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/compress.php b/compress.php new file mode 100644 index 0000000..85897cf --- /dev/null +++ b/compress.php @@ -0,0 +1,172 @@ + + + + + +

WARNING: This utility will OVERWRITE mpdf.php file in the current directory.

+

Select the functions you wish to INCLUDE in your mpdf.php program. When you click generate, a new mpdf.php file will be written to the current directory.

+
Notes + +
+ Select/Unselect All

+ +
+'; +foreach($excl AS $k=>$ex) { + echo ' 1 && $k < 5)) { + echo ' checked="checked"'; + } + echo ' /> '.$ex.'
'; +} + +echo '
+ +
+ +'; +exit; +} + +$inc = $_POST['inc']; +if (is_array($inc) && count($inc)>0 ) { + foreach($inc AS $i=>$v) { + $key = array_search($i, $excl); + unset($excl[$key]); + } +} + +if (!defined('PHP_VERSION_ID')) { + $version = explode('.', PHP_VERSION); + define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); +} +if (PHP_VERSION_ID < 50300) { $mqr = @get_magic_quotes_runtime(); } + else { $mqr=0; } +if ($mqr) { set_magic_quotes_runtime(0); } + +$l = file('mpdf_source.php'); +if (!count($l)) { die("ERROR - Could not find mpdf_source.php file in current directory"); } +$exclflags = array(); +$x = ''; + + // Excluding 'HTML-CSS' will also exclude: 'TABLES', 'LISTS', 'TABLES-ADVANCED-BORDERS', 'HTMLHEADERS-FOOTERS', 'FORMS', 'BACKGROUNDS', 'CSS-FLOAT', 'CSS-IMAGE-FLOAT', 'CSS-POSITION', 'CSS-PAGE', 'BORDER-RADIUS' +if ($excl[0]=='HTML-CSS') { + $excl[] = 'TABLES'; + $excl[] = 'LISTS'; + $excl[] = 'TABLES-ADVANCED-BORDERS'; + $excl[] = 'HTMLHEADERS-FOOTERS'; + $excl[] = 'FORMS'; + $excl[] = 'BACKGROUNDS'; + $excl[] = 'CSS-FLOAT'; + $excl[] = 'CSS-IMAGE-FLOAT'; + $excl[] = 'CSS-POSITION'; + $excl[] = 'CSS-PAGE'; + $excl[] = 'BORDER-RADIUS'; +} +$excl = array_unique($excl); + +foreach($l AS $k=>$ln) { + $exclude = false; + // *XXXXX* + preg_match_all("/\/\/ \*([A-Za-z\-]+)\*/", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + $exclude = true; + } + } + /*-- XXXXX --*/ + preg_match_all("/\/\*-- ([A-Za-z\-]+) --\*\//", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + $exclflags[$mm] = true; + } + $exclude = true; + } + $exclflags = array_unique($exclflags); + /*-- END XXXX --*/ + preg_match_all("/\/\*-- END ([A-Za-z\-]+) --\*\//", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + unset($exclflags[$mm]); + } + $exclude = true; + } + if (count($exclflags)==0 && !$exclude) { + $x .= $ln; + } +} +// mPDF 5.0 +if (function_exists('file_put_contents')) { + $check = file_put_contents('mpdf.php', $x); +} +else { + $f=fopen('mpdf.php', 'w'); + $check = fwrite($f, $x); + fclose($f); +} +if (!$check) { die("ERROR - Could not write to mpdf.php file. Are permissions correctly set?"); } +echo '

mPDF file generated successfully!

'; +echo '
mPDF file size '.number_format((strlen($x)/1024)).' kB
'; + +unset($l); +unset($x); + +include('mpdf.php'); +$mpdf = new mPDF(); + +echo '
Memory usage on loading mPDF class '.number_format((memory_get_usage(true)/(1024*1024)),2).' MB
'; + +exit; + +?> \ No newline at end of file diff --git a/config.php b/config.php new file mode 100644 index 0000000..2a81a6a --- /dev/null +++ b/config.php @@ -0,0 +1,572 @@ +h2bookmarks = array(); +$this->h2toc = array(); +/* Define arrays with e.g. the tag=>ToC-level +Remember bookmark and ToC levels start at 0 +(does not work inside tables) +Only the default ToC will be used if > 1 ToCs are defined for the document +H1 - H6 must be uppercase +$this->h2toc = array('H1'=>0, 'H2'=>1, 'H3'=>2); +$this->h2bookmarks = array('H1'=>0, 'H2'=>1, 'H3'=>2); +*/ + +// mPDF 5.7 +// Text-align on decimal marks +// Allowed characters for alignment on decimal marks. Additional codes must start with D +// Non-ASCII characters should be in utf-8 encoding +// DM - middot U+00B7 +// DA - arabic decimal mark U+066B +$this->decimal_align = array('DP'=>'.', 'DC'=>',', 'DM'=>"\xc2\xb7", 'DA'=>"\xd9\xab", 'DD'=>'-'); + +// PAGING +$this->mirrorMargins = 0; +$this->restoreBlockPagebreaks = false; +$this->forcePortraitMargins = false; +$this->displayDefaultOrientation = false; +$this->printers_info = false; // Adds date and page info for printer when using @page and "marks:crop;" +$this->bleedMargin = 5; +$this->crossMarkMargin = 5; // Distance of cross mark from margin in mm +$this->cropMarkMargin = 8; // Distance of crop mark from margin in mm +$this->cropMarkLength = 18; // Default length in mm of crop line +$this->nonPrintMargin = 8; // Non-printable border at edge of paper sheet in mm +// mPDF 5.5 +// Avoid just the border/background-color of the end of a block being moved on to next page +$this->margBuffer = 2; // Allows an (empty) end of block to extend beyond the bottom margin by this amount (mm) + + +// PAGE NUMBERING +$this->pagenumPrefix; +$this->pagenumSuffix; +$this->nbpgPrefix; +$this->nbpgSuffix; + + +// FONTS, LANGUAGES & CHARACTER SETS +// Set maximum size of TTF font file to allow non-subsets - in kB +// Used to avoid e.g. Arial Unicode MS (perhaps used for substitutions) to ever be fully embedded +// NB Free serif is 1.5MB, most files are <= 600kB (most 200-400KB) +$this->maxTTFFilesize = 2000; + +// this value determines whether to subset or not +// 0 - 100 = percent characters +// i.e. if ==40, mPDF will embed whole font if >40% characters in that font +// or embed subset if <40% characters +// 0 will force whole file to be embedded (NO subsetting) +// 100 will force always to subset +// This value is overridden if you set new mPDF('s) +// and/or Can set at runtime +$this->percentSubset = 30; + +$this->useAdobeCJK = false; // Uses Adobe CJK fonts for CJK languages + // default TRUE; only set false if you have defined some available fonts that support CJK + // If true this will not stop use of other CJK fonts if specified by font-family: + // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() + +// When embedding full TTF font files, remakes the font file using only core tables +// May improve function with some PostScript printers (GhostScript/GSView) +// Does not work with TTC font collections +// Slightly smaller file; increased processing time +$this->repackageTTF = false; + +// Allows automatic character set conversion if "charset=xxx" detected in html header (WriteHTML() ) +$this->allow_charset_conversion = true; +$this->biDirectional=false; // automatically determine BIDI text in LTR page +$this->autoFontGroupSize = 2; // 1: individual words are spanned; 2: words+; 3: as big chunks as possible. +$this->useLang = true; // Default changed in mPDF 4.0 + +$this->useSubstitutions = false; // Substitute missing characters in UTF-8(multibyte) documents - from other fonts +$this->falseBoldWeight = 5; // Weight for bold text when using an artificial (outline) bold; value 0 (off) - 10 (rec. max) + +// CONFIGURATION +$this->allow_output_buffering = false; + +$this->enableImports = false; // Adding mPDFI functions + +$this->collapseBlockMargins = true; // Allows top and bottom margins to collapse between block elements +$this->progressBar = 0; // Shows progress-bars whilst generating file 0 off, 1 simple, 2 advanced +$this->progbar_heading = 'mPDF file progress'; +$this->progbar_altHTML = ''; // Should include and but NOT end tags + // Can incude and link to stylesheet etc. + // e.g. '

Creating PDF file. Please wait...

'; + +$this->dpi = 96; // To interpret "px" pixel values in HTML/CSS (see img_dpi below) + +// Automatically correct for tags where HTML specifies optional end tags e.g. P,LI,DD,TD +// If you are confident input html is valid XHTML, turning this off may make it more reliable(?) +$this->allow_html_optional_endtags = true; + +$this->ignore_invalid_utf8 = false; +$this->text_input_as_HTML = false; // Converts all entities in Text inputs to UTF-8 before encoding +$this->useGraphs = false; + + +// When writing a block element with position:fixed and overflow:auto, mPDF scales it down to fit in the space +// by repeatedly rewriting it and making adjustments. These values give the adjustments used, depending how far out +// the previous guess was. The lower the number, the quicker it will finish, but the less accurate the fit may be. +// FPR1 is for coarse adjustments, and FPR4 for fine adjustments when it is getting closer. +$this->incrementFPR1 = 10; // i.e. will alter by 1/[10]th of width and try again until within closer limits +$this->incrementFPR2 = 20; +$this->incrementFPR3 = 30; +$this->incrementFPR4 = 50; // i.e. will alter by 1/[50]th of width and try again when it nearly fits + + +// COLORSPACE +// 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] +// 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] +// 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] +$this->restrictColorSpace = 0; + +// PDFX/1-a Compliant files +$this->PDFX = false; // true=Forces compliance with PDFX-1a spec + // Cannot be used with $this->restrictColorSpace (i.e. no RGB) +$this->PDFXauto = false; // Overrides warnings making changes when possible to force PDFX1-a compliance + + +// PDFA1-b Compliant files +$this->PDFA = false; // true=Forces compliance with PDFA-1b spec + // Can use with $this->restrictColorSpace=3 (for a CMYK file) + // Any other settings, uses RGB profile +$this->PDFAauto = false; // Overrides warnings making changes when possible to force PDFA1-b compliance +$this->ICCProfile = ''; // Colour profile OutputIntent + // sRGB_IEC61966-2-1 (=default if blank and PDFA), or other added .icc profile + // Must be CMYK for PDFX, or appropriate type for PDFA(RGB or CMYK) + + + +// DEBUGGING & DEVELOPERS +$this->showStats = false; +$this->debug = false; +$this->debugfonts = false; // Checks and reports on errors when parsing TTF files - adds significantly to processing time +$this->showImageErrors = false; +$this->table_error_report = false; // Die and report error if table is too wide to contain whole words +$this->table_error_report_param = ''; // Parameter which can be passed to show in error report i.e. chapter number being processed// + + +// ANNOTATIONS +$this->title2annots = false; +$this->annotSize = 0.5; // default mm for Adobe annotations - nominal +$this->annotMargin; // default position for Annotations +$this->annotOpacity = 0.5; // default opacity for Annotations + +// BOOKMARKS +$this->anchor2Bookmark = 0; // makes into a bookmark as well as internal link target; 1 = just name; 2 = name (p.34) +// Set an optional array to specify appearance of Bookmarks (by level) +// Default values are Black and normal style +/* + Example: +$this->bookmarkStyles = array( + 0 => array('color'=> array(0,64,128), 'style'=>'B'), + 1 => array('color'=> array(128,0,0), 'style'=>''), + 2 => array('color'=> array(0,128,0), 'style'=>'I'), +); +*/ +$this->bookmarkStyles = array(); + + +// CSS & STYLES +$this->CSSselectMedia='print'; // screen, print, or any other CSS @media type (not "all") + + +// PAGE HEADERS & FOOTERS +$this->forcePortraitHeaders = false; +// Values used if simple FOOTER/HEADER given i.e. not array +$this->defaultheaderfontsize = 8; // pt +$this->defaultheaderfontstyle = 'BI'; // '', or 'B' or 'I' or 'BI' +$this->defaultheaderline = 1; // 1 or 0 - line under the header +$this->defaultfooterfontsize = 8; // pt +$this->defaultfooterfontstyle = 'BI'; // '', or 'B' or 'I' or 'BI' +$this->defaultfooterline = 1; // 1 or 0 - line over the footer +$this->header_line_spacing = 0.25; // spacing between bottom of header and line (if present) - function of fontsize +$this->footer_line_spacing = 0.25; // spacing between bottom of header and line (if present) - function of fontsize +// If 'pad' margin-top sets fixed distance in mm (padding) between bottom of header and top of text. +// If 'stretch' margin-top sets a minimum distance in mm between top of page and top of text, which expands if header is too large to fit. +$this->setAutoTopMargin = false; +$this->setAutoBottomMargin = false; +$this->autoMarginPadding = 2; // distance in mm used as padding if 'stretch' mode is used + + + +// TABLES +$this->simpleTables = false; // Forces all cells to have same border, background etc. Improves performance +$this->packTableData = false; // Reduce memory usage processing tables (but with increased processing time) +// Using disk to cache table data can reduce memory usage dramatically, but at a cost of increased +// executon time and disk access (read and write) +$this->cacheTables = false; + +$this->ignore_table_percents = false; +$this->ignore_table_widths = false; +$this->keep_table_proportions = false; // If table width set > page width, force resizing but keep relative sizes + // Also forces respect of cell widths set by % +$this->shrink_tables_to_fit = 1.4; // automatically reduce fontsize in table if words would have to split ( not in CJK) + // 0 or false to disable; value (if set) gives maximum factor to reduce fontsize + +$this->tableMinSizePriority = false; // If page-break-inside:avoid but cannot fit on full page without + // exceeding autosize; setting this value to true will force respsect for + // autosize, and disable the page-break-inside:avoid + +$this->use_kwt = false; // "Keep-with-table" +$this->iterationCounter = false; // Set to TRUE to use table Head iteration counter +$this->splitTableBorderWidth = 0; // Use table border (using this width in mm) when table breaks across pages + // Recommended to use small value e.g. 0.01 + + +// IMAGES +$this->img_dpi = 96; // Default dpi to output images if size not defined + // See also above "dpi" + +// TEXT SPACING & JUSTIFICATION +$this->useKerning = false; // true to use kerning +$this->justifyB4br = false; // In justified text,
does not cause the preceding text to be justified in browsers + // Change to true to force justification (as in MS Word) + +$this->tabSpaces = 8; // Number of spaces to replace for a TAB in
 sections
+				// Notepad uses 6, HTML specification recommends 8
+$this->jSWord = 0.4;	// Proportion (/1) of space (when justifying margins) to allocate to Word vs. Character
+$this->jSmaxChar = 2;	// Maximum spacing to allocate to character spacing. (0 = no maximum)
+
+$this->jSmaxCharLast = 1;	// Maximum character spacing allowed (carried over) when finishing a last line
+$this->jSmaxWordLast = 2;	// Maximum word spacing allowed (carried over) when finishing a last line
+$this->normalLineheight = 1.33;	// Value used for line-height when CSS specified as 'normal' (default)
+
+// Small Caps
+$this->smCapsScale = 0.75;	// Factor of 1 to scale capital letters
+$this->smCapsStretch = 110;	// % to stretch small caps horizontally (i.e. 100 = no stretch)
+
+// CJK Line-breaking
+$this->allowCJKorphans = true;	// FALSE=always wrap to next line; TRUE=squeeze or overflow
+$this->allowCJKoverflow = false;	// FALSE=squeeze; TRUE=overflow (only some characters, and disabled in tables)
+$this->CJKforceend = false;		// Forces overflowng punctuation to hang outside right margin mPDF 5.6.40
+
+// HYPHENATION
+$this->SHYlang = "en"; // Should be one of: 'en','de','es','fi','fr','it','nl','pl','ru','sv'
+$this->SHYleftmin = 2;
+$this->SHYrightmin = 2;
+$this->SHYcharmin = 2;
+$this->SHYcharmax = 10;
+
+// COLUMNS
+$this->keepColumns = false;	// Set to go to the second column only when the first is full of text etc.
+$this->max_colH_correction = 1.15;	// Maximum ratio to adjust column height when justifying - too large a value can give ugly results
+$this->ColGap=5;
+
+
+// LISTS
+$this->list_align_style = 'R';	// Determines alignment of numbers in numbered lists
+$this->list_indent_first_level = 0;	// 1/0 yex/no to indent first level of list
+$this->list_number_suffix = '.';	// Content to follow a numbered list marker e.g. '.' gives 1. or IV.; ')' gives 1) or a)
+
+// ACTIVE FORMS
+$this->useActiveForms = false;
+
+// WATERMARKS
+$this->watermarkImgBehind = false;
+$this->showWatermarkText = 0;
+$this->showWatermarkImage = 0;
+$this->watermarkText = '';
+$this->watermarkImage = '';
+$this->watermark_font = '';
+$this->watermarkTextAlpha = 0.2;
+$this->watermarkImageAlpha = 0.2;
+$this->watermarkImgAlphaBlend = 'Normal';
+	// Accepts any PDF spec. value: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, 
+	// HardLight, SoftLight, Difference, Exclusion
+	// "Multiply" works well for watermark image on top
+
+// BORDERS
+$this->autoPadding = false; // Automatically increases padding in block elements when border-radius set - if required
+
+
+//////////////////////////////////////////////
+
+// Default values if no style sheet offered	(cf. http://www.w3.org/TR/CSS21/sample.html)
+$this->defaultCSS = array(
+	'BODY' => array(
+		'FONT-FAMILY' => 'serif',
+		'FONT-SIZE' => '11pt',
+		'TEXT-INDENT' => '0pt',
+		'LINE-HEIGHT' => 'normal',
+		'MARGIN-COLLAPSE' => 'collapse', /* Custom property to collapse top/bottom margins at top/bottom of page - ignored in tables/lists */
+		'HYPHENS' => 'manual',	/* mPDF 5.6.08 */
+	),
+	'P' => array(
+		'MARGIN' => '1.12em 0',
+	),
+	'H1' => array(
+		'FONT-SIZE' => '2em',
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '0.67em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'H2' => array(
+		'FONT-SIZE' => '1.5em',
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '0.75em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'H3' => array(
+		'FONT-SIZE' => '1.17em',
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '0.83em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'H4' => array(
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '1.12em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'H5' => array(
+		'FONT-SIZE' => '0.83em',
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '1.5em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'H6' => array(
+		'FONT-SIZE' => '0.75em',
+		'FONT-WEIGHT' => 'bold',
+		'MARGIN' => '1.67em 0',
+		'PAGE-BREAK-AFTER' => 'avoid',
+	),
+	'HR' => array(
+		'COLOR' => '#888888',
+		'TEXT-ALIGN' => 'center',
+		'WIDTH' => '100%',
+		'HEIGHT' => '0.2mm',
+		'MARGIN-TOP' => '0.83em',
+		'MARGIN-BOTTOM' => '0.83em',
+	),
+	'PRE' => array(
+		'MARGIN' => '0.83em 0',
+		'FONT-FAMILY' => 'monospace',
+	),
+	'S' => array(
+		'TEXT-DECORATION' => 'line-through',
+	),
+	'STRIKE' => array(
+		'TEXT-DECORATION' => 'line-through',
+	),
+	'DEL' => array(
+		'TEXT-DECORATION' => 'line-through',
+	),
+	'SUB' => array(
+		'VERTICAL-ALIGN' => 'sub',
+		'FONT-SIZE' => '55%',	/* Recommended 0.83em */
+	),
+	'SUP' => array(
+		'VERTICAL-ALIGN' => 'super',
+		'FONT-SIZE' => '55%',	/* Recommended 0.83em */
+	),
+	'U' => array(
+		'TEXT-DECORATION' => 'underline',
+	),
+	'INS' => array(
+		'TEXT-DECORATION' => 'underline',
+	),
+	'B' => array(
+		'FONT-WEIGHT' => 'bold',
+	),
+	'STRONG' => array(
+		'FONT-WEIGHT' => 'bold',
+	),
+	'I' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'CITE' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'Q' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'EM' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'VAR' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'SAMP' => array(
+		'FONT-FAMILY' => 'monospace',
+	),
+	'CODE' => array(
+		'FONT-FAMILY' => 'monospace',
+	),
+	'KBD' => array(
+		'FONT-FAMILY' => 'monospace',
+	),
+	'TT' => array(
+		'FONT-FAMILY' => 'monospace',
+	),
+	'SMALL' => array(
+		'FONT-SIZE' => '83%',
+	),
+	'BIG' => array(
+		'FONT-SIZE' => '117%',
+	),
+	'ACRONYM' => array(
+		'FONT-SIZE' => '77%',
+		'FONT-WEIGHT' => 'bold',
+	),
+	'ADDRESS' => array(
+		'FONT-STYLE' => 'italic',
+	),
+	'BLOCKQUOTE' => array(
+		'MARGIN-LEFT' => '40px',
+		'MARGIN-RIGHT' => '40px',
+		'MARGIN-TOP' => '1.12em',
+		'MARGIN-BOTTOM' => '1.12em',
+	),
+	'A' => array(
+		'COLOR' => '#0000FF',
+		'TEXT-DECORATION' => 'underline',
+	),
+	'UL' => array(
+		'MARGIN' => '0.83em 0',		/* only applied to top-level of nested lists */
+		'TEXT-INDENT' => '1.3em',	/* Custom effect - list indent */
+	),
+	'OL' => array(
+		'MARGIN' => '0.83em 0',		/* only applied to top-level of nested lists */
+		'TEXT-INDENT' => '1.3em',	/* Custom effect - list indent */
+	),
+	'DL' => array(
+		'MARGIN' => '1.67em 0',
+	),
+	'DT' => array(
+	),
+	'DD' => array(
+		'PADDING-LEFT' => '40px',
+	),
+	'TABLE' => array(
+		'MARGIN' => '0',
+		'BORDER-COLLAPSE' => 'separate',
+		'BORDER-SPACING' => '2px',
+		'EMPTY-CELLS' => 'show',
+		'LINE-HEIGHT' => '1.2',
+		'VERTICAL-ALIGN' => 'middle',
+	),
+	'THEAD' => array(
+	),
+	'TFOOT' => array(
+	),
+	'TH' => array(
+		'FONT-WEIGHT' => 'bold',
+		'TEXT-ALIGN' => 'center',
+		'PADDING-LEFT' => '0.1em',
+		'PADDING-RIGHT' => '0.1em',
+		'PADDING-TOP' => '0.1em',
+		'PADDING-BOTTOM' => '0.1em',
+	),
+	'TD' => array(
+		'PADDING-LEFT' => '0.1em',
+		'PADDING-RIGHT' => '0.1em',
+		'PADDING-TOP' => '0.1em',
+		'PADDING-BOTTOM' => '0.1em',
+	),
+	'CAPTION' => array(
+		'TEXT-ALIGN' => 'center',
+	),
+	'IMG' => array(
+		'MARGIN' => '0',
+		'VERTICAL-ALIGN' => 'baseline',
+	),
+	'INPUT' => array(
+		'FONT-FAMILY' => 'sans-serif',
+		'VERTICAL-ALIGN' => 'middle',
+		'FONT-SIZE' => '0.9em',
+	),
+	'SELECT' => array(
+		'FONT-FAMILY' => 'sans-serif',
+		'FONT-SIZE' => '0.9em',
+		'VERTICAL-ALIGN' => 'middle',
+	),
+	'TEXTAREA' => array(
+		'FONT-FAMILY' => 'monospace',
+		'FONT-SIZE' => '0.9em',
+		'VERTICAL-ALIGN' => 'text-bottom',
+	),
+	'MARK' => array(	/* mPDF 5.5.09 */
+		'BACKGROUND-COLOR' => 'yellow',
+	),
+);
+
+
+//////////////////////////////////////////////////
+// VALUES ONLY LIKELY TO BE CHANGED BY DEVELOPERS
+//////////////////////////////////////////////////
+$this->pdf_version = '1.4';
+
+// Hyphenation
+$this->SHYlanguages = array('en','de','es','fi','fr','it','nl','pl','ru','sv');	// existing defined patterns
+
+$this->default_lineheight_correction=1.2;	// Value 1 sets lineheight=fontsize height; 
+							// Value used if line-height not set by CSS (usuallly is)
+
+$this->fontsizes = array('XX-SMALL'=>0.7, 'X-SMALL'=>0.77, 'SMALL'=>0.86, 'MEDIUM'=>1, 'LARGE'=>1.2, 'X-LARGE'=>1.5, 'XX-LARGE'=>2);
+
+// CHARACTER PATTERN MATCHES TO DETECT LANGUAGES
+	// pattern used to detect RTL characters -> force RTL
+	$this->pregRTLchars = "\x{0590}-\x{06FF}\x{0700}-\x{083E}\x{FB00}-\x{FDFD}\x{FE70}-\x{FEFF}";	
+
+	// CJK Chars which require changing and are distinctive of specific charset
+	$this->pregUHCchars = "\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}";
+	$this->pregSJISchars = "\x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{3190}-\x{319F}\x{31F0}-\x{31FF}";	
+
+	// Chars which distinguish CJK but not between different
+	$this->pregCJKchars = "\x{1100}-\x{11FF}\x{2E80}-\x{A4CF}\x{A800}-\x{D7AF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE6F}\x{FF00}-\x{FFEF}\x{20000}-\x{2FA1F}";
+
+	// For CJK Line-breaking
+	//Leading characters - Not allowed at end of line
+	$this->CJKleading = "\$\(\*\[\{\x{00a3}\x{00a5}\x{00ab}\x{00b7}\x{2018}\x{201c}\x{2035}\x{3005}\x{3007}\x{3008}\x{300a}\x{300c}\x{300e}\x{3010}\x{3014}\x{3016}\x{3018}\x{301d}\x{fe34}\x{fe57}\x{fe59}\x{fe5b}\x{ff04}\x{ff08}\x{ff0e}\x{ff3b}\x{ff5b}\x{ff5f}\x{ffe1}\x{ffe5}\x{ffe6}";
+	// Following characters - Not allowed at start
+	$this->CJKfollowing = "!%\),\.:;>\?\]\}\x{00a2}\x{00a8}\x{00b0}\x{00b7}\x{00bb}\x{02c7}\x{02c9}\x{2010}\x{2013}-\x{2016}\x{2019}\x{201d}-\x{201f}\x{2020}-\x{2022}\x{2025}\x{2027}\x{203a}\x{203c}\x{2047}-\x{2049}\x{2103}\x{2236}\x{2574}\x{3001}-\x{3003}\x{3005}\x{3006}\x{3009}\x{300b}\x{300d}\x{300f}\x{3011}\x{3015}\x{3017}\x{3019}\x{301c}\x{301e}\x{301f}\x{303b}\x{3041}\x{3043}\x{3045}\x{3047}\x{3049}\x{3063}\x{3083}\x{3085}\x{3087}\x{308e}\x{3095}\x{3096}\x{30a0}\x{30a1}\x{30a3}\x{30a5}\x{30a7}\x{30a9}\x{30c3}\x{30e3}\x{30e5}\x{30e7}\x{30ee}\x{30f5}\x{30f6}\x{30fb}-\x{30fe}\x{31f0}-\x{31ff}\x{fe30}-\x{fe33}\x{fe50}-\x{fe56}\x{fe58}\x{fe5a}\x{fe5c}\x{ff01}\x{ff02}\x{ff05}\x{ff07}\x{ff09}\x{ff0c}\x{ff0e}\x{ff1a}\x{ff1b}\x{ff1f}\x{ff3d}\x{ff40}\x{ff5c}-\x{ff5e}\x{ff60}\x{ff64}";
+	// Characters which are allowed to overflow the right margin
+	$this->CJKoverflow = "\.,\x{ff61}\x{ff64}\x{3001}\x{3002}\x{ff0c}\x{ff0e}";
+
+
+
+	// ASCII Chars which shouldn't break string
+	// Use for very specific words
+	$this->pregASCIIchars1 = "\x{0021}-\x{002E}\x{0030}-\x{003B}?";	// no [SPACE]
+	// Use for words+
+	$this->pregASCIIchars2 = "\x{0020}-\x{002E}\x{0030}-\x{003B}?";	// [SPACE] punctuation and 0-9
+	// Use for chunks > words
+	$this->pregASCIIchars3 = "\x{0000}-\x{002E}\x{0030}-\x{003B}\x{003F}-\x{007E}";	// all except <>
+	// Vietnamese - specific
+	$this->pregVIETchars = "\x{01A0}\x{01A1}\x{01AF}\x{01B0}\x{1EA0}-\x{1EF1}";	
+	// Vietnamese -  Chars which shouldn't break string 
+	$this->pregVIETPluschars = "\x{0000}-\x{003B}\x{003F}-\x{00FF}\x{0300}-\x{036F}\x{0102}\x{0103}\x{0110}\x{0111}\x{0128}\x{0129}\x{0168}\x{0169}\x{1EF1}-\x{1EF9}";	// omits < >
+
+	// Arabic
+	$this->pregARABICchars = "\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{FB50}-\x{FDFD}\x{FE70}-\x{FEFF}";
+	// Characters of Urdu, Pashto, Sindhi (but NOT arabic or persian/farsi) [not covered by DejavuSans font]
+	$this->pregNonARABICchars = "\x{0671}-\x{067D}\x{067F}-\x{0685}\x{0687}-\x{0697}\x{0699}-\x{06A8}\x{06AA}-\x{06AE}\x{06B0}-\x{06CB}\x{06CD}-\x{06D3}";
+
+	$this->pregHEBchars = "\x{0590}-\x{05FF}\x{FB00}-\x{FB49}";	// Hebrew
+
+	// INDIC
+	$this->pregHIchars = "\x{0900}-\x{0963}\x{0966}-\x{097F}";	// Devanagari (Hindi) minus the common indic punctuation 0964,0965
+	$this->pregBNchars = "\x{0980}-\x{09FF}";	// Bengali 
+	$this->pregPAchars = "\x{0A00}-\x{0A7F}";	// Gurmukhi (Punjabi)
+	$this->pregGUchars = "\x{0A80}-\x{0AFF}";	// Gujarati
+	$this->pregORchars = "\x{0B00}-\x{0B7F}";	// Oriya 
+	$this->pregTAchars = "\x{0B80}-\x{0BFF}";	// Tamil 
+	$this->pregTEchars = "\x{0C00}-\x{0C7F}";	// Telugu 
+	$this->pregKNchars = "\x{0C80}-\x{0CFF}";	// Kannada 
+	$this->pregMLchars = "\x{0D00}-\x{0D7F}";	// Malayalam 
+	$this->pregSHchars = "\x{0D80}-\x{0DFF}";	// Sinhala 
+
+	$this->pregINDextra = "\x{200B}-\x{200D}\x{0964}\x{0965}\x{0020}-\x{0022}\x{0024}-\x{002E}\x{003A}-\x{003F}\x{005B}-\x{0060}\x{007B}-\x{007E}\x{00A0}";
+	// 200B-D=Zero-width joiners; 0964,0965=Generic Indic punctuation; NBSP & general punctuation (excludes # and / so can use in autoFont() )
+
+$this->allowedCSStags = 'DIV|P|H1|H2|H3|H4|H5|H6|FORM|IMG|A|BODY|TABLE|HR|THEAD|TFOOT|TBODY|TH|TR|TD|UL|OL|LI|PRE|BLOCKQUOTE|ADDRESS|DL|DT|DD';
+$this->allowedCSStags .= '|ARTICLE|ASIDE|FIGURE|FIGCAPTION|FOOTER|HEADER|HGROUP|NAV|SECTION|MARK|DETAILS|SUMMARY|METER|PROGRESS|TIME'; // mPDF 5.5.09
+$this->allowedCSStags .= '|SPAN|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|STRIKE|S|U|DEL|INS|Q|FONT';
+$this->allowedCSStags .= '|SELECT|INPUT|TEXTAREA|CAPTION|FIELDSET|LEGEND';	// mPDF 5.4.18
+$this->allowedCSStags .= '|TEXTCIRCLE|DOTTAB';	// mPDF 5.5.23	// mPDF 5.6.33
+
+$this->outerblocktags = array('DIV','FORM','CENTER','DL','FIELDSET','ARTICLE','ASIDE','FIGURE','FIGCAPTION', 'FOOTER','HEADER','HGROUP','NAV','SECTION','DETAILS','SUMMARY');	// mPDF 5.5.09 // mPDF 5.5.22
+$this->innerblocktags = array('P','BLOCKQUOTE','ADDRESS','PRE','H1','H2','H3','H4','H5','H6','DT','DD','CAPTION');
+
+
+
+?>
\ No newline at end of file
diff --git a/config_cp.php b/config_cp.php
new file mode 100644
index 0000000..e2e21f4
--- /dev/null
+++ b/config_cp.php
@@ -0,0 +1,153 @@
+
\ No newline at end of file
diff --git a/config_fonts.php b/config_fonts.php
new file mode 100644
index 0000000..7cb990a
--- /dev/null
+++ b/config_fonts.php
@@ -0,0 +1,304 @@
+fontdata) to use for missing characters
+// when using useSubstitutions. Use a font with wide coverage - dejavusanscondensed is a good start
+// only works using subsets (otherwise would add very large file)
+// doesn't do Indic or arabic
+// More than 1 font can be specified but each will add to the processing time of the script
+
+$this->backupSubsFont = array('dejavusanscondensed');
+
+
+// Optionally set a font (name as defined below in $this->fontdata) to use for CJK characters
+// in Plane 2 Unicode (> U+20000) when using useSubstitutions. 
+// Use a font like hannomb or sun-extb if available
+// only works using subsets (otherwise would add very large file)
+// Leave undefined or blank if not not required
+
+// $this->backupSIPFont = 'sun-extb';
+
+
+/*
+This array defines translations from font-family in CSS or HTML
+to the internal font-family name used in mPDF. 
+Can include as many as want, regardless of which fonts are installed.
+By default mPDF will take a CSS/HTML font-family and remove spaces
+and change to lowercase e.g. "Arial Unicode MS" will be recognised as
+"arialunicodems"
+You only need to define additional translations.
+You can also use it to define specific substitutions e.g.
+'frutiger55roman' => 'arial'
+Generic substitutions (i.e. to a sans-serif or serif font) are set 
+by including the font-family in $this->sans_fonts below
+To aid backwards compatability some are included:
+*/
+$this->fonttrans = array(
+	'helvetica' => 'arial',
+	'times' => 'timesnewroman',
+	'courier' => 'couriernew',
+	'trebuchet' => 'trebuchetms',
+	'comic' => 'comicsansms',
+	'franklin' => 'franklingothicbook',
+	'albertus' => 'albertusmedium',
+	'arialuni' => 'arialunicodems',
+	'zn_hannom_a' => 'hannoma',
+	'ocr-b' => 'ocrb',
+	'ocr-b10bt' => 'ocrb',
+
+
+);
+
+/*
+This array lists the file names of the TrueType .ttf or .otf font files
+for each variant of the (internal mPDF) font-family name.
+['R'] = Regular (Normal), others are Bold, Italic, and Bold-Italic
+Each entry must contain an ['R'] entry, but others are optional.
+Only the font (files) entered here will be available to use in mPDF.
+Put preferred default first in order.
+This will be used if a named font cannot be found in any of 
+$this->sans_fonts, $this->serif_fonts or $this->mono_fonts
+
+['indic'] = true; for special mPDF fonts containing Indic characters
+['sip-ext'] = 'hannomb'; name a related font file containing SIP characters
+
+If a .ttc TrueType collection file is referenced, the number of the font
+within the collection is required. Fonts in the collection are numbered 
+starting at 1, as they appear in the .ttc file e.g.
+	"cambria" => array(
+		'R' => "cambria.ttc",
+		'B' => "cambriab.ttf",
+		'I' => "cambriai.ttf",
+		'BI' => "cambriaz.ttf",
+		'TTCfontID' => array(
+			'R' => 1,	
+			),
+		),
+	"cambriamath" => array(
+		'R' => "cambria.ttc",
+		'TTCfontID' => array(
+			'R' => 2,	
+			),
+		),
+*/
+
+$this->fontdata = array(
+	"dejavusanscondensed" => array(
+		'R' => "DejaVuSansCondensed.ttf",
+		'B' => "DejaVuSansCondensed-Bold.ttf",
+		'I' => "DejaVuSansCondensed-Oblique.ttf",
+		'BI' => "DejaVuSansCondensed-BoldOblique.ttf",
+		),
+	"dejavusans" => array(
+		'R' => "DejaVuSans.ttf",
+		'B' => "DejaVuSans-Bold.ttf",
+		'I' => "DejaVuSans-Oblique.ttf",
+		'BI' => "DejaVuSans-BoldOblique.ttf",
+		),
+	"dejavuserif" => array(
+		'R' => "DejaVuSerif.ttf",
+		'B' => "DejaVuSerif-Bold.ttf",
+		'I' => "DejaVuSerif-Italic.ttf",
+		'BI' => "DejaVuSerif-BoldItalic.ttf",
+		),
+	"dejavuserifcondensed" => array(
+		'R' => "DejaVuSerifCondensed.ttf",
+		'B' => "DejaVuSerifCondensed-Bold.ttf",
+		'I' => "DejaVuSerifCondensed-Italic.ttf",
+		'BI' => "DejaVuSerifCondensed-BoldItalic.ttf",
+		),
+	"dejavusansmono" => array(
+		'R' => "DejaVuSansMono.ttf",
+		'B' => "DejaVuSansMono-Bold.ttf",
+		'I' => "DejaVuSansMono-Oblique.ttf",
+		'BI' => "DejaVuSansMono-BoldOblique.ttf",
+		),
+
+
+/* OCR-B font for Barcodes */
+	"ocrb" => array(
+		'R' => "ocrb10.ttf",
+		),
+
+/* Thai fonts */
+	"garuda" => array(
+		'R' => "Garuda.ttf",
+		'B' => "Garuda-Bold.ttf",
+		'I' => "Garuda-Oblique.ttf",
+		'BI' => "Garuda-BoldOblique.ttf",
+		),
+	"norasi" => array(
+		'R' => "Norasi.ttf",
+		'B' => "Norasi-Bold.ttf",
+		'I' => "Norasi-Oblique.ttf",
+		'BI' => "Norasi-BoldOblique.ttf",
+		),
+
+
+/* Indic fonts */
+	"ind_bn_1_001" => array(
+		'R' => "ind_bn_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_hi_1_001" => array(
+		'R' => "ind_hi_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_ml_1_001" => array(
+		'R' => "ind_ml_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_kn_1_001" => array(
+		'R' => "ind_kn_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_gu_1_001" => array(
+		'R' => "ind_gu_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_or_1_001" => array(
+		'R' => "ind_or_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_ta_1_001" => array(
+		'R' => "ind_ta_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_te_1_001" => array(
+		'R' => "ind_te_1_001.ttf",
+		'indic' => true,
+		),
+	"ind_pa_1_001" => array(
+		'R' => "ind_pa_1_001.ttf",
+		'indic' => true,
+		),
+
+
+/* XW Zar Arabic fonts */
+	"xbriyaz" => array(
+		'R' => "XB Riyaz.ttf",
+		'B' => "XB RiyazBd.ttf",
+		'I' => "XB RiyazIt.ttf",
+		'BI' => "XB RiyazBdIt.ttf",
+		'unAGlyphs' => true,
+		),
+	"xbzar" => array(
+		'R' => "XB Zar.ttf",
+		'B' => "XB Zar Bd.ttf",
+		'I' => "XB Zar It.ttf",
+		'BI' => "XB Zar BdIt.ttf",
+		'unAGlyphs' => true,
+		),
+
+
+
+
+/* Examples of some CJK fonts */
+/*
+	"unbatang_0613" => array(
+		'R' => "UnBatang_0613.ttf",
+		),
+	"sun-exta" => array(
+		'R' => "Sun-ExtA.ttf",
+		'sip-ext' => 'sun-extb',
+		),
+	"sun-extb" => array(
+		'R' => "Sun-ExtB.ttf",
+		),
+	"hannoma" => array(
+		'R' => "HAN NOM A.ttf",
+		'sip-ext' => 'hannomb',	
+		),
+	"hannomb" => array(
+		'R' => "HAN NOM B.ttf",
+		),
+
+
+	'mingliu' => array (
+		'R' => 'mingliu.ttc',
+		'TTCfontID' => array (
+			'R' => 1,
+		),
+		'sip-ext' => 'mingliu-extb',
+	),
+	'pmingliu' => array (
+		'R' => 'mingliu.ttc',
+		'TTCfontID' => array (
+			'R' => 2,
+		),
+		'sip-ext' => 'pmingliu-extb',
+	),
+	'mingliu_hkscs' => array (
+		'R' => 'mingliu.ttc',
+		'TTCfontID' => array (
+			'R' => 3,
+		),
+		'sip-ext' => 'mingliu_hkscs-extb',
+	),
+	'mingliu-extb' => array (
+		'R' => 'mingliub.ttc',
+		'TTCfontID' => array (
+			'R' => 1,
+		),
+	),
+	'pmingliu-extb' => array (
+		'R' => 'mingliub.ttc',
+		'TTCfontID' => array (
+			'R' => 2,
+		),
+	),
+	'mingliu_hkscs-extb' => array (
+		'R' => 'mingliub.ttc',
+		'TTCfontID' => array (
+			'R' => 3,
+		),
+	),
+*/
+
+);
+
+
+// Add fonts to this array if they contain characters in the SIP or SMP Unicode planes
+// but you do not require them. This allows a more efficient form of subsetting to be used.
+$this->BMPonly = array(
+	"dejavusanscondensed",
+	"dejavusans",
+	"dejavuserifcondensed",
+	"dejavuserif",
+	"dejavusansmono",
+	);
+
+// These next 3 arrays do two things:
+// 1. If a font referred to in HTML/CSS is not available to mPDF, these arrays will determine whether
+//    a serif/sans-serif or monospace font is substituted
+// 2. The first font in each array will be the font which is substituted in circumstances as above
+//     (Otherwise the order is irrelevant)
+// Use the mPDF font-family names i.e. lowercase and no spaces (after any translations in $fonttrans)
+// Always include "sans-serif", "serif" and "monospace" etc.
+$this->sans_fonts = array('dejavusanscondensed','dejavusans','freesans','liberationsans','sans','sans-serif','cursive','fantasy', 
+				'arial','helvetica','verdana','geneva','lucida','arialnarrow','arialblack','arialunicodems',
+				'franklin','franklingothicbook','tahoma','garuda','calibri','trebuchet','lucidagrande','microsoftsansserif',
+				'trebuchetms','lucidasansunicode','franklingothicmedium','albertusmedium','xbriyaz','albasuper','quillscript'
+
+);
+
+$this->serif_fonts = array('dejavuserifcondensed','dejavuserif','freeserif','liberationserif','serif',
+				'timesnewroman','times','centuryschoolbookl','palatinolinotype','centurygothic',
+				'bookmanoldstyle','bookantiqua','cyberbit','cambria',
+				'norasi','charis','palatino','constantia','georgia','albertus','xbzar','algerian','garamond',
+);
+
+$this->mono_fonts = array('dejavusansmono','freemono','liberationmono','courier', 'mono','monospace','ocrb','ocr-b','lucidaconsole',
+				'couriernew','monotypecorsiva'
+);
+
+?>
\ No newline at end of file
diff --git a/css/lightbox.css b/css/lightbox.css
new file mode 100644
index 0000000..3b5f7aa
--- /dev/null
+++ b/css/lightbox.css
@@ -0,0 +1,27 @@
+#lightbox{	position: absolute;	left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
+#lightbox img{ width: auto; height: auto;}
+#lightbox a img{ border: none; }
+
+#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
+#imageContainer{ padding: 10px; }
+
+#loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
+#hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
+#imageContainer>#hoverNav{ left: 0;}
+#hoverNav a{ outline: none;}
+
+#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
+#prevLink { left: 0; float: left;}
+#nextLink { right: 0; float: right;}
+#prevLink:hover, #prevLink:visited:hover { background: url(../images/prevlabel.gif) left 15% no-repeat; }
+#nextLink:hover, #nextLink:visited:hover { background: url(../images/nextlabel.gif) right 15% no-repeat; }
+
+#imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100%	; }
+
+#imageData{	padding:0 10px; color: #666; }
+#imageData #imageDetails{ width: 70%; float: left; text-align: left; }	
+#imageData #caption{ font-weight: bold;	}
+#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em;	}			
+#imageData #bottomNavClose{ width: 66px; float: right;  padding-bottom: 0.7em; outline: none;}	 	
+
+#overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }
diff --git a/dx.php b/dx.php
new file mode 100644
index 0000000..eea6086
--- /dev/null
+++ b/dx.php
@@ -0,0 +1,24 @@
+B Ł ˇ D !');
+
+/* ################################
+###################################
+####        USTAWIENIA     ########
+###################################
+################################*/
+
+
+$color1='#E5E5E5';
+$color2='#F3F3F3';
+
+
+
+
+
+?>
diff --git a/eksport_harmonogram.php b/eksport_harmonogram.php
new file mode 100644
index 0000000..0c85398
--- /dev/null
+++ b/eksport_harmonogram.php
@@ -0,0 +1,46 @@
+= '".$_POST['data1']."' and a.data_ham <= '".$_POST['data2']."'order by data_ham desc";                  
+
+$export = mysql_query($select); 
+$fields = mysql_num_fields($export); 
+
+
+
+for ($i = 0; $i < $fields; $i++) { 
+    $header .= mysql_field_name($export, $i) . "; "; 
+} 
+
+
+while($row = mysql_fetch_row($export)) { 
+    $line = ''; 
+    foreach($row as $value) {                                              
+        if ((!isset($value))) { 
+            $value = "\t"; 
+        } else { 
+            $value = str_replace('"', '', $value); 
+            $value = $value . '; '; 
+        } 
+        $line .= $value; 
+    } 
+    $data .= trim($line)."\n"; 
+} 
+$data = str_replace("\r","",$data); 
+
+if ($data == "") { 
+    $data = "\nNie określono daty!\n";                          
+} 
+
+
+header("Content-type: text/csv");   
+header("Content-disposition: attachment; filename=Harmonogram " . date("Y-m-d").".csv");   
+header("Pragma: no-cache");   
+
+print "$header\n$data"; 
+
+?> 
\ No newline at end of file
diff --git a/eksport_raport.php b/eksport_raport.php
new file mode 100644
index 0000000..df6994f
--- /dev/null
+++ b/eksport_raport.php
@@ -0,0 +1,60 @@
+= '".$_POST['data1']."'
+AND a.data <= '".$_POST['data2']."'
+ORDER BY a.data ASC";
+            
+$export = mysql_query($select); 
+$fields = mysql_num_fields($export); 
+
+
+
+for ($i = 0; $i < $fields; $i++) { 
+    $header .= mysql_field_name($export, $i) . "; "; 
+} 
+
+
+while($row = mysql_fetch_row($export)) { 
+    $line = ''; 
+    foreach($row as $value) {                                              
+        if ((!isset($value)) OR ($value == "")) { 
+            $value = "\t"; 
+        } else { 
+            $value = str_replace('"', '', $value); 
+            $value = $value . '; '; 
+        } 
+        $line .= $value; 
+    } 
+    $data .= trim($line)."\n"; 
+} 
+$data = str_replace("\r","",$data); 
+
+if ($data == "") { 
+    $data = "\nNie określono daty!\n";                          
+} 
+
+
+header("Content-type: text/csv");   
+header("Content-disposition: attachment; filename=PM " . date("Y-m-d").".csv");   
+header("Pragma: no-cache");   
+
+print "$header\n$data"; 
+
+?> 
\ No newline at end of file
diff --git a/eksport_raport_all.php b/eksport_raport_all.php
new file mode 100644
index 0000000..4343813
--- /dev/null
+++ b/eksport_raport_all.php
@@ -0,0 +1,59 @@
+ '16'
+and a.przystapiono='1'
+AND a.data >= '".$_POST['data1']."'
+AND a.data <= '".$_POST['data2']."'
+ORDER BY a.data ASC";
+            
+$export = mysql_query($select); 
+$fields = mysql_num_fields($export); 
+
+
+
+for ($i = 0; $i < $fields; $i++) { 
+    $header .= mysql_field_name($export, $i) . "; "; 
+} 
+
+
+while($row = mysql_fetch_row($export)) { 
+    $line = ''; 
+    foreach($row as $value) {                                              
+        if (!isset($value)) { 
+            $value = "\t"; 
+        } else { 
+            $value = str_replace('"', '', $value); 
+            $value = $value . '; '; 
+        } 
+        $line .= $value; 
+    } 
+    $data .= trim($line)."\n"; 
+} 
+$data = str_replace("\r","",$data); 
+
+if ($data == "") { 
+    $data = "\nNie określono daty!\n";                          
+} 
+
+
+header("Content-type: text/csv");   
+header("Content-disposition: attachment; filename=ALL " . date("Y-m-d").".csv");   
+header("Pragma: no-cache");   
+
+print "$header\n$data"; 
+
+?> 
\ No newline at end of file
diff --git a/eksport_raport_pm.php b/eksport_raport_pm.php
new file mode 100644
index 0000000..2cb347e
--- /dev/null
+++ b/eksport_raport_pm.php
@@ -0,0 +1,59 @@
+= '".$_POST['data1']."'
+AND a.data <= '".$_POST['data2']."'
+ORDER BY a.data ASC";
+            
+$export = mysql_query($select); 
+$fields = mysql_num_fields($export); 
+
+
+
+for ($i = 0; $i < $fields; $i++) { 
+    $header .= mysql_field_name($export, $i) . "; "; 
+} 
+
+
+while($row = mysql_fetch_row($export)) { 
+    $line = ''; 
+    foreach($row as $value) {                                              
+        if (!isset($value)) { 
+            $value = "\t"; 
+        } else { 
+            $value = str_replace('"', '', $value); 
+            $value = $value . '; '; 
+        } 
+        $line .= $value; 
+    } 
+    $data .= trim($line)."\n"; 
+} 
+$data = str_replace("\r","",$data); 
+
+if ($data == "") { 
+    $data = "\nNie określono daty!\n";                          
+} 
+
+
+header("Content-type: text/csv");   
+header("Content-disposition: attachment; filename=PM " . date("Y-m-d").".csv");   
+header("Pragma: no-cache");   
+
+print "$header\n$data"; 
+
+?> 
\ No newline at end of file
diff --git a/fpdf.php b/fpdf.php
new file mode 100644
index 0000000..5fbf585
--- /dev/null
+++ b/fpdf.php
@@ -0,0 +1,1647 @@
+_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('FPDF error: '.$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('<_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.='<_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('<_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('<>');
+		$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('<_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('<_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('<_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='<$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('<_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_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 <>';
+	//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/funkcje.php b/funkcje.php
new file mode 100644
index 0000000..beaf773
--- /dev/null
+++ b/funkcje.php
@@ -0,0 +1,544 @@
+
+0)
+
+        return true;
+
+        else
+
+        return false;
+
+
+
+}
+
+
+
+function uprawnienia($zmienna)
+
+{
+
+    $tab=explode('-',$zmienna);
+
+    if($tab[0]==1)
+
+       $upr['harmonogram']='TAK';
+
+    else
+
+       $upr['harmonogram']='NIE';
+
+	   if($tab[1]==1)
+
+       $upr['raporty']='TAK';
+
+    else
+
+       $upr['raporty']='NIE';
+
+    if($tab[2]==1)
+
+       $upr['zaliczki']='TAK';
+
+    else
+
+       $upr['zaliczki']='NIE';
+
+    if($tab[3]==1)
+
+       $upr['kilometry']='TAK';
+
+    else
+
+       $upr['kilometry']='NIE';
+
+    if($tab[4]==1)
+
+       $upr['tankowania']='TAK';
+
+    else
+
+       $upr['tankowania']='NIE';
+
+    if($tab[5]==1)
+
+       $upr['zestawienia']='TAK';
+
+    else
+
+       $upr['zestawienia']='NIE';
+
+    if($tab[6]==1)
+
+       $upr['samochod']='TAK';
+
+    else
+
+       $upr['samochod']='NIE';
+
+    if($tab[7]==1)
+
+       $upr['ustawienia']='TAK';
+
+    else
+
+       $upr['ustawienia']='NIE';
+
+    if($tab[8]==1)
+
+       $upr['konta']='TAK';
+
+    else
+
+       $upr['konta']='NIE';
+       
+       if($tab[9]==1)
+
+       $upr['vending']='TAK';
+
+    else
+
+       $upr['vending']='NIE';
+       
+       
+       if($tab[10]==1)
+
+       $upr['magazyn']='TAK';
+
+    else
+
+       $upr['magazyn']='NIE';
+
+    return $upr;
+
+}
+
+
+
+
+
+
+
+///////////////////////////////////////////////////
+
+function zmien_color($color)
+
+{
+
+    global $color1, $color2;
+
+    if($color==$color1)
+
+                       return $color2;
+
+    else
+
+                       return $color1;
+
+}
+
+function zaladuj_plik($upload_plik,$katalog,$rozszerzenia)
+
+{
+
+// funkcja pobiera parametry
+
+   // $upload plik - plik ktory ma zostac zapisany na serwerze
+
+   // $katalog - katalog do ktorego ma zostac zapisany plik
+
+   // $orzszerzenia - tablica w ktorej sa dostepne rozszerzenia dla pliku
+
+
+
+// funkcja zwraca tablice
+
+//  $tab['blad'] - jezeli wystapił blad przy zalafowaniu pliku bedzie go mozna stad odczytac
+
+// $tab['sciezka'] - sciezka do pliku gdzie został załadowany plik
+
+    $tab=false;
+
+    if (uploaded_file_logo($upload_plik['tmp_name']))
+
+                                 {
+
+
+
+                                        $plik=$upload_plik['tmp_name'];
+
+                                        $plik_nazwa=$upload_plik['name'];
+
+                                        $plik_type=$upload_plik['type'];
+
+                                        $plik_error=$upload_plik['error'];
+
+
+
+                                        if($plik_error>0)
+
+                                            {
+
+                                                  switch($plik_error)
+
+                                                         {
+
+                                                                     case 1:  $tab['blad']='Rozmiar pliku przekroczył wartosc ustawion± przez serwer!'; break;
+
+                                                                     case 2:  $tab['blad']='Rozmiar pliku przekroczył wartosc ustawion± w formularzu!'; break;
+
+                                                                     case 3:  $tab['blad']='Plik wysłany tylko częsciowo!'; break;
+
+                                                                     case 4:  $tab['blad']='Nie wysłano zadnego pliku!'; break;
+
+                                                         }//switch
+
+                                            }//if plik error
+
+                                        else
+
+                                            {
+
+                                                  $typ=substr($plik_nazwa,-3);
+
+                                                  foreach($rozszerzenia as $wartosci)
+
+                                                     {
+
+                                                         if($wartosci==$typ)
+
+                                                           {
+
+                                                               $poprawne_rozszerzenie=true;
+
+                                                               break;
+
+                                                           }
+
+                                                           else
+
+                                                             $poprawne_rozszerzenie=false;
+
+                                                     }
+
+                                                  if(!$poprawne_rozszerzenie)
+
+                                                    {
+
+                                                               $tab['blad']='Wybrany plik jest błędny. Jego format jest niepoprawny!';
+
+
+
+                                                    }
+
+                                                  else
+
+                                                      {
+
+                                                      $plik_nazwa=str_replace(' ','_',$plik_nazwa);
+
+                                                      // tworzenie sciezki do zapisania zdjecia czy loga
+
+                                                         $sciezka=$katalog.'/'.$plik_nazwa;
+
+
+
+
+
+                                                      $upload=@move_uploaded_file($plik,$sciezka);
+
+                                                             if($upload)
+
+                                                               $tab['udalo_sie']=true;
+
+                                                             else
+
+                                                               $tab['udalo_sie']=false;
+
+                                                             $tab['sciezka']=$sciezka;
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                                      }//else
+
+                                            }//else
+
+                                   }  //is_uploaded_file
+
+                                   else
+
+                                   {
+
+                                   $tab['blad']='Nie wybrałe¶ zadnego pliku!' ;
+
+
+
+                                   }
+
+return $tab;
+
+}
+
+function mail_html($do,$temat,$tresc,$dodatkowy_naglowek)
+
+{
+
+    $headers.= "MIME-Version: 1.0\r\n";
+
+    $headers.= "Content-type: text/html; charset=iso-8859-1\r\n";
+
+    $headers.=$dodatkowy_naglowek;
+
+    $ok=mail($do,$temat,$tresc,$headers);
+
+    if($ok)
+
+     return true;
+
+    else
+
+      return false;
+
+     }
+
+
+
+?>
+
diff --git a/funkcje_show.php b/funkcje_show.php
new file mode 100644
index 0000000..ef75d5b
--- /dev/null
+++ b/funkcje_show.php
@@ -0,0 +1,7724 @@
+        
+
+     
+
+     
+
+<?=$tytul;?>
+
+	 
+
+	 
+
+
+  
+
+
+
+
+
+
+
+
+
+
+     
+
+	 
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wpisz login:
Wpisz hasło:
+ +
+ +
+ +
0) + + { + + echo '
+ + + + + + + + + + + + + + + + + + '; + + } + + else + + { + + echo '
+ +
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + + } + + ?> + + + +
  
+ + + + + + + + + + + + + +
+ + + + + + + + + +
 
 
+ + + + + + + +
+ +

+ +"niedziela","Mon"=>"poniedziałek","Tue"=>"wtorek","Wed"=>"¶roda","Thu"=>"czwartek","Fri"=>"pi±tek","Sat"=> "sobota"); + + if ($dz=gmDate("D")) + + { + + $dz_tyg="$dz_tyg[$dz]"; + + } + + $dzien=date("d"); + + $miesiac=array(1=>"stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","wrze¶nia","paĽdziernika","listopada","grudnia"); + + if ($m=gmDate("n")) + + { + + $miesiac="$miesiac[$m]"; + + } + + $rok=gmDate("Y"); + + echo ("Dzisiaj jest $dz_tyg, $dzien $miesiac $rok r."); + +} + +function form_dodaj_uzytkownika() + +{ + + $stanowisko=mysql_query("select * from stanowisko where usun='0' order by stanowisko asc"); + + $text=' Dodaj '; + + ?>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Użytkownika:
  
Login: *
Email: *
imię: *
Nazwisko: *
Stanowisko:
Ulica: *
Kod: *
Miasto: *
Id inżyniera:
Rozliczenia Vendingtak/nie *
hasło: *
Powtórz hasło: *
Uprawnienia:

* - pola wymagane

Uprawnienia:
  
Harmonogram:
Raporty:
Zaliczki:
Kilometry:
Tankowania:
Zestawienia:
Samochody:
Ustawienia:
Konto:
Vending:
Magazyn:
  
method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Użytkownika:
  
Login:
Email:
imię:
Nazwisko:
Stanowisko:
Ulica:
Kod:
Miasto:
Id użtkownika:
Telefon:
hasło:
Powtórz hasło:
Uprawnienia:

hasło zostanie zmienione gdy je wpiszesz

Uprawnienia:
  
Harmonogrma:
Raporty:
Zaliczki:
Kilometry:
Tankowania:
Zestawienia:
Samochody:
Ustawienia:
Konto:
  

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Użytkownika:
  
Login:
Email:
imię:
Nazwisko:
Ulica:
Kod:
Miasto:
Id użtkownika:
Telefon:
hasło:
Powtórz hasło:

hasło zostanie zmienione gdy je wpiszesz
  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dane Użytkownika
  
Login:
Imie:
Nazwisko:
Stanowisko:
Ulica:
Kod:
Miasto:
Id inżyniera: + + + +
Telefon:
Uprawnienia:
  

+ + + + + + + + + + + + + + + + + + + + + + '); + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ''; + + } + + else + + { + + echo ''; + + } + + } + + } + + ?> + + + +
Dane dotycz±ce naprawy
  
Data naprawy:
Auto:
Rodzaj naprawy:
Lokalizacja:
Koszty: PLN
 Brak dodanych plików
zał±cznik - pokaż
zał±cznik - pokaż 

+ +
+ + + + + + + + + + + + + +
Dodaj stanowisko
  
Nazwa stanowiska:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Edycja stanowiska
  
Nazwa stanowiska:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Dodaj akcje
  
Nazwa akcji:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Edycja akcje
  
Nazwa akcji:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Dodaj bank
  
Nazwa banku:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Edycja bank
  
Nazwa banku:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Dodaj ubezpieczyciela
  
Nazwa ubezpieczyciela:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + +
Edycja ubezpieczyciela
  
Nazwa ubezpieczyciela:
+ + + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Samochód:
  
Auto:
Nr rejestracyjny:
Przypisany do:
Rok auta:
Data zakupu:
OC:
AC:
Ubezpieczenie:
Przegl±d:
Uwagi:
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dane Samochodu
  
auta:
Nr rejestracji:
Przypisany do:
Rok auta:
Data zakupu:
OC:
AC:
Ubezpieczenie:
Przegl±d:
 
Uwagi: + +
 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Samochod:
  
Auto:
Nr rejestracyjny:
Przypisany do:
Rok auta:
Data zakupu:
OC:
Następna wymiana oleju:
Ubezpieczenie:
Przegl±d:
Status:
Uwagi:
  

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Naprawe:
  
Data naprawy:
Auto:
Rodzaj naprawy:
Lokalizacja:
Koszty:
Kilometry:
Dodaj zał±czniki:

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik 1:
 

+ +

+ + + +
'; + + $zał±cznik=mysql_query("select a.id_pn,a.nazwa from naprawa_pliki a,naprawa b where a.id_nap=b.id_nap and a.id_nap='".$id_nap."'"); + + if(mysql_num_rows($zał±cznik)==0) + + { + + echo(''); + + } + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ''; + + } + + else + + { + + echo ''; + + } + + } + + } + + + + echo ''; + + ?> + + + + + +
Edytuj zał±czniki:

Brak dodanych plików
zał±cznik - pokaż - Usuń
zał±cznik - pokaż - Usuń

  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Naprawe:
  
Data naprawy:
Auto:
Rodzja naprawy:
Lokalizacja:
Koszt: PLN
Stan kilometrów KM

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik:
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzone kilometry:
  
Data:
Użytkownik:
Auto:
Trasa:
Wyjazd:
Km Start:
Km Stop:
Przejechano:
Bak:
 
Uwagi: + +
 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Kilometry:
  
Data:
Użytkownik:
Auto:
Trasa:
Wyjazd:
Km start:
Km stop:
Uwagi:
  
method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzone kilometry:
  
Data:
Użytkownik:
Auto:
Trasa:
Wyjazd:
Km Start:
Km Stop:
Bak:
Uwagi:
  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Kilometry:
  
Data:
Auto:
Trasa:
Wyjazd:
Km start:
Km stop:
Uwagi:
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzone kilometry:
  
Data:
Użytkownik:
Auto:
Trasa:
Wyjazd:
Km Start:
Km Stop:
Przejechano:
Bak:
 
Uwagi: + +
 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzone kilometry:
  
Data:
Użytkownik:
Auto:
Trasa:
Wyjazd:
Km Start:
Km Stop:
Bak:
Uwagi:
  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Tankowania:
  
Data:
Użytkownik:
Auto:
Stan km:
Litry:
Wyjazd:
  
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzone tankowanie:
  
Data:
Użytkownik:
Auto:
StanKm:
Litry:
Wyjazd:
 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzone tankowania:
  
Data:
Użytkownik:
Auto:
StanKm:
Litry:
Wyjazd:
  

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzone tankowanie:
  
Data:
Użytkownik:
Auto:
StanKm:
Litry:
Wyjazd:
 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzone tankowanie:
  
Data:
Użytkownik:
Auto:
StanKm:
Litry:
Wyjazd:
  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Tankowanie:
  
Data:
Auto:
StanKm:
Litry:
Wyjazd:
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Raport:
  
Akcja:
Bank:
Nr zlecenia:
Dopuszczono:
Podjazd:
Zrobiono:
Ulica:
Miasto:
Nr seryjny:
Typ:
Data:
Godz wyjazdu:
Godz rozpoczęcia:
Godz zakończenia:
Godz przyjazdu:
  
+ + + + + + + + + + + + + + + + +
Uwagi:

Maksymalna wielko¶ć pliku 3 MB - rozszerzenie *.jpg *.pdf
zał±cznik 1:
zał±cznik 2:
zał±cznik 3:
zał±cznik 4:
zał±cznik 5:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '); + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ''; + + } + + else + + { + + echo ''; + + } + + } + + } + + ?> + + + +
Wprowadzone raporty:
  
Data:
Nr zlecenia:
inżynier:
Akcja:
Bank:
Dopuszczono:
Podjazd:
Zrobiono:
 
Ulica:
Miasto:
Nr seryjny:
Typ:
 
Godz wyj.:
Godz roz.:
Godz zak.:
Godz przy.:
 
Uwagi: + +
 
Brak dodanych plików
zał±cznik - pokaż
zał±cznik - pokaż 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '); + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + echo ''; + + } + + } + + ?> + + + +
Wprowadzone raporty:
  
Data:
Nr zlecenia:
inżynier:
Akcja:
Bank:
Dopuszczono:
Podjazd:
Zrobiono:
 
Ulica:
Miasto:
Nr seryjny:
Typ:
 
Godz wyj.:
Godz roz.:
Godz zak.:
Godz przy.:
 
Uwagi: + +
 
Brak dodanych plików
zał±cznik - pokaż 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzony raport:
  
Akcja:
Bank:
Nr zlecenia:
Dopuszczono:
Podjazd:
Zrobiono:
Ulica:
Miasto:
Nr seryjny:
Typ:
Data:
Godz wyjazdu:
Godz rozpoczęcia:
Godz zakończenia:
Godz przyjazdu:
Uwagi:
Dodaj zał±czniki:

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik 1:
zał±cznik 2:
zał±cznik 3:
zał±cznik 4:
zał±cznik 5:
 
+ +
+ + + +
'; + + $zał±cznik=mysql_query("select a.id_pr,a.nazwa from raporty_pliki a,raporty b where a.id_rap=b.id_rap and a.id_rap='".$id_rap."'"); + + if(mysql_num_rows($zał±cznik)==0) + + { + + echo(''); + + } + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ' '; + + } + + else + + { + + echo ' '; + + } + + } + + } + + echo ''; + + ?> + + + + + +
Edytuj zał±czniki:

Brak dodanych plików
zał±cznik - pokaż - Usuń
zał±cznik - pokaż - Usuń

  

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzony raport:
  
Akcja:
Bank:
Nr zlecenia:
inżynier:
Dopuszczono:
Podjazd:
Zrobiono:
Ulica:
Miasto:
Nr seryjny:
Typ:
Data:
Godz wyjazdu:
Godz rozpoczęcia:
Godz zakończenia:
Godz przyjazdu:
Uwagi:

Dodaj zał±czniki:

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik 1:
zał±cznik 2:
zał±cznik 3:
zał±cznik 4:
zał±cznik 5:
 
+ +
+ + + +
'; + + $zał±cznik=mysql_query("select a.id_pr,a.nazwa from raporty_pliki a,raporty b where a.id_rap=b.id_rap and a.id_rap='".$id_rap."'"); + + if(mysql_num_rows($zał±cznik)==0) + + { + + echo(''); + + } + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ' '; + + } + + else + + { + + echo ' '; + + } + + } + + } + + echo ''; + + ?> + + + + + +
Edytuj zał±czniki:

Brak dodanych plików
zał±cznik - pokaż - Usuń
zał±cznik - pokaż - Usuń

  

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Raport:
  
Akcja:
Bank:
inżynier:
Nr zlecenia:
Dopuszczono:
Podjazd:
Zrobiono:
Ulica:
Miasto:
Nr seryjny:
Typ:
Data:
Godz wyjazdu:
Godz rozpoczęcia:
Godz zakończenia:
Godz przyjazdu:
Uwagi:

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik 1:
zał±cznik 2:
zał±cznik 3:
zał±cznik 4:
zał±cznik 5:

+ +

+ + + + + + + + + + + +
Szukaj:
 
Użytkownik:

+ +
Szukaj:
+ + + + + + + + + +
 
Nazwa auta: Nr rejest.: Rok auta: Ubezpieczyciel:

+ +
Szukaj:
+ + + + + + + + + +
 
Data naprawy:Auto + + Lokalizacja: + +

+ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data doInżynierAutoWyjazd
+ + + + + + + + + + + + + + +
Wszystkie
Prywatne
Służbowe
 
+ +
+ + + +
+ +

+ + + +

+ +
Szukaj:
+ + + + + + + + + +
 
Data od: Data do: + +

+ +
Szukaj:
+ + + + + + + + + + + + + + + + +
 
Data od: Data do: Trasa:Samochód: + + + +

+ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data doInżynierSamochódTrasa(Tylko z filtrem 'Samochód')Wyjazd
+ + + + + + + + + + +
Wszystkie
Prywatne
Służbowe
+
 
+ +
+ + + +
+ +

+ + + + + + + +

+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Data od Data doNr zleceniaNr seryjnyUlicaMiasto
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
'.$a['akcja'].''; + + echo'
' ; + $ia=$ia+1; +} + +?> +

+
+
+
+
+
' ; } + + + echo ''; + + if ( $kl==5 or $kl==8 or $kl==11 or $kl==14 or $kl==17 or $kl==20 or $kl==23 or $kl==26) + { + + echo'' ; } + + + $kl=$kl+1; + $ib=$ib+1; + +} + +?> + +
'.$b['bank'].'
+

+
+
+
+
+
' ; } + + + echo ''; + + if ( $kl==4 or $kl==6 or $kl==8 or $kl==10 or $kl==12 or $kl==14 or $kl==16 or $kl==18) + { + + echo'' ; } + + + $kl=$kl+1; + $iu=$iu+1; + +} + +?> + +
'.$a['nazwisko'].' '.$a['imie'].'
+

+
+
+
+
+
+ +

+ + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data doNr zlecenia Inżynier
+ +
AkcjaBankUlicaMiasto
Nr seryjny Typ
 
+ +
+ + + +
+ +

+ + + +

+ + + + + +
Data od: Data do: Nr zlecenia: Akcja: Bank: Ulica:
Miasto: Nr seryjny: Typ:
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Zaliczka:
  
Data:
inżynier:
Wydatki:
Na co:
Zaliczka:
Wydano:
  
+ + + + + + + + + + + + + + + + + + + + + + + + '); + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ''; + + } + + else + + { + + echo ''; + + } + + } + + } + + ?> + + + +
Wprowadzona zaliczka:
  
Data:
inżynier:
Na co:
Zaliczka:
Wydano:
 Brak dodanych plików
zał±cznik - pokaż
zał±cznik - pokaż 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzon± zaliczkę:
  
Data:
inżynier:
Wydatki:
Na co:
Zaliczka:
Wydano:

+ +
+ + + +
'; + + $zał±cznik=mysql_query("select a.id_pz,a.nazwa from zaliczki_pliki a,zaliczki b where a.id_zal=b.id_zal and a.id_zal='".$id_zal."'"); + + if(mysql_num_rows($zał±cznik)==0) + + { + + echo(''); + + } + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo ''; + + } + + else + + { + + echo ''; + + } + + } + + } + + + + echo ''; + + ?> + + + + + +

Brak dodanych plików
zał±cznik - pokaż - Usuń
zał±cznik - pokaż - Usuń

  

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Zaliczka:
  
Data:Data zostanie dodana automatycznie ()
Wydatki:
Na co:
Zaliczka:
Wydano:
  
method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzon± zaliczkę:
  
Data:
inżynier:
Wydatki:
Na co:
Zaliczka:
Wydano:

Dodaj zał±czniki:
 
+ + + + + +
'; + + $zał±cznik=mysql_query("select a.id_pz,a.nazwa from zaliczki_pliki a,zaliczki b where a.id_zal=b.id_zal and a.id_zal='".$id_zal."'"); + + if(mysql_num_rows($zał±cznik)==0) + + { + + echo('
Brak dodanych plików'); + + } + + else + + { + + while($u=mysql_fetch_array($zał±cznik)) + + { + + $x = $u['nazwa']; + + $y = strchr($x, "."); + + if (($y=='.jpg') OR ($y=='.JPG')) + + { + + echo 'zał±cznik -
pokaż - Usuń'; + + } + + else + + { + + echo 'zał±cznik - pokaż - Usuń'; + + } + + } + + } + + echo '
'; + + ?> + +   + +   + +

+ + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data doInżynierNa co
+ +
 
+ +
+ + + +
+ +

+ + + +

+ + + + + + + +
Data od: Data do: Na co:

+

Zestawienie wydatków

+ + + + + + + +
Data od: Data do: Użytkownik:

+ +

Zestawienie kilometrów

+ + + + + + + +
Data od: Data do: Użytkownik:

+ +

Zestawienie zużycia paliwa

+ + + + + + + +
Data od: Data do: Auto:

+ +

Zestawienie czasu pracy

+ + + + + + + +
Data od: Data do: + + Użytkownik: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Akcje:
  
Data: *
inżynier: *
Akcja: *
Bank: *
Nr zlecenia:
Godzina:
Nr seryjny:
Typ:
Ulica: *
Miasto: *
Uwagi:

* - pola wymagane
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzona akcja:
  
Data:
inżynier:
Akcja:
Bank:
Nr zlecenia:
Godzina: + +
nr seryjny: + +
Typ: + +
Ulica:
Miasto:
 
Uwagi: + +
 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wprowadzona akcja:
  
Data:
inżynier:
Akcja:
Bank:
Godzina: + +
nr seryjny: + +
Typ: + +
Ulica:
Miasto:
 
Uwagi: + +
 

method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj wprowadzon± akcje:
  
Data: *
inżynier: *
Akcja: *
Bank: *
Nr zlecenia:
Godzina:
Nr seryjny:
Typ:
Ulica: *
Miasto: *
Uwagi:

* - pola wymagane
  

+

+ + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Data od Data doNr zleceniaNr seryjnyUlicaMiasto
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
'.$a['akcja'].''; + + echo'
' ; + $ia=$ia+1; +} + +?> +

+
+
+
+
+
' ; } + + + echo ''; + + if ( $kl==5 or $kl==8 or $kl==11 or $kl==14 or $kl==17 or $kl==20 or $kl==23 or $kl==26) + { + + echo'' ; } + + + $kl=$kl+1; + $ib=$ib+1; + +} + +?> + +
'.$b['bank'].'
+

+
+
+
+
+
' ; } + + + echo ''; + + if ( $kl==4 or $kl==6 or $kl==8 or $kl==10 or $kl==12 or $kl==14 or $kl==16 or $kl==18) + { + + echo'' ; } + + + $kl=$kl+1; + $iu=$iu+1; + +} + +?> + +
'.$a['nazwisko'].' '.$a['imie'].'
+

+
+
+
+
+
+ +

+ + + + + + + +

+ + + + + + + + + + + + + + + + + + + +
Inżynier : + +
+ +

+ + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data doInżynier
+ +
Nr zleceniaNr seryjnyUlicaMiasto
+ +

+ + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data od Data do
+ +

+ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Raport:
  
Akcja:
Bank:
Nr zlecenia:
Dopuszczono:
Podjazd:
Zrobiono:
Ulica:
Miasto:
Nr seryjny:
Typ:
Data:
Godz wyjazdu:
Godz rozpoczęcia:
Godz zakończenia:
Godz przyjazdu:
Uwagi:

Maksymalna wielko¶ć pliku 2 Mb - rozszerzenie *.jpg *.pdf
zał±cznik 1:
zał±cznik 2:
zał±cznik 3:
zał±cznik 4:
zał±cznik 5:
  
+ +
+ +
+ + + + + + + + + + + + + + + +
Dodaj Podkategorie
  
Kategoria:
Nazwa Podkategorii:
+ + + +

+ +

+ +
+ + + + + + + + + + + + + + + +
Edytuj Podkategorie
  
Nazwa kategoria:
Nazwa podkategorii:
+ + + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Użytkownika:
  
Login: *
Email: *
Twoje imię:
Nazwisko:
Adres:
Miejscowoś?:
Kod pocztowy:
Nowe hasło: *
Powtórz hasło: *
  
* - Pola wymagane + +
method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj Uzytkownika:
  
Login: *
Email: *
Twoje imię:
Nazwisko:
Adres:
Miejscowoś?:
Kod pocztowy:e="00-000">
Nowe hasło: *
Powtórz hasło: *
  

+ + hasło zostanie zmienione tylko wtedy gdy je wpiszesz!!! + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj News`a:
  
Temat:
Tresc News`a (max. 2000 znaków):
  
method=post> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Edytuj News`a:
  
Temat:
Tresc News`a (max. 2000 znaków):
  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dodaj Firm? - wersja prosta:
  
Nazwa: *
Ulica: *
Kod: *
Miejscowoś?: *
Telefon: *
Telefon kom: *
Fax: *
Kategoria:
Podkategoria:
  
* - Pola wymagane + +
'.$tekst.''; + + echo $stopka; + + } + + + +function uwaga($tekst) + +{ + + echo '
'.$tekst.'
'; + +} + + + + + + + +////////////////////////////////////////////////////////// + +//menu + +function menu($tpl) + +{ + + print '
'; + + + +} + + + + + + + + + +function form_firmy($id=0) + +{ + + + + $kategoria=mysql_query("select * from kategorie_u order by nazwa_kat asc"); + + $podkategoria=mysql_query("select * from podkategorie_u order by nazwa_podkat asc"); + + $text='Dodaj Firm?'; + + $text2='* - pola wymagane'; + + if($id!=0) + + { + + $mysql=mysql_fetch_array(mysql_query("select * from firma_u where id_firma='".$id."'")); + + $text='Edytuj Firm?'; + + $text2='* - pola wymagane'; + + } + + ?> + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Nazwa Firmy: + + *
Ulica: + + *
Kod pocztowy: *
Miejscowość: *
Telefon:
Telefon kom:
Fax:
 
E-mail *
Strona WWW: ">
Gadu-Gadu:
Tlen:
Skype:
 
Logo:
 
Zdjęcie 1 :
Zdjęcie 2 :
Zdjęcie 3 :
Zdjęcie 4 :
Zdjęcie 5 :
 
Kategoria:
Podkategoria:
 
Opis Firmy (max. 500 znaków):
Produkty i usługi (max. 255 znaków):
+ + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + +
Login :
Password :
+ + + + Log in Problems?
Upload NZB

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NZB/Zip: Choose the ".nzb" or ".zip" file to upload.
Title: To be the title of file NZB pwoinien orginalny, the best including full name.
Category: Choose the category for the NZB
Format/Type: Choose format (PAL, NTSC)
+ + + + + +
+ + + + + + + + + + + +
NZB/ZIP:
Title:
Category:
Format/Type:PAL NTSC
method=post enctype="multipart/form-data"> + + + + + + + + + + + + + + + +
Edytuj plik:
NZB/ZIP:
Tytu?:
URL:
Kategoria:
Format:PAL > NTSC >
PAR:> >
+ + + + + + + + + +
Reminder of password

In aim of reminder of password pass your login and mail

login:
mail:
+ + '; + +
+ + + + + + + + + +
+ +
User Registration

+ + New User Registration (All fields are required)

Nickname:
Email:
Password:
Re-type Password:


You will receive a confirmation email with a link to a page you
should visit to activate your account in the next 24 hours.

+ +
Fill following field to to alter data
+ +
+ +
+ + + + + + + +
Email:>
New password:
New Re-type Password:
+ + + + + +
Nazwa Sprzętu:
Nazwa Kategorii:
Nazwa Kategorii: + +
+ +
+ +
+ + + + + + + + + +
Temat:
Od:
Tresc:
+ +
+ + + + + + + + + + + + + + + + + +
Wiadomoś? została wysłana dnia
  
Temat wiadomości
Wysłane przez:
Zrealizowane:
Treść wiadomości:
+ + + + + + + + + +
> powrót do poprzedniej strony <
+ +
+ +
+
+ + + + + + +
Edycja jednostki
  
Jednostka:
+ +

+

+
+ + + + + + +
Dodaj jednostkę
  
Jednostka:
+ +

+

+
+ + + + + + + +
Dodaj magazyn
  
Kod magazynu:
Nazwa magazynu:
+ +

+

+
+ + + + + + + +
Dodaj magazyn
  
Kod magazynu:
Nazwa magazynu:
+ +

+

+ + +
Dodaj grupe towarowa
+ + '; + ?> +
Nazwa:
Kategoria: +
+ + +
+

method=post> + + + + + + + + + + + +
Edytuj nazwe struktury:
  
Nazwa struktury:
  

+
+ + + + + + + + + '; + ?> + '; + ?> + +
Dodaj towar
  
Kod:
Nazwa:
EAN:
Jednostka:
Grupa towarowa:
Opis dodatkowy:
+ +

+
Towar .... nie posiada żadnego zasobu

'); + else + { + echo('


Zasoby na towarze -

'); + while($z=mysql_fetch_array($zasoby)) + { + ?>

+
+ + + + + + +
  
Jednostka:
+ +

+
Towar .... nie posiada żadnej historii

'); + else + { + echo('


Historia na towarze -

'); + while($h=mysql_fetch_array($historia)) + { + ?>

+
+ + + + + + +
  
Jednostka:
+ +

+

+
+ + + + + + + + + '; + ?> + '; + ?> + +
Edytuj towar
  
Kod:
Nazwa:
EAN:
Jednostka:
Grupa towarowa:
Opis dodatkowy:
+ +

+ diff --git a/funkcje_show.php.add b/funkcje_show.php.add new file mode 100644 index 0000000..b0b62da --- /dev/null +++ b/funkcje_show.php.add @@ -0,0 +1,11 @@ + +


Akcja została zatwierdzona

'); + + } + + BREAK; + + case "pokaz_ncr": + + form_pokaż_akcje_ncr($_GET['id_ham']); + + BREAK; + + case "szukaj": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.godzina,a.uwagi,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by data_ham DESC"); + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


W bazie nie ma wprowadzonych akcji!!!

'); + + else + + { + + $color=$color1; + +form_szukaj_harmonogram_ncr(); + + echo '

'; + + $lp = 0; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $lp = $lp + 1; + + $color=zmien_color($color); + + if($u['opcja']=='0') + + $color='#FCA1A1'; + + $opcje1='Pokaż'; + + + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + if($u['typ']!='') + + { + + $typ = $u['typ']; + + } + + else + + { + + $typ = '---'; + + } + + if($u['nrseryjny']!='') + + { + + $nrseryjny = $u['nrseryjny']; + + } + + else + + { + + $nrseryjny = '---'; + + } + + if($u['nrzlecenia']!='') + + { + + $nrzlecenia = $u['nrzlecenia']; + + } + + else + + { + + $nrzlecenia = '---'; + + } + + echo '' ; + + } + + echo '
LpDataInżynierAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiastoOpcje
'.$lp.'
'.$u['data_ham'].'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$nrzlecenia.'
'.$godzina.'
'.$nrseryjny.'
'.$typ.'
'.$u['ulica'].'
'.$u['miasto'].'
'.$opcje1.'
'; + + } + + BREAK; + + case "szukaj_harmonogram_ncr": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miasto like '%".$_POST['miasto']."%' order by data_ham DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miasto like '%".$_POST['miasto']."%' and a.id='".$_POST['id']."' order by data_ham DESC"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and data_ham >= '".$_POST['data1']."' and data_ham <= '".$_POST['data2']."' and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miasto like '%".$_POST['miasto']."%' order by data_ham DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and data_ham >= '".$_POST['data1']."' and data_ham <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miasto like '%".$_POST['miasto']."%' order by data_ham DESC"); + + } + + } + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

W bazie nie ma wprowadzonych żadnych danych!!!

+ +'); + + else + + { + + $color=$color1; + + $_POST['data1']=''; + + $_POST['data2']=''; + + form_szukaj_harmonogram_ncr(); + + echo '

'; + + $lp = 0; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $lp = $lp + 1; + + $color=zmien_color($color); + + if($u['opcja']=='0') + + $color='#FCA1A1'; + + $opcje1='Pokaż'; + + + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + if($u['typ']!='') + + { + + $typ = $u['typ']; + + } + + else + + { + + $typ = '---'; + + } + + if($u['nrseryjny']!='') + + { + + $nrseryjny = $u['nrseryjny']; + + } + + else + + { + + $nrseryjny = '---'; + + } + + if($u['nrzlecenia']!='') + + { + + $nrzlecenia = $u['nrzlecenia']; + + } + + else + + { + + $nrzlecenia = '---'; + + } + + echo '' ; + + } + + echo '
LpDataInżynierAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiastoOpcje
'.$lp.'
'.$u['data_ham'].'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$nrzlecenia.'
'.$godzina.'
'.$nrseryjny.'
'.$typ.'
'.$u['ulica'].'
'.$u['miasto'].'
'.$opcje1.'
'; + + } } + + exit; + + + + } //switch + + } + + + +$sprawdzanie_uzytkownika=mysql_query("select uprawnienia1 from uzytkownicy where uprawnienia1='0' and id='".$_SESSION['id']."'") or die(mysql_error()); + + if(mysql_num_rows($sprawdzanie_uzytkownika)>0) + + { + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "generuj_raport": + + if(!is_numeric($_GET['id_ham'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['generuj_raporty'])) + + form_generuj_raport($_GET['id_ham']); + + } + + break; + + + + + + case "wykonano": + + if(!is_numeric($_GET['id_ham'])) + + uwaga('Brak danych!'); + + else + + { + + $blok=mysql_query("update harmonogram SET opcja='1' where id_ham='".$_GET['id_ham']."'"); + + if($blok) + + echo('

Akcja została zatwierdzona

'); + + } + + BREAK; + + case "niewykonano": + + if(!is_numeric($_GET['id_ham'])) + + uwaga('Brak danych!'); + + else + + { + + $blok=mysql_query("update harmonogram SET opcja='0' where id_ham='".$_GET['id_ham']."'"); + + if($blok) + + echo('


Akcja została nie zatwierdzona

'); + + } + + + + BREAK; + + case "szukaj": + + $data1=date("Y-m-d",strtotime("-14 days",time())); + + $data2=date("Y-m-d",strtotime("+30 days",time())); + + $data3=date("Y-m-d",strtotime("-0 days",time())); + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and data_ham >= '".$data1."' and data_ham <= '".$data2."' order by data_ham DESC"); + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


W bazie nie ma wprowadzonych akcji!!!

'); + + else + + { + + $color=$color1; + + echo '

Zaplanowane akcje od '.$data1.' do '.$data2.'

'; + + echo '
'; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $color=zmien_color($color); + + if($u['data_ham']==$data3) + + $color='#FBCCCC'; + + if($u['data_ham']>$data3) + + $color='#CBDAFB'; + + if($u['data_ham']<$data3) + + $color='#D2FCCD'; + + + + //if($u['opcja']=='0') + + // $color='#FCA1A1'; + + if($u['opcja']=='0') + + $opcja='NIE'; + + else if($u['opcja']=='1') + + $opcja='TAK'; + + $opcje1='Generuj raport'; + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + if($u['typ']!='') + + { + + $typ = $u['typ']; + + } + + else + + { + + $typ = '---'; + + } + + if($u['nrseryjny']!='') + + { + + $nrseryjny = $u['nrseryjny']; + + } + + else + + { + + $nrseryjny = '---'; + + } + + if($u['nrzlecenia']!='') + + { + + $nrzlecenia = $u['nrzlecenia']; + + } + + else + + { + + $nrzlecenia = '---'; + + } echo '' ; + + } + + echo '
DataInżynierAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiastoWykonanoOpcje
'.$u['data_ham'].'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$nrzlecenia.'
'.$godzina.'
'.$nrseryjny.'
'.$typ.'
'.$u['ulica'].'
'.$u['miasto'].'
'.$opcja.'
'.$opcje1.'
'; + + echo ''; + + echo ' + + + + + + + + + +
'; + + } + + + + BREAK; + + } //switch + + } //if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + + else + + { + +echo ' + + + + + + + + + + + + + +

'; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "usun_admin": + + if(!is_numeric($_GET['id_ham'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update harmonogram SET usun='1' where id_ham='".$_GET['id_ham']."'"); + + if($usun) + + echo('


Akcja została usunięta

'); + + else + + echo('


Nie mozna było usun±ć Akcji

'); + + } + + BREAK; + + case "wykonano_admin": + + if(!is_numeric($_GET['id_ham'])) + + uwaga('Brak danych!'); + + else + + { + + $blok=mysql_query("update harmonogram SET opcja='1' where id_ham='".$_GET['id_ham']."'"); + + if($blok) + + echo('


Akcja została zatwierdzona

'); + + } + + BREAK; + + case "niewykonano_admin": + + if(!is_numeric($_GET['id_ham'])) + + uwaga('Brak danych!'); + + else + + { + + $blok=mysql_query("update harmonogram SET opcja='0' where id_ham='".$_GET['id_ham']."'"); + + if($blok) + + echo('


Akcja została nie zatwierdzona

'); + + } + + BREAK; + + case "pokaz_admin": + + form_pokaż_akcje_admin($_GET['id_ham']); + + BREAK; + + case "edytuj_admin": + + if(!is_numeric($_GET['id_ham'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_akcje_admin'])) + + form_edytuj_akcje_admin($_GET['id_ham']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

Nie podano daty!!!
'); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
Zła forma daty RRRR-MM-DD !!!
'); + + if ($_POST['id']==0) + + $blad.=('
Musisz wybrać uzytkownika!!!
'); + + if ($_POST['id_akc']==0) + + $blad.=('
Musisz wybrać akcje!!!
'); + + if ($_POST['id_ban']==0) + + $blad.=('
Musisz wybrać bank!!!
'); + + if ((strlen(trim($_POST['godzina']))!=0) and (!sprawdz_czas($_POST['godzina']))) + + $blad.=('
Zła forma godziny - HH:MM !!!
'); + + if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
Musisz podać ulice!!!
'); + + if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
Musisz podać miasto!!!
'); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_akcje_admin($_GET['id_ham']); + + } + + else + + { + + $edytuj_kilometry_admin=mysql_query("update harmonogram SET data_ham='".$_POST['data']."',id='".$_POST['id']."',id_akc='".$_POST['id_akc']."',id_ban='".$_POST['id_ban']."',godzina='".$_POST['godzina']."',nrseryjny='".$_POST['nrseryjny']."',typ='".$_POST['typ']."',ulica='".$_POST['ulica']."',miasto='".$_POST['miasto']."',uwagi='".$_POST['uwagi']."',nrzlecenia='".$_POST['nrzlecenia']."' where id_ham='".$_GET['id_ham']."'"); + + if($edytuj_kilometry_admin) + + uwaga('

Zmiany zostały wprowadzone

+ +'); + + else + + uwaga('


Nie mozna było wprowadzić zmian

+ +'); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_admin": + + + + if(!isset($_POST['dodaj_akcje_admin'])) + + form_dodaj_akcje_admin(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

Nie podano daty!!!
'); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
Zła forma daty RRRR-MM-DD !!!
'); + + if ($_POST['id']==0) + + $blad.=('
Musisz wybrać uzytkownika!!!
'); + + if ($_POST['id_akc']==0) + + $blad.=('
Musisz wybrać akcje!!!
'); + + if ($_POST['id_ban']==0) + + $blad.=('
Musisz wybrać bank!!!
'); + + if ((strlen(trim($_POST['godzina']))!=0) and (!sprawdz_czas($_POST['godzina']))) + + $blad.=('
Zła forma godziny - HH:MM !!!
'); + + if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
Musisz podać ulice!!!
'); + + if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
Musisz podać miasto!!!
'); // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_akcje_admin(); + + } + + else + + { + + + + $dodaj_akcja_admin=mysql_query("insert into harmonogram values('','".$_POST['data']."','".$_POST['id']."','".$_POST['id_akc']."','".$_POST['id_ban']."','".$_POST['godzina']."','".$_POST['nrseryjny']."','".$_POST['typ']."','".$_POST['ulica']."','".$_POST['miasto']."','".$_POST['uwagi']."','0','0','".$_POST['nrzlecenia']."')"); + + if($dodaj_akcja_admin) + + { + + uwaga('

Akcja została dodana

'); + + } + + else + + uwaga('


Nie można było dodać Akcji

'); + + } + + }//else + + break; + + case "zestawienie": + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("+14 days",time())); + +$uzytkownicy = mysql_query("SELECT id,imie,nazwisko FROM uzytkownicy where id_sta='3' and blok='NIE' group by nazwisko"); + +$color=$color1; + + echo '


Zestawienie Akcji za okres od '.$data.' do '.$data2.'

'; + + echo ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Legenda      
 - Biuro - BOŚ - ING
 - Instalacja nowego - Instalacja po relokacji - PM
 - Serwis - Szkolenie - Update
 - Upgrade - Urlop - Instalacja po wymianie
'; + +while ($u = mysql_fetch_array($uzytkownicy)) + +{ + + $color=zmien_color($color); + + echo '
'; + + echo '
'.$u['imie'].' '.$u['nazwisko'].'

'; + + $lp = 0; + + echo ''; + + + + $zlecenia = mysql_query("select a.id_ham,a.data_ham,a.id_akc,c.akcja,d.bank,a.ulica,a.miasto,a.opcja,a.godzina,a.uwagi,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data_ham>='".$data."' and a.data_ham<='".$data2."' and a.id='{$u['id']}' ORDER BY a.data_ham ASC"); + + echo '
'; + +while($z=mysql_fetch_array($zlecenia)) + + { + + $lp = $lp + 1; + + if ($z['id_akc']==16) + + { + + $color='#B5E8FC'; + + } + + if ($z['id_akc']==19) + + { + + $color='#FFD7EA'; + + } + + if ($z['id_akc']==24) + + { + + $color='#D4D6FC'; + + } + + if ($z['id_akc']==23) + + { + + $color='#CCF7FF'; + + } + + if ($z['id_akc']==17) + + { + + $color='#FFD7EA'; + + } + + if ($z['id_akc']==20) + + { + + $color='#FFD6BF'; + + } + + if ($z['id_akc']==25) + + { + + $color='#EACCF3'; + + } + + if ($z['id_akc']==26) + + { + + $color='#D3FAED'; + + } + + if ($z['id_akc']==18) + + { + + $color='#FFFCBE'; + + } + + if ($z['id_akc']==21) + + { + + $color='#EFDDD7'; + + } + + if ($z['id_akc']==22) + + { + + $color='#C3DAE6'; + + } + + if ($z['id_akc']==27) + + { + + $color='#E5E5E5'; + + } + + if($z['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($z['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + echo '' ; + + } + + echo '
LpDataAkcjaBankGodzinaUlicaMiasto
'.$lp.'
'.$z['data_ham'].'
'.$z['akcja'].'
'.$z['bank'].'
'.$godzina.'
'.$z['ulica'].'
'.$z['miasto'].'
'; + +} + + + + BREAK; + + case "zestawienie2": + +//---------------------- + + + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,c.akcja,d.bank,a.ulica,a.miasto,a.opcja,a.godzina,a.uwagi,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data_ham>='".$data."' and a.id='".$_POST['id']."' group by nazwisko,data_ham asc"); + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

W bazie nie ma wprowadzonych akcji!!!

'); + + else + + { + +form_szukaj_zestawienia(); + + $color=$color1; + + echo $pobierz_userow[nazwisko]; + + echo '

'; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $tydzien = date('W',strtotime($u['data_ham'])); + + $color=zmien_color($color); + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + + + echo '' ; + + } + + echo '
DataTydzienInżynierAkcjaBankGodzinaUlicaMiasto
'.$u['data_ham'].'
'.$tydzien.'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$godzina.'
'.$u['ulica'].'
'.$u['miasto'].'
'; + + } + + + +//---------------------- + + BREAK; + + case "show_admin": + + // pobieranie userów + + + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.godzina,a.uwagi,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by data_ham desc"); + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

W bazie nie ma wprowadzonych akcji!!!

'); + + else + + { + + $color=$color1; + +form_szukaj_harmonogram_admin(); + + echo '

'; + + $lp = 0; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $data2=date("Y-m-d",strtotime("-0 days",time())); + + + + $lp = $lp + 1; + + $color=zmien_color($color); + + //if($u['opcja']=='0') + + // $color='#FCA1A1'; + + if($u['data_ham']==$data2) + + $color='#FBCCCC'; + + if($u['data_ham']>$data2) + + $color='#CBDAFB'; + + if($u['data_ham']<$data2) + + $color='#D2FCCD'; + + if($u['opcja']=='0') + + $opcja='NIE'; + + else if($u['opcja']=='1') + + $opcja='TAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + if($u['typ']!='') + + { + + $typ = $u['typ']; + + } + + else + + { + + $typ = '---'; + + } + + if($u['nrseryjny']!='') + + { + + $nrseryjny = $u['nrseryjny']; + + } + + else + + { + + $nrseryjny = '---'; + + } + + if($u['nrzlecenia']!='') + + { + + $nrzlecenia = $u['nrzlecenia']; + + } + + else + + { + + $nrzlecenia = '---'; + + } echo '' ; + + } + + echo '
LpDataInżynierAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiastoWykonanoOpcje
'.$lp.'
'.$u['data_ham'].'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$nrzlecenia.'
'.$godzina.'
'.$nrseryjny.'
'.$typ.'
'.$u['ulica'].'
'.$u['miasto'].'
'.$opcja.'
'.$opcje1.''.$opcje2.'
'; + + } + + exit; + + + + BREAK; + + case "eksport_harmonogamu": + + eksport_harmonogramu(); + + BREAK; + + case "szukaj_harmonogram_admin": + + // pobieranie userów + + + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miasto like '%".$_POST['miasto']."%' + and + + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + + + + ) + order by data_ham desc, nazwisko asc"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miasto like '%".$_POST['miasto']."%' + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."') + and + + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + + + + ) + + + order by data_ham desc, nazwisko asc"); + + } + + } + + else + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and data_ham >= '".$_POST['data1']."' + and data_ham <= '".$_POST['data2']."' + and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miasto like '%".$_POST['miasto']."%' + and + + + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + + + + ) + + + order by data_ham desc,nazwisko asc"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and + data_ham >= '".$_POST['data1']."' + and data_ham <= '".$_POST['data2']."' + and + + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like'".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."') + + and a.nrzlecenia like '%".$_POST['nrzlecenia']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miasto like '%".$_POST['miasto']."%' + and + + + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + + + + ) + + + order by data_ham desc, nazwisko asc"); + + } + + } + +if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

W bazie nie ma wprowadzonych żadnych danych!!!

+ +'); + + else + + { + + $color=$color1; + + //$_POST['data1']=''; + + //$_POST['data2']=''; + + form_szukaj_harmonogram_admin(); + + echo '

'; + + $lp = 0; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $lp = $lp + 1; + + $color=zmien_color($color); + + + + if($u['opcja']=='0') + + $color='#FCA1A1'; + + $data2=date("Y-m-d",strtotime("-0 days",time())); + + if($u['data_ham']==$data2) + + $color='#FBCCCC'; + + if($u['data_ham']>$data2) + + $color='#CBDAFB'; + + if($u['data_ham']<$data2) + + $color='#D2FCCD'; + + + + + + if($u['opcja']=='0') + + $opcja='NIE'; + + else if($u['opcja']=='1') + + { + + $opcja='TAK'; + + $color='#FFFFFF'; + + } + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + if($u['godzina']!='00:00:00') + + { + + $godzina = date('H:i',strtotime($u['godzina'])); + + } + + else + + { + + $godzina = '---'; + + } + + if($u['typ']!='') + + { + + $typ = $u['typ']; + + } + + else + + { + + $typ = '---'; + + } + + if($u['nrseryjny']!='') + + { + + $nrseryjny = $u['nrseryjny']; + + } + + else + + { + + $nrseryjny = '---'; + + } + + if($u['nrzlecenia']!='') + + { + + $nrzlecenia = $u['nrzlecenia']; + + } + + else + + { + + $nrzlecenia = '---'; + + } echo '' ; + + } + + echo '
LpDataInżynierAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiastoWykonanoOpcje
'.$lp.'
'.$u['data_ham'].'
'.$u['nazwisko'].' '.$u['imie'].'
'.$u['akcja'].'
'.$u['bank'].'
'.$nrzlecenia.'
'.$godzina.'
'.$nrseryjny.'
'.$typ.'
'.$u['ulica'].'
'.$u['miasto'].'
'.$opcja.'
'.$opcje1.''.$opcje2.'
'; + + } } + + exit; + + + + + + } //switch + + } //if + + + + + +?> + diff --git a/index.html b/index.html new file mode 100644 index 0000000..c50efd8 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html_ b/index.html_ new file mode 100644 index 0000000..c50efd8 --- /dev/null +++ b/index.html_ @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..397146d --- /dev/null +++ b/index.php @@ -0,0 +1,5 @@ + diff --git a/info_o_cookie.js b/info_o_cookie.js new file mode 100644 index 0000000..c5ad94f --- /dev/null +++ b/info_o_cookie.js @@ -0,0 +1,52 @@ +/* +skrypt napisal Piotr Majewski dla swoich Klientów i Czytelników CNEB.pl +do swobodnego używania +funkcje setCookie i getCookie zaczerpnięte ze strony http://www.w3schools.com/js/js_cookies.asp +i prawa do nich oraz ich rozpowszechniania posiada ich wła¶ciciel. + +UWAGA: Jesli widzisz krzaki zamiast polskich znakow, przed skopiowaniem skryptu zmien +kodowanie na UTF-8 (zwykle w ustawieniach Widok > Kodowanie) +*/ + +function setCookie(c_name,value,exdays) { +var exdate=new Date(); +exdate.setDate(exdate.getDate() + exdays); +var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString()+";path = /"); +document.cookie=c_name + "=" + c_value; +} + +function getCookie(c_name) { +var i,x,y,ARRcookies=document.cookie.split(";"); +for (i=0;i"; + } catch(e) {} + var element = parentElement.firstChild || null; + + // see if browser added wrapping tags + if(element && (element.tagName.toUpperCase() != elementName)) + element = element.getElementsByTagName(elementName)[0]; + + // fallback to createElement approach + if(!element) element = document.createElement(elementName); + + // abort if nothing could be created + if(!element) return; + + // attributes (or text) + if(arguments[1]) + if(this._isStringOrNumber(arguments[1]) || + (arguments[1] instanceof Array) || + arguments[1].tagName) { + this._children(element, arguments[1]); + } else { + var attrs = this._attributes(arguments[1]); + if(attrs.length) { + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" +elementName + " " + + attrs + ">"; + } catch(e) {} + element = parentElement.firstChild || null; + // workaround firefox 1.0.X bug + if(!element) { + element = document.createElement(elementName); + for(attr in arguments[1]) + element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; + } + if(element.tagName.toUpperCase() != elementName) + element = parentElement.getElementsByTagName(elementName)[0]; + } + } + + // text, or array of children + if(arguments[2]) + this._children(element, arguments[2]); + + return element; + }, + _text: function(text) { + return document.createTextNode(text); + }, + + ATTR_MAP: { + 'className': 'class', + 'htmlFor': 'for' + }, + + _attributes: function(attributes) { + var attrs = []; + for(attribute in attributes) + attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + + '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); + return attrs.join(" "); + }, + _children: function(element, children) { + if(children.tagName) { + element.appendChild(children); + return; + } + if(typeof children=='object') { // array can hold nodes and text + children.flatten().each( function(e) { + if(typeof e=='object') + element.appendChild(e) + else + if(Builder._isStringOrNumber(e)) + element.appendChild(Builder._text(e)); + }); + } else + if(Builder._isStringOrNumber(children)) + element.appendChild(Builder._text(children)); + }, + _isStringOrNumber: function(param) { + return(typeof param=='string' || typeof param=='number'); + }, + build: function(html) { + var element = this.node('div'); + $(element).update(html.strip()); + return element.down(); + }, + dump: function(scope) { + if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope + + var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + + "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + + "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ + "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ + "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ + "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); + + tags.each( function(tag){ + scope[tag] = function() { + return Builder.node.apply(Builder, [tag].concat($A(arguments))); + } + }); + } +} diff --git a/js/effects.js b/js/effects.js new file mode 100644 index 0000000..b8c0259 --- /dev/null +++ b/js/effects.js @@ -0,0 +1,1122 @@ +// script.aculo.us effects.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; + }, + pulse: function(pos, pulses) { + pulses = pulses || 5; + return ( + ((pos % (1/pulses)) * pulses).round() == 0 ? + ((pos * pulses * 2) - (pos * pulses * 2).floor()) : + 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) + ); + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + var options = Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, arguments[2] || { }); + Effect[element.visible() ? + Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data.set(property, this[property]); + return '#'; + } +}); + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(), + max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1] > max ? max : elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()) } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element) + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }) + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var options = Object.extend({ + distance: 20, + duration: 0.5 + }, arguments[1] || {}); + var distance = parseFloat(options.distance); + var split = parseFloat(options.duration) / 10.0; + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}) }}) }}) }}) }}) }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ) + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }; + var oldOpacity = element.getInlineOpacity(); + var transition = options.transition || Effect.Transitions.sinoidal; + var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; + reverser.bind(transition); + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + } + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ) + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ) + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + track = $H(track); + var data = track.values().first(); + this.tracks.push($H({ + ids: track.keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); + var elements = [$(ids) || $$(ids)].flatten(); + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
'; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules.set(property, style[property]); + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { + results[property] = css[property]; + return results; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +}; + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element) + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + } + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); diff --git a/js/lightbox.js b/js/lightbox.js new file mode 100644 index 0000000..68b4b4c --- /dev/null +++ b/js/lightbox.js @@ -0,0 +1,497 @@ +// ----------------------------------------------------------------------------------- +// +// Lightbox v2.04 +// by Lokesh Dhakar - http://www.lokeshdhakar.com +// Last Modification: 2/9/08 +// +// For more information, visit: +// http://lokeshdhakar.com/projects/lightbox2/ +// +// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ +// - Free for use in both personal and commercial projects +// - Attribution requires leaving author name, author link, and the license info intact. +// +// Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets. +// Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous. +// +// ----------------------------------------------------------------------------------- +/* + + Table of Contents + ----------------- + Configuration + + Lightbox Class Declaration + - initialize() + - updateImageList() + - start() + - changeImage() + - resizeImageContainer() + - showImage() + - updateDetails() + - updateNav() + - enableKeyboardNav() + - disableKeyboardNav() + - keyboardAction() + - preloadNeighborImages() + - end() + + Function Calls + - document.observe() + +*/ +// ----------------------------------------------------------------------------------- + +// +// Configurationl +// +LightboxOptions = Object.extend({ + fileLoadingImage: 'images/loading.gif', + fileBottomNavCloseImage: 'images/closelabel.gif', + + overlayOpacity: 0.8, // controls transparency of shadow overlay + + animate: true, // toggles resizing animations + resizeSpeed: 7, // controls the speed of the image resizing animations (1=slowest and 10=fastest) + + borderSize: 10, //if you adjust the padding in the CSS, you will need to update this variable + + // When grouping images this is used to write: Image # of #. + // Change it for non-english localization + labelImage: "Image", + labelOf: "of" +}, window.LightboxOptions || {}); + +// ----------------------------------------------------------------------------------- + +var Lightbox = Class.create(); + +Lightbox.prototype = { + imageArray: [], + activeImage: undefined, + + // initialize() + // Constructor runs on completion of the DOM loading. Calls updateImageList and then + // the function inserts html at the bottom of the page which is used to display the shadow + // overlay and the image container. + // + initialize: function() { + + this.updateImageList(); + + this.keyboardAction = this.keyboardAction.bindAsEventListener(this); + + if (LightboxOptions.resizeSpeed > 10) LightboxOptions.resizeSpeed = 10; + if (LightboxOptions.resizeSpeed < 1) LightboxOptions.resizeSpeed = 1; + + this.resizeDuration = LightboxOptions.animate ? ((11 - LightboxOptions.resizeSpeed) * 0.15) : 0; + this.overlayDuration = LightboxOptions.animate ? 0.2 : 0; // shadow fade in/out duration + + // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension. + // If animations are turned off, it will be hidden as to prevent a flicker of a + // white 250 by 250 box. + var size = (LightboxOptions.animate ? 250 : 1) + 'px'; + + + // Code inserts html at the bottom of the page that looks similar to this: + // + //
+ // + + + var objBody = $$('body')[0]; + + objBody.appendChild(Builder.node('div',{id:'overlay'})); + + objBody.appendChild(Builder.node('div',{id:'lightbox'}, [ + Builder.node('div',{id:'outerImageContainer'}, + Builder.node('div',{id:'imageContainer'}, [ + Builder.node('img',{id:'lightboxImage'}), + Builder.node('div',{id:'hoverNav'}, [ + Builder.node('a',{id:'prevLink', href: '#' }), + Builder.node('a',{id:'nextLink', href: '#' }) + ]), + Builder.node('div',{id:'loading'}, + Builder.node('a',{id:'loadingLink', href: '#' }, + Builder.node('img', {src: LightboxOptions.fileLoadingImage}) + ) + ) + ]) + ), + Builder.node('div', {id:'imageDataContainer'}, + Builder.node('div',{id:'imageData'}, [ + Builder.node('div',{id:'imageDetails'}, [ + Builder.node('span',{id:'caption'}), + Builder.node('span',{id:'numberDisplay'}) + ]), + Builder.node('div',{id:'bottomNav'}, + Builder.node('a',{id:'bottomNavClose', href: '#' }, + Builder.node('img', { src: LightboxOptions.fileBottomNavCloseImage }) + ) + ) + ]) + ) + ])); + + + $('overlay').hide().observe('click', (function() { this.end(); }).bind(this)); + $('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this)); + $('outerImageContainer').setStyle({ width: size, height: size }); + $('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this)); + $('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this)); + $('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this)); + $('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this)); + + var th = this; + (function(){ + var ids = + 'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' + + 'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose'; + $w(ids).each(function(id){ th[id] = $(id); }); + }).defer(); + }, + + // + // updateImageList() + // Loops through anchor tags looking for 'lightbox' references and applies onclick + // events to appropriate links. You can rerun after dynamically adding images w/ajax. + // + updateImageList: function() { + this.updateImageList = Prototype.emptyFunction; + + document.observe('click', (function(event){ + var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]'); + if (target) { + event.stop(); + this.start(target); + } + }).bind(this)); + }, + + // + // start() + // Display overlay and lightbox. If image is part of a set, add siblings to imageArray. + // + start: function(imageLink) { + + $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' }); + + // stretch overlay to fill page and fade in + var arrayPageSize = this.getPageSize(); + $('overlay').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' }); + + new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity }); + + this.imageArray = []; + var imageNum = 0; + + if ((imageLink.rel == 'lightbox')){ + // if image is NOT part of a set, add single image to imageArray + this.imageArray.push([imageLink.href, imageLink.title]); + } else { + // if image is part of a set.. + this.imageArray = + $$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]'). + collect(function(anchor){ return [anchor.href, anchor.title]; }). + uniq(); + + while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; } + } + + // calculate top and left offset for the lightbox + var arrayPageScroll = document.viewport.getScrollOffsets(); + var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10); + var lightboxLeft = arrayPageScroll[0]; + this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show(); + + this.changeImage(imageNum); + }, + + // + // changeImage() + // Hide most elements and preload image in preparation for resizing image container. + // + changeImage: function(imageNum) { + + this.activeImage = imageNum; // update global var + + // hide elements during transition + if (LightboxOptions.animate) this.loading.show(); + this.lightboxImage.hide(); + this.hoverNav.hide(); + this.prevLink.hide(); + this.nextLink.hide(); + // HACK: Opera9 does not currently support scriptaculous opacity and appear fx + this.imageDataContainer.setStyle({opacity: .0001}); + this.numberDisplay.hide(); + + var imgPreloader = new Image(); + + // once image is preloaded, resize image container + + + imgPreloader.onload = (function(){ + this.lightboxImage.src = this.imageArray[this.activeImage][0]; + this.resizeImageContainer(imgPreloader.width, imgPreloader.height); + }).bind(this); + imgPreloader.src = this.imageArray[this.activeImage][0]; + }, + + // + // resizeImageContainer() + // + resizeImageContainer: function(imgWidth, imgHeight) { + + // get current width and height + var widthCurrent = this.outerImageContainer.getWidth(); + var heightCurrent = this.outerImageContainer.getHeight(); + + // get new width and height + var widthNew = (imgWidth + LightboxOptions.borderSize * 2); + var heightNew = (imgHeight + LightboxOptions.borderSize * 2); + + // scalars based on change from old to new + var xScale = (widthNew / widthCurrent) * 100; + var yScale = (heightNew / heightCurrent) * 100; + + // calculate size difference between new and old image, and resize if necessary + var wDiff = widthCurrent - widthNew; + var hDiff = heightCurrent - heightNew; + + if (hDiff != 0) new Effect.Scale(this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'}); + if (wDiff != 0) new Effect.Scale(this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration}); + + // if new and old image are same size and no scaling transition is necessary, + // do a quick pause to prevent image flicker. + var timeout = 0; + if ((hDiff == 0) && (wDiff == 0)){ + timeout = 100; + if (Prototype.Browser.IE) timeout = 250; + } + + (function(){ + this.prevLink.setStyle({ height: imgHeight + 'px' }); + this.nextLink.setStyle({ height: imgHeight + 'px' }); + this.imageDataContainer.setStyle({ width: widthNew + 'px' }); + + this.showImage(); + }).bind(this).delay(timeout / 1000); + }, + + // + // showImage() + // Display image and begin preloading neighbors. + // + showImage: function(){ + this.loading.hide(); + new Effect.Appear(this.lightboxImage, { + duration: this.resizeDuration, + queue: 'end', + afterFinish: (function(){ this.updateDetails(); }).bind(this) + }); + this.preloadNeighborImages(); + }, + + // + // updateDetails() + // Display caption, image number, and bottom nav. + // + updateDetails: function() { + + // if caption is not null + if (this.imageArray[this.activeImage][1] != ""){ + this.caption.update(this.imageArray[this.activeImage][1]).show(); + } + + // if image is part of set display 'Image x of x' + if (this.imageArray.length > 1){ + this.numberDisplay.update( LightboxOptions.labelImage + ' ' + (this.activeImage + 1) + ' ' + LightboxOptions.labelOf + ' ' + this.imageArray.length).show(); + } + + new Effect.Parallel( + [ + new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }), + new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration }) + ], + { + duration: this.resizeDuration, + afterFinish: (function() { + // update overlay size and update nav + var arrayPageSize = this.getPageSize(); + this.overlay.setStyle({ height: arrayPageSize[1] + 'px' }); + this.updateNav(); + }).bind(this) + } + ); + }, + + // + // updateNav() + // Display appropriate previous and next hover navigation. + // + updateNav: function() { + + this.hoverNav.show(); + + // if not first image in set, display prev image button + if (this.activeImage > 0) this.prevLink.show(); + + // if not last image in set, display next image button + if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show(); + + this.enableKeyboardNav(); + }, + + // + // enableKeyboardNav() + // + enableKeyboardNav: function() { + document.observe('keydown', this.keyboardAction); + }, + + // + // disableKeyboardNav() + // + disableKeyboardNav: function() { + document.stopObserving('keydown', this.keyboardAction); + }, + + // + // keyboardAction() + // + keyboardAction: function(event) { + var keycode = event.keyCode; + + var escapeKey; + if (event.DOM_VK_ESCAPE) { // mozilla + escapeKey = event.DOM_VK_ESCAPE; + } else { // ie + escapeKey = 27; + } + + var key = String.fromCharCode(keycode).toLowerCase(); + + if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox + this.end(); + } else if ((key == 'p') || (keycode == 37)){ // display previous image + if (this.activeImage != 0){ + this.disableKeyboardNav(); + this.changeImage(this.activeImage - 1); + } + } else if ((key == 'n') || (keycode == 39)){ // display next image + if (this.activeImage != (this.imageArray.length - 1)){ + this.disableKeyboardNav(); + this.changeImage(this.activeImage + 1); + } + } + }, + + // + // preloadNeighborImages() + // Preload previous and next images. + // + preloadNeighborImages: function(){ + var preloadNextImage, preloadPrevImage; + if (this.imageArray.length > this.activeImage + 1){ + preloadNextImage = new Image(); + preloadNextImage.src = this.imageArray[this.activeImage + 1][0]; + } + if (this.activeImage > 0){ + preloadPrevImage = new Image(); + preloadPrevImage.src = this.imageArray[this.activeImage - 1][0]; + } + + }, + + // + // end() + // + end: function() { + this.disableKeyboardNav(); + this.lightbox.hide(); + new Effect.Fade(this.overlay, { duration: this.overlayDuration }); + $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' }); + }, + + // + // getPageSize() + // + getPageSize: function() { + + var xScroll, yScroll; + + if (window.innerHeight && window.scrollMaxY) { + xScroll = window.innerWidth + window.scrollMaxX; + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac + xScroll = document.body.scrollWidth; + yScroll = document.body.scrollHeight; + } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari + xScroll = document.body.offsetWidth; + yScroll = document.body.offsetHeight; + } + + var windowWidth, windowHeight; + + if (self.innerHeight) { // all except Explorer + if(document.documentElement.clientWidth){ + windowWidth = document.documentElement.clientWidth; + } else { + windowWidth = self.innerWidth; + } + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowWidth = document.documentElement.clientWidth; + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowWidth = document.body.clientWidth; + windowHeight = document.body.clientHeight; + } + + // for small pages with total height less then height of the viewport + if(yScroll < windowHeight){ + pageHeight = windowHeight; + } else { + pageHeight = yScroll; + } + + // for small pages with total width less then width of the viewport + if(xScroll < windowWidth){ + pageWidth = xScroll; + } else { + pageWidth = windowWidth; + } + + return [pageWidth,pageHeight]; + } +} + +document.observe('dom:loaded', function () { new Lightbox(); }); \ No newline at end of file diff --git a/js/prototype.js b/js/prototype.js new file mode 100644 index 0000000..2c70b8a --- /dev/null +++ b/js/prototype.js @@ -0,0 +1,4221 @@ +/* Prototype JavaScript framework, version 1.6.0.2 + * (c) 2005-2008 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.6.0.2', + + Browser: { + IE: !!(window.attachEvent && !window.opera), + Opera: !!window.opera, + WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, + Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, + MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) + }, + + BrowserFeatures: { + XPath: !!document.evaluate, + ElementExtensions: !!window.HTMLElement, + SpecificElementExtensions: + document.createElement('div').__proto__ && + document.createElement('div').__proto__ !== + document.createElement('form').__proto__ + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +/* Based on Alex Arnell's inheritance implementation. */ +var Class = { + create: function() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + var subclass = function() { }; + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0; i < properties.length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + + return klass; + } +}; + +Class.Methods = { + addMethods: function(source) { + var ancestor = this.superclass && this.superclass.prototype; + var properties = Object.keys(source); + + if (!Object.keys({ toString: true }).length) + properties.push("toString", "valueOf"); + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames().first() == "$super") { + var method = value, value = Object.extend((function(m) { + return function() { return ancestor[m].apply(this, arguments) }; + })(property).wrap(method), { + valueOf: function() { return method }, + toString: function() { return method.toString() } + }); + } + this.prototype[property] = value; + } + + return this; + } +}; + +var Abstract = { }; + +Object.extend = function(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +}; + +Object.extend(Object, { + inspect: function(object) { + try { + if (Object.isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + }, + + toJSON: function(object) { + var type = typeof object; + switch (type) { + case 'undefined': + case 'function': + case 'unknown': return; + case 'boolean': return object.toString(); + } + + if (object === null) return 'null'; + if (object.toJSON) return object.toJSON(); + if (Object.isElement(object)) return; + + var results = []; + for (var property in object) { + var value = Object.toJSON(object[property]); + if (!Object.isUndefined(value)) + results.push(property.toJSON() + ': ' + value); + } + + return '{' + results.join(', ') + '}'; + }, + + toQueryString: function(object) { + return $H(object).toQueryString(); + }, + + toHTML: function(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + }, + + keys: function(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; + }, + + values: function(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; + }, + + clone: function(object) { + return Object.extend({ }, object); + }, + + isElement: function(object) { + return object && object.nodeType == 1; + }, + + isArray: function(object) { + return object != null && typeof object == "object" && + 'splice' in object && 'join' in object; + }, + + isHash: function(object) { + return object instanceof Hash; + }, + + isFunction: function(object) { + return typeof object == "function"; + }, + + isString: function(object) { + return typeof object == "string"; + }, + + isNumber: function(object) { + return typeof object == "number"; + }, + + isUndefined: function(object) { + return typeof object == "undefined"; + } +}); + +Object.extend(Function.prototype, { + argumentNames: function() { + var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); + return names.length == 1 && !names[0] ? [] : names; + }, + + bind: function() { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } + }, + + bindAsEventListener: function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function(event) { + return __method.apply(object, [event || window.event].concat(args)); + } + }, + + curry: function() { + if (!arguments.length) return this; + var __method = this, args = $A(arguments); + return function() { + return __method.apply(this, args.concat($A(arguments))); + } + }, + + delay: function() { + var __method = this, args = $A(arguments), timeout = args.shift() * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + }, + + wrap: function(wrapper) { + var __method = this; + return function() { + return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); + } + }, + + methodize: function() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + return __method.apply(null, [this].concat($A(arguments))); + }; + } +}); + +Function.prototype.defer = Function.prototype.delay.curry(0.01); + +Date.prototype.toJSON = function() { + return '"' + this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z"'; +}; + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + } finally { + this.currentlyExecuting = false; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var self = arguments.callee; + self.text.data = this; + return self.div.innerHTML; + }, + + unescapeHTML: function() { + var div = new Element('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + times: function(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { + var character = String.specialChar[match[0]]; + return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + }, + + toJSON: function() { + return this.inspect(true); + }, + + unfilterJSON: function(filter) { + return this.sub(filter || Prototype.JSONFilter, '#{1}'); + }, + + isJSON: function() { + var str = this; + if (str.blank()) return false; + str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + evalJSON: function(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + }, + + include: function(pattern) { + return this.indexOf(pattern) > -1; + }, + + startsWith: function(pattern) { + return this.indexOf(pattern) === 0; + }, + + endsWith: function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + }, + + empty: function() { + return this == ''; + }, + + blank: function() { + return /^\s*$/.test(this); + }, + + interpolate: function(object, pattern) { + return new Template(this, pattern).evaluate(object); + } +}); + +if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { + escapeHTML: function() { + return this.replace(/&/g,'&').replace(//g,'>'); + }, + unescapeHTML: function() { + return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +}; + +String.prototype.parseQuery = String.prototype.toQueryParams; + +Object.extend(String.prototype.escapeHTML, { + div: document.createElement('div'), + text: document.createTextNode('') +}); + +with (String.prototype.escapeHTML) div.appendChild(text); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return ''; + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3]; + var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = { + each: function(iterator, context) { + var index = 0; + iterator = iterator.bind(context); + try { + this._each(function(value) { + iterator(value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + }, + + all: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function(iterator, context) { + iterator = iterator.bind(context); + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(filter, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(filter); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator(value, index)); + }); + return results; + }, + + include: function(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator, context) { + iterator = iterator.bind(context); + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator, context) { + iterator = iterator.bind(context); + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +}; + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + filter: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray, + every: Enumerable.all, + some: Enumerable.any +}); +function $A(iterable) { + if (!iterable) return []; + if (iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +if (Prototype.Browser.WebKit) { + $A = function(iterable) { + if (!iterable) return []; + if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && + iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; + }; +} + +Array.from = $A; + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(Object.isArray(value) ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + }, + + intersect: function(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + }, + + toJSON: function() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (!Object.isUndefined(value)) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } +}); + +// use native browser JS 1.6 implementation if available +if (Object.isFunction(Array.prototype.forEach)) + Array.prototype._each = Array.prototype.forEach; + +if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; +}; + +if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; +}; + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if (Prototype.Browser.Opera){ + Array.prototype.concat = function() { + var array = []; + for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for (var i = 0, length = arguments.length; i < length; i++) { + if (Object.isArray(arguments[i])) { + for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + }; +} +Object.extend(Number.prototype, { + toColorPart: function() { + return this.toPaddedString(2, 16); + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + }, + + toPaddedString: function(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + }, + + toJSON: function() { + return isFinite(this) ? this.toString() : 'null'; + } +}); + +$w('abs round ceil floor').each(function(method){ + Number.prototype[method] = Math[method].methodize(); +}); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + return { + initialize: function(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + }, + + _each: function(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + set: function(key, value) { + return this._object[key] = value; + }, + + get: function(key) { + return this._object[key]; + }, + + unset: function(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + }, + + toObject: function() { + return Object.clone(this._object); + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + index: function(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + }, + + merge: function(object) { + return this.clone().update(object); + }, + + update: function(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return values.map(toQueryPair.curry(key)).join('&'); + } + return toQueryPair(key, values); + }).join('&'); + }, + + inspect: function() { + return '#'; + }, + + toJSON: function() { + return Object.toJSON(this.toObject()); + }, + + clone: function() { + return new Hash(this); + } + } +})()); + +Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; +Hash.from = $H; +var ObjectRange = Class.create(Enumerable, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +}; + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); + +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); + +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + // when GET, append parameters to URL + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if(readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + // DOM level 2 ECMAScript Language Binding + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + +(function() { + var element = this.Element; + this.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (Prototype.Browser.IE && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + Object.extend(this.Element, element || { }); +}).call(window); + +Element.cache = { }; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + content = Object.toHTML(content); + element.innerHTML = content.stripScripts(); + content.evalScripts.bind(content).defer(); + return element; + }, + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $(element).select("*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (Object.isString(selector)) + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = element.ancestors(); + return Object.isNumber(expression) ? ancestors[expression] : + Selector.findElement(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? element.descendants()[expression] : + element.select(expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = element.previousSiblings(); + return Object.isNumber(expression) ? previousSiblings[expression] : + Selector.findElement(previousSiblings, expression, index); + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = element.nextSiblings(); + return Object.isNumber(expression) ? nextSiblings[expression] : + Selector.findElement(nextSiblings, expression, index); + }, + + select: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + adjacent: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element.parentNode, args).without(element); + }, + + identify: function(element) { + element = $(element); + var id = element.readAttribute('id'), self = arguments.callee; + if (id) return id; + do { id = 'anonymous_element_' + self.counter++ } while ($(id)); + element.writeAttribute('id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!element.hasClassName(className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return element[element.hasClassName(className) ? + 'removeClassName' : 'addClassName'](className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + var originalAncestor = ancestor; + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (element.sourceIndex && !Prototype.Browser.Opera) { + var e = element.sourceIndex, a = ancestor.sourceIndex, + nextAncestor = ancestor.nextSibling; + if (!nextAncestor) { + do { ancestor = ancestor.parentNode; } + while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); + } + if (nextAncestor && nextAncestor.sourceIndex) + return (e > a && e < nextAncestor.sourceIndex); + } + + while (element = element.parentNode) + if (element == originalAncestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = element.cumulativeOffset(); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (element.getStyle('position') == 'absolute') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + var offsets = element.positionedOffset(); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (element.getStyle('position') == 'relative') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || element.tagName == 'BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + // find page position of source + source = $(source); + var p = source.viewportOffset(); + + // find coordinate system to use + element = $(element); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(element, 'position') == 'absolute') { + parent = element.getOffsetParent(); + delta = parent.viewportOffset(); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Element.Methods.identify.counter = 1; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + // returns '0px' for hidden elements; we want it to return null + if (!Element.visible(element)) return null; + + // returns the border-box dimensions rather than the content-box + // dimensions, so we subtract padding and borders from the value + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + // IE doesn't report offsets correctly for static elements, so we change them + // to "relative" to get the values, then change them back. + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + // Trigger hasLayout on the offset parent so that IE6 reports + // accurate offsetTop and offsetLeft values for position: fixed. + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = { + read: { + names: { + 'class': 'className', + 'for': 'htmlFor' + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: function(element, attribute) { + attribute = element.getAttribute(attribute); + return attribute ? attribute.toString().slice(23, -2) : null; + }, + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + }; + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr, + src: v._getAttr, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if(element.tagName == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + // Safari returns margins on body which is incorrect if the child is absolutely + // positioned. For performance reasons, redefine Element#cumulativeOffset for + // KHTML/WebKit only. + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if (Prototype.Browser.IE || Prototype.Browser.Opera) { + // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements + Element.Methods.update = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + + content = Object.toHTML(content); + var tagName = element.tagName.toUpperCase(); + + if (tagName in Element._insertionTranslations.tags) { + $A(element.childNodes).each(function(node) { element.removeChild(node) }); + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { element.appendChild(node) }); + } + else element.innerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +if ('outerHTML' in document.createElement('div')) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(); + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + t[2].times(function() { div = div.firstChild }); + } else div.innerHTML = html; + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
', 1], + TBODY: ['', '
', 2], + TR: ['', '
', 3], + TD: ['
', '
', 4], + SELECT: ['', 1] + } +}; + +(function() { + Object.extend(this.tags, { + THEAD: this.tags.TBODY, + TFOOT: this.tags.TBODY, + TH: this.tags.TD + }); +}).call(Element._insertionTranslations); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return node && node.specified; + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +if (!Prototype.BrowserFeatures.ElementExtensions && + document.createElement('div').__proto__) { + window.HTMLElement = { }; + window.HTMLElement.prototype = document.createElement('div').__proto__; + Prototype.BrowserFeatures.ElementExtensions = true; +} + +Element.extend = (function() { + if (Prototype.BrowserFeatures.SpecificElementExtensions) + return Prototype.K; + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || element._extendedByPrototype || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName, property, value; + + // extend methods for specific tags + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + for (property in methods) { + value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + // extend methods for all tags (Safari doesn't need this) + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + window[klass] = { }; + window[klass].prototype = document.createElement(tagName).__proto__; + return window[klass]; + } + + if (F.ElementExtensions) { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + +document.viewport = { + getDimensions: function() { + var dimensions = { }; + var B = Prototype.Browser; + $w('width height').each(function(d) { + var D = d.capitalize(); + dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] : + (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D]; + }); + return dimensions; + }, + + getWidth: function() { + return this.getDimensions().width; + }, + + getHeight: function() { + return this.getDimensions().height; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; +/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + this.compileMatcher(); + }, + + shouldUseXPath: function() { + if (!Prototype.BrowserFeatures.XPath) return false; + + var e = this.expression; + + // Safari 3 chokes on :*-of-type and :empty + if (Prototype.Browser.WebKit && + (e.include("-of-type") || e.include(":empty"))) + return false; + + // XPath can't do namespaced attributes, nor can it read + // the "checked" property from DOM nodes + if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) + return false; + + return true; + }, + + compileMatcher: function() { + if (this.shouldUseXPath()) + return this.compileXPathMatcher(); + + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; + return; + } + + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : + new Template(c[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.matcher.push("return h.unique(n);\n}"); + eval(this.matcher.join('\n')); + Selector._cache[this.expression] = this.matcher; + }, + + compileXPathMatcher: function() { + var e = this.expression, ps = Selector.patterns, + x = Selector.xpath, le, m; + + if (Selector._cache[e]) { + this.xpath = Selector._cache[e]; return; + } + + this.matcher = ['.//*']; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + if (m = e.match(ps[i])) { + this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : + new Template(x[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.xpath = this.matcher.join(''); + Selector._cache[this.expression] = this.xpath; + }, + + findElements: function(root) { + root = root || document; + if (this.xpath) return document._getElementsByXPath(this.xpath, root); + return this.matcher(root); + }, + + match: function(element) { + this.tokens = []; + + var e = this.expression, ps = Selector.patterns, as = Selector.assertions; + var le, p, m; + + while (e && le !== e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + // use the Selector.assertions methods unless the selector + // is too complex. + if (as[i]) { + this.tokens.push([i, Object.clone(m)]); + e = e.replace(m[0], ''); + } else { + // reluctantly do a document-wide search + // and look for a match in the array + return this.findElements(document).include(element); + } + } + } + } + + var match = true, name, matches; + for (var i = 0, token; token = this.tokens[i]; i++) { + name = token[0], matches = token[1]; + if (!Selector.assertions[name](element, matches)) { + match = false; break; + } + } + + return match; + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } +}); + +Object.extend(Selector, { + _cache: { }, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: function(m) { + m[1] = m[1].toLowerCase(); + return new Template("[@#{1}]").evaluate(m); + }, + attr: function(m) { + m[1] = m[1].toLowerCase(); + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (Object.isFunction(h)) return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", + 'checked': "[@checked]", + 'disabled': "[@disabled]", + 'enabled': "[not(@disabled)]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, v; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in p) { + if (m = e.match(p[i])) { + v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); + exclusion.push("(" + v.substring(1, v.length - 1) + ")"); + e = e.replace(m[0], ''); + break; + } + } + } + return "[not(" + exclusion.join(" and ") + ")]"; + }, + 'nth-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); + }, + 'nth-last-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); + }, + 'nth-of-type': function(m) { + return Selector.xpath.pseudos.nth("position() ", m); + }, + 'nth-last-of-type': function(m) { + return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); + }, + 'first-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); + }, + 'last-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); + }, + 'only-of-type': function(m) { + var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); + }, + nth: function(fragment, m) { + var mm, formula = m[6], predicate; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + if (mm = formula.match(/^(\d+)$/)) // digit only + return '[' + fragment + "= " + mm[1] + ']'; + if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (mm[1] == "-") mm[1] = -1; + var a = mm[1] ? Number(mm[1]) : 1; + var b = mm[2] ? Number(mm[2]) : 0; + predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + + "((#{fragment} - #{b}) div #{a} >= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: { + // combinators must be listed first + // (and descendant needs to be last combinator) + laterSibling: /^\s*~\s*/, + child: /^\s*>\s*/, + adjacent: /^\s*\+\s*/, + descendant: /^\s/, + + // selectors follow + tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, + id: /^#([\w\-\*]+)(\b|$)/, + className: /^\.([\w\-\*]+)(\b|$)/, + pseudo: +/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, + attrPresence: /^\[([\w]+)\]/, + attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ + }, + + // for Selector.match and Element#match + assertions: { + tagName: function(element, matches) { + return matches[1].toUpperCase() == element.tagName.toUpperCase(); + }, + + className: function(element, matches) { + return Element.hasClassName(element, matches[1]); + }, + + id: function(element, matches) { + return element.id === matches[1]; + }, + + attrPresence: function(element, matches) { + return Element.hasAttribute(element, matches[1]); + }, + + attr: function(element, matches) { + var nodeValue = Element.readAttribute(element, matches[1]); + return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); + } + }, + + handlers: { + // UTILITY FUNCTIONS + // joins two collections + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + // marks an array of nodes for counting + mark: function(nodes) { + var _true = Prototype.emptyFunction; + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = _true; + return nodes; + }, + + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = undefined; + return nodes; + }, + + // mark each child node with its position (for nth calls) + // "ofType" flag indicates whether we're indexing for nth-of-type + // rather than nth-child + index: function(parentNode, reverse, ofType) { + parentNode._countedByPrototype = Prototype.emptyFunction; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + var node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + }, + + // filters out duplicates and extends all nodes + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (!(n = nodes[i])._countedByPrototype) { + n._countedByPrototype = Prototype.emptyFunction; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + // COMBINATOR FUNCTIONS + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + // TOKEN FUNCTIONS + tagName: function(nodes, root, tagName, combinator) { + var uTagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + // fastlane for ordinary descendant combinators + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() === uTagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + if (!targetNode) return []; + if (!nodes && root == document) return [targetNode]; + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + // handles the an+b logic + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._countedByPrototype) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + // IE treats comments as element nodes + if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._countedByPrototype) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled) results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv.startsWith(v); }, + '$=': function(nv, v) { return nv.endsWith(v); }, + '*=': function(nv, v) { return nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } + }, + + split: function(expression) { + var expressions = []; + expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + return expressions; + }, + + matchElements: function(elements, expression) { + var matches = $$(expression), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._countedByPrototype) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (Object.isNumber(expression)) { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + expressions = Selector.split(expressions.join(',')); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +if (Prototype.Browser.IE) { + Object.extend(Selector.handlers, { + // IE returns comment nodes on getElementsByTagName("*"). + // Filter them out. + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + if (node.tagName !== "!") a.push(node); + return a; + }, + + // IE improperly serializes _countedByPrototype in (inner|outer)HTML. + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node.removeAttribute('_countedByPrototype'); + return nodes; + } + }); +} + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + // a key is already present; construct an array of values + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.blur(); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, index) { + if (Object.isUndefined(index)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, value, single = !Object.isArray(index); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + value = this.optionValue(opt); + if (single) { + if (value == index) { + opt.selected = true; + return; + } + } + else opt.selected = index.include(value); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) var Event = { }; + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: { }, + + relatedTarget: function(event) { + var element; + switch(event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } +}); + +Event.Methods = (function() { + var isButton; + + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + isButton = function(event, code) { + return event.button == buttonMap[code]; + }; + + } else if (Prototype.Browser.WebKit) { + isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + + } else { + isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + return { + isLeftClick: function(event) { return isButton(event, 0) }, + isMiddleClick: function(event) { return isButton(event, 1) }, + isRightClick: function(event) { return isButton(event, 2) }, + + element: function(event) { + var node = Event.extend(event).target; + return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); + }, + + findElement: function(event, expression) { + var element = Event.element(event); + if (!expression) return element; + var elements = [element].concat(element.ancestors()); + return Selector.findElement(elements, expression, 0); + }, + + pointer: function(event) { + return { + x: event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)), + y: event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)) + }; + }, + + pointerX: function(event) { return Event.pointer(event).x }, + pointerY: function(event) { return Event.pointer(event).y }, + + stop: function(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + event.stopped = true; + } + }; +})(); + +Event.extend = (function() { + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return "[object Event]" } + }); + + return function(event) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + Object.extend(event, { + target: event.srcElement, + relatedTarget: Event.relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + return Object.extend(event, methods); + }; + + } else { + Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; + Object.extend(Event.prototype, methods); + return Prototype.K; + } +})(); + +Object.extend(Event, (function() { + var cache = Event.cache; + + function getEventID(element) { + if (element._prototypeEventID) return element._prototypeEventID[0]; + arguments.callee.id = arguments.callee.id || 1; + return element._prototypeEventID = [++arguments.callee.id]; + } + + function getDOMEventName(eventName) { + if (eventName && eventName.include(':')) return "dataavailable"; + return eventName; + } + + function getCacheForID(id) { + return cache[id] = cache[id] || { }; + } + + function getWrappersForEventName(id, eventName) { + var c = getCacheForID(id); + return c[eventName] = c[eventName] || []; + } + + function createWrapper(element, eventName, handler) { + var id = getEventID(element); + var c = getWrappersForEventName(id, eventName); + if (c.pluck("handler").include(handler)) return false; + + var wrapper = function(event) { + if (!Event || !Event.extend || + (event.eventName && event.eventName != eventName)) + return false; + + Event.extend(event); + handler.call(element, event); + }; + + wrapper.handler = handler; + c.push(wrapper); + return wrapper; + } + + function findWrapper(id, eventName, handler) { + var c = getWrappersForEventName(id, eventName); + return c.find(function(wrapper) { return wrapper.handler == handler }); + } + + function destroyWrapper(id, eventName, handler) { + var c = getCacheForID(id); + if (!c[eventName]) return false; + c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); + } + + function destroyCache() { + for (var id in cache) + for (var eventName in cache[id]) + cache[id][eventName] = null; + } + + if (window.attachEvent) { + window.attachEvent("onunload", destroyCache); + } + + return { + observe: function(element, eventName, handler) { + element = $(element); + var name = getDOMEventName(eventName); + + var wrapper = createWrapper(element, eventName, handler); + if (!wrapper) return element; + + if (element.addEventListener) { + element.addEventListener(name, wrapper, false); + } else { + element.attachEvent("on" + name, wrapper); + } + + return element; + }, + + stopObserving: function(element, eventName, handler) { + element = $(element); + var id = getEventID(element), name = getDOMEventName(eventName); + + if (!handler && eventName) { + getWrappersForEventName(id, eventName).each(function(wrapper) { + element.stopObserving(eventName, wrapper.handler); + }); + return element; + + } else if (!eventName) { + Object.keys(getCacheForID(id)).each(function(eventName) { + element.stopObserving(eventName); + }); + return element; + } + + var wrapper = findWrapper(id, eventName, handler); + if (!wrapper) return element; + + if (element.removeEventListener) { + element.removeEventListener(name, wrapper, false); + } else { + element.detachEvent("on" + name, wrapper); + } + + destroyWrapper(id, eventName, handler); + + return element; + }, + + fire: function(element, eventName, memo) { + element = $(element); + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent("HTMLEvents"); + event.initEvent("dataavailable", true, true); + } else { + event = document.createEventObject(); + event.eventType = "ondataavailable"; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) { + element.dispatchEvent(event); + } else { + element.fireEvent(event.eventType, event); + } + + return Event.extend(event); + } + }; +})()); + +Object.extend(Event, Event.Methods); + +Element.addMethods({ + fire: Event.fire, + observe: Event.observe, + stopObserving: Event.stopObserving +}); + +Object.extend(document, { + fire: Element.Methods.fire.methodize(), + observe: Element.Methods.observe.methodize(), + stopObserving: Element.Methods.stopObserving.methodize(), + loaded: false +}); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards and John Resig. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearInterval(timer); + document.fire("dom:loaded"); + document.loaded = true; + } + + if (document.addEventListener) { + if (Prototype.Browser.WebKit) { + timer = window.setInterval(function() { + if (/loaded|complete/.test(document.readyState)) + fireContentLoadedEvent(); + }, 0); + + Event.observe(window, "load", fireContentLoadedEvent); + + } else { + document.addEventListener("DOMContentLoaded", + fireContentLoadedEvent, false); + } + + } else { + document.write(" + + diff --git a/magazyn.php b/magazyn.php new file mode 100644 index 0000000..6dbda85 --- /dev/null +++ b/magazyn.php @@ -0,0 +1,550 @@ + + + + + '; + $upra = mysql_query("select uprawnienia1 from uzytkownicy where id='".$_SESSION['id']."'"); + $u=mysql_fetch_array($upra); + if ($u[0]==1) + echo ' +

'; + else + echo '

'; + switch($_GET['kto']) + { + case "ustawienia": +echo ' + + +
+ +

'; + break; + + case "usun_jm": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update jm SET usun='1' where id_jm='".$_GET['id']."'"); + if($usun) + { + echo('


Jednostka zostało usunięte

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie mozna było usunąć jednostki

'); + } + break; + case "edytuj_jm": + if(isset($_GET['id'])) + jednostka_edycja($_GET['id']); + else + echo('

BRAK DANYCH

'); + break; + case "jm_lista": + jednostka(); + $jm=mysql_query("select id_jm,jm from jm where usun='0' order by jm asc"); + if(mysql_num_rows($jm)==0) + echo('


W bazie nie ma wprowadzonych danych

'); + else + { + $color=$color1; + echo '

Lista jednostek

'; + echo '
'; + while($j=mysql_fetch_array($jm)) + { + $color=zmien_color($color); + echo ''; + } + echo '
Nazwa jednostkiOpcje
 '.$j['jm'].'Edytuj | Usun


'; + } + break; + case "dodaj_jm": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select jm from jm where jm='".$_POST['jednostka']."' and usun='0' and id_jm <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['jednostka']))==0) + { + echo('

Musisz podać jednostkę !!!
'); + jednostka(); + } + else if (mysql_num_rows($pobierz_kategoria)>0) + { + echo('

Podane jednostka już istnieje !!!
'); + jednostka(); + } + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO jm ( `id_jm` , `jm` ) VALUES (NULL,'".$_POST['jednostka']."')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update jm SET jm='".$_POST['jednostka']."' where id_jm='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('

Jednostka została dodana

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie można było zapisać jednostki w bazie

'); + } + } + break; + case "magazyn_lista": + dodaj_magazyn(); + $magazyn=mysql_query("select * from magazyn where usun='0' order by nazwa asc"); + if(mysql_num_rows($magazyn)==0) + echo('


W bazie nie ma wprowadzonych danych

'); + else + { + $color=$color1; + echo '

Lista magazynów

'; + echo '
'; + while($m=mysql_fetch_array($magazyn)) + { + $color=zmien_color($color); + if($m['blok']=='TAK') + $color='red'; + $opcje2='Edytuj | '; + $opcje2.='Usuń | '; + if($m['blok']=='NIE') + $opcje2.='Blokuj'; + else if($m['blok']=='TAK') + $opcje2.='Odblokuj'; + echo ''; + } + echo '
KodNazwaOpcje
 '.$m['kod'].' '.$m['nazwa'].''.$opcje2.'


'; + } + break; + case "dodaj_magazyn": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select kod from magazyn where kod='".$_POST['kod']."' and usun='0' and id_mag <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['kod']))==0) + { + $blad=('

Musisz podać kod magazynu !!!
'); + } + else if (mysql_num_rows($pobierz_kategoria)>0) + { + $blad.=('

Podane jednostka już istnieje !!!
'); + } + if(strlen(trim($_POST['nazwa']))==0) + { + $blad.=('
Nie podano nazwy magazynu !!!
'); + } + if($blad) + { + uwaga($blad); + dodaj_magazyn(); + } + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO magazyn ( `id_mag` , `kod`, `nazwa`, `blok`, `usun` ) VALUES (NULL,'".$_POST['kod']."','".$_POST['nazwa']."','NIE','0')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update magazyn SET kod='".$_POST['kod']."',nazwa='".$_POST['nazwa']."' where id_mag='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('

Magazyn została dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie można było zapisać magazynu w bazie

'); + $_POST['stanowisko'] = ''; + } + } + break; + case "usun_magazyn": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update magazyn SET usun='1' where id_mag='".$_GET['id']."'"); + if($usun) + { + echo('


Magazyn zostało usunięte

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie mozna było usunąć magazynu

'); + } + break; +case "blok_magazyn": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $blok=mysql_query("update magazyn SET blok='TAK' where id_mag='".$_GET['id']."'"); + if($blok) + { + echo('


Magazyn został zablokowany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie można było zablokować magazynu

'); + } + break; +case "odblok_magazyn": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $blok=mysql_query("update magazyn SET blok='NIE' where id_mag='".$_GET['id']."'"); + if($blok) + { + echo('


Magazyn został odblokowany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('


Nie można było zablokować magazynu

'); + } + break; + case "edytuj_magazyn": + if(isset($_GET['id'])) + magazyn_edycja($_GET['id']); + else + echo('

BRAK DANYCH

'); + break; + case "struktura_lista": + dodaj_strukture(); +$okreg=mysql_query("select * from struktura where usun='0' and poziom=1 order by nazwa"); +if(mysql_num_rows($okreg)==0) + echo('


W bazie nie ma żadnych danych !!!

'); +else + { + $color=$color1; + echo '

Lista struktura

'; + echo '
'; + while($s=mysql_fetch_array($okreg)) + { + $color=zmien_color($color); + if ($s['glowna']==0) + { + $id_s = ''; + $glowna = ''; + $glowna = ''; + } + echo ''.$id_s.''.$glowna.''; + +$oddzial=mysql_query("select * from struktura where usun='0' and poziom=2 and id_kategori_wyzej='".$s['id_stru']."' order by nazwa"); + while($z=mysql_fetch_array($oddzial)) + { + $id_s = ''; + $glowna = ''; + echo ''.$id_s.''.$glowna.''; + +$agencja=mysql_query("select * from struktura where usun='0' and poziom=3 and id_kategori_wyzej='".$z['id_stru']."' order by nazwa"); + while($x=mysql_fetch_array($agencja)) + { + $id_s = ''; + $glowna = ''; + echo ''.$id_s.''.$glowna.''; + +$adres=mysql_query("select * from struktura where usun='0' and poziom=4 and id_kategori_wyzej='".$x['id_stru']."' order by nazwa"); + while($y=mysql_fetch_array($adres)) + { + $id_s = ''; + $glowna = ''; + echo ''.$id_s.''.$glowna.''; + } + } + } + } + echo '
IDNazwa grupy towarowejOpcje
'.$s['id_stru'].' '.$s['nazwa'].''; + } + else + { + $id_s = ''.$s['id_stru'].' '.$s['nazwa'].'
Edytuj | Usun
'.$z['id_stru'].' '.$s['nazwa'].' -> '.$z['nazwa'].'
Edytuj | Usun
'.$x['id_stru'].' '.$s['nazwa'].' -> '.$z['nazwa'].' - > '.$x['nazwa'].'
Edytuj | Usun
'.$y['id_stru'].' '.$s['nazwa'].' -> '.$z['nazwa'].' - > '.$x['nazwa'].' - > '.$y['nazwa'].'
Edytuj | Usun


'; + } + break; +case "dodaj_strukture": +if(!is_numeric($_GET['id'])) + $pobierz_strukture=mysql_query("select nazwa from struktura where nazwa='".$_POST['nazwa_struktury']."' and usun='0' and id_stru <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['nazwa_struktury']))==0) + { + echo ('

Musisz podać nazwę !!!

'); + dodaj_strukture(); + } + else if (mysql_num_rows($pobierz_strukture)>0) + { + echo ('

Podana nazwa juz istnieje !!!

'); + dodaj_strukture(); + } + else + { + { +if ($_POST['id_struktura']==0) +{ +$zapis_do_bazy=mysql_query("INSERT INTO struktura (`id_stru` ,`nazwa` ,`poziom` ,`id_kategori_wyzej`,`usun`) VALUES (NULL , '".$_POST['nazwa_struktury']."', '1', '0','0');"); + if($zapis_do_bazy) + { + uwaga('


Grupa towarowa została dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + uwaga('


Nie można było dodać grupy towarowej

'); +} +else +{ +$a=mysql_fetch_array(mysql_query("select poziom from struktura where id_stru='".$_POST['id_struktura']."'")); +if ($a['poziom']==1) +{ +$zapis_do_bazy=mysql_query("INSERT INTO struktura (`id_stru` ,`nazwa` ,`poziom` ,`id_kategori_wyzej`,`usun`) VALUES (NULL , '".$_POST['nazwa_struktury']."', '2', '".$_POST['id_struktura']."','0');"); + if($zapis_do_bazy) + { + uwaga('


Grupa towarowa została dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + uwaga('


Nie można było dodać grupy towarowej

'); +return; +} +if ($a['poziom']==2) +{ +$zapis_do_bazy=mysql_query("INSERT INTO struktura (`id_stru` ,`nazwa` ,`poziom` ,`id_kategori_wyzej`,`usun`) VALUES (NULL , '".$_POST['nazwa_struktury']."', '3', '".$_POST['id_struktura']."','0');"); + if($zapis_do_bazy) + { + uwaga('


Grupa towarowa została dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + uwaga('


Nie można było dodać grupy towarowej

'); +return; +} +if ($a['poziom']==3) +{ +$zapis_do_bazy=mysql_query("INSERT INTO struktura (`id_stru` ,`nazwa` ,`poziom` ,`id_kategori_wyzej`,`usun`) VALUES (NULL , '".$_POST['nazwa_struktury']."', '4', '".$_POST['id_struktura']."','0');"); + if($zapis_do_bazy) + { + uwaga('


Grupa towarowa została dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + uwaga('


Nie można było dodać grupy towarowej

'); +return; +} +} +} +} +break; +case "usun_strukture": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update struktura SET usun='1' where id_stru='".$_GET['id']."'"); + if($usun) + { + echo('

Grupa towarowa została usunięty

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + echo('

Nie można było usunąć grupy towarowej

'); + } + break; + case "edytuj_strukture": + if(!isset($_POST['edytuj_strukture'])) + edytuj_strukture($_GET['id']); + break; + case "edytuj_strukture2": + $pobierz_strukture=mysql_query("select nazwa from struktura where nazwa='".$_POST['nazwa_struktury']."' and usun='0' and id_stru <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['nazwa_struktury']))==0) + { + echo('

Musisz podać nazwę !!!

'); + edytuj_strukture($_GET['id']); + } + else + { + if($blad) + { + edytuj_strukture($_GET['id']); + } + $edytuj_strukture=mysql_query("update struktura SET nazwa='".$_POST['nazwa_struktury']."' where id_stru='".$_GET['id']."'"); + if($edytuj_strukture) + { + uwaga('


Zmiany zostały wprowadzone

'); + header('Refresh: 2; url=?co=magazyn&kto=ustawienia'); + } + else + { + uwaga('


Nie można było wprowadzić zmian

'); + } + } + break; + case "towary": +echo ' + +
+ +

'; + break; + case "dodaj_towar": + dodaj_towar(); + break; + case "dodaj_towar_2": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select kod from towar where kod='".$_POST['kod']."' and usun='0' and id_tow <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['kod']))==0) + { + $blad=('

Musisz podać kod towaru !!!
'); + } + else if (mysql_num_rows($pobierz_kategoria)>0) + { + $blad.=('

Podany kod już istnieje !!!
'); + } + if(strlen(trim($_POST['nazwa']))==0) + { + $blad.=('
Nie podano nazwy towaru !!!
'); + } + if(($_POST['id_jm'])==0) + { + $blad.=('
Nie wybrano jednostki !!!
'); + } + if(($_POST['id_stru'])==0) + { + $blad.=('
Nie wybrano grupy towarowej !!!
'); + } + if($blad) + { + uwaga($blad); + dodaj_towar(); + } + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO towar ( `id_tow` , `kod`, `nazwa`, `id_jm`, `id_stru`, `opis`,EAN, `blok`, `usun` ) VALUES (NULL,'".$_POST['kod']."','".$_POST['nazwa']."','".$_POST['id_jm']."','".$_POST['id_stru']."','".$_POST['opis']."','".$_POST['ean']."','NIE','0')"); + else if($_POST['id']>0) + $zapis_do_bazy=mysql_query("update towar SET kod='".$_POST['kod']."',nazwa='".$_POST['nazwa']."',ean='".$_POST['ean']."',id_jm='".$_POST['id_jm']."',id_stru='".$_POST['id_stru']."',opis='".$_POST['opis']."' where id_tow='".$_POST['id']."'"); + if($zapis_do_bazy) + { + echo('

Towar został dodany

'); + header('Refresh: 2; url=?co=magazyn&kto=towary'); + } + else + echo('


Nie można było zapisać towaru w bazie

'); + } + } + break; + case "lista_towar": + $towar=mysql_query("select a.id_tow,a.ean,b.jm,a.kod,c.nazwa as nazwa_gru,a.nazwa as nazwa_tow,a.id_jm,a.id_stru,a.opis,a.blok,a.usun,c.poziom,c.id_kategori_wyzej from towar a,jm b,struktura c where a.id_jm=b.id_jm and a.id_stru=c.id_stru and a.usun='0' order by a.kod asc"); + if(mysql_num_rows($towar)==0) + echo('


W bazie nie ma wprowadzonych danych

'); + else + { + $color=$color1; + echo '

Lista towarów

'; + echo '
Generuj plik PDF
'; + echo '
'; + while($t=mysql_fetch_array($towar)) + { + $color=zmien_color($color); + if ($t['poziom']==1) + $nazwa_gru = $t['nazwa_gru']; + if ($t['poziom']==2) + { + $poziom_1 = mysql_query("select nazwa from struktura where id_stru='".$t['id_kategori_wyzej']."' and poziom='1'"); + $p1=mysql_fetch_array($poziom_1); + $nazwa_gru = $p1[0].' - > '.$t['nazwa_gru']; + } + if ($t['poziom']==3) + { + $poziom_1 = mysql_query("select nazwa,id_kategori_wyzej from struktura where id_stru='".$t['id_kategori_wyzej']."' and poziom='2'"); + $p1=mysql_fetch_array($poziom_1); + $poziom_2 = mysql_query("select nazwa,id_stru from struktura where id_stru='".$p1[1]."' and poziom='1'"); + $p2=mysql_fetch_array($poziom_2); + $nazwa_gru = $p2[0].' - > '.$p1[0].' - > '.$t['nazwa_gru']; + } + if ($t['poziom']==4) + { + $poziom_1 = mysql_query("select nazwa,id_kategori_wyzej from struktura where id_stru='".$t['id_kategori_wyzej']."' and poziom='3'"); + $p1=mysql_fetch_array($poziom_1); + $poziom_2 = mysql_query("select nazwa,id_kategori_wyzej from struktura where id_stru='".$p1[1]."' and poziom='2'"); + $p2=mysql_fetch_array($poziom_2); + $poziom_3 = mysql_query("select nazwa,id_kategori_wyzej from struktura where id_stru='".$p2[1]."' and poziom='1'"); + $p3=mysql_fetch_array($poziom_3); + $nazwa_gru = $p3[0].' - > '.$p2[0].' - > '.$p1[0].' - > '.$t['nazwa_gru']; + } + if($t['blok']=='TAK') + $color='red'; + $opcje2='Pokaż | '; + $opcje2.='Historia | '; + $opcje2.='Zasoby | '; + $opcje2.='Edytuj | '; + $opcje2.='Usuń | '; + if($t['blok']=='NIE') + $opcje2.='Blokuj'; + else if($t['blok']=='TAK') + $opcje2.='Odblokuj'; + echo ''; + } + echo '
KodNazwaKod EANGrupa towarowaIloscOpcje
 '.$t['kod'].' '.$t['nazwa_tow'].' '.$t['ean'].' '.$nazwa_gru.' 11 '.$t['jm'].''.$opcje2.'


'; + } + break; +case "blokuj_towar": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $blok=mysql_query("update towar SET blok='TAK' where id_tow='".$_GET['id']."'"); + if($blok) + { + echo('

Towar został zablokowany

'); + header('Refresh: 2; url=?co=magazyn&kto=towary'); + } + else + echo('


Nie można było zablokować towaru

'); + } + break; +case "odblokuj_towar": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $blok=mysql_query("update towar SET blok='NIE' where id_tow='".$_GET['id']."'"); + if($blok) + { + echo('


Towar został odblokowany

'); + header('Refresh: 2; url=?co=magazyn&kto=towary'); + } + else + echo('


Nie można było zablokować towaru

'); + } + break; + case "usun_towar": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + // WARUNEK ZASOBY + $usun=mysql_query("update towar SET usun='1' where id_tow='".$_GET['id']."'"); + if($usun) + { + echo('


Towar zostało usunięte

'); + header('Refresh: 2; url=?co=magazyn&kto=towary'); + } + else + echo('


Nie mozna było usunąć towaru

'); + } + break; + case "zasoby_towar": + if(isset($_GET['id'])) + zasoby_towaru($_GET['id']); + break; + case "historia_towar": + if(isset($_GET['id'])) + historia_towar($_GET['id']); + break; + case "edytuj_towar": + if(isset($_GET['id'])) + edytuj_towar($_GET['id']); + else + echo('

BRAK DANYCH

'); + break; + } +?> \ No newline at end of file diff --git a/mail_class.php b/mail_class.php new file mode 100644 index 0000000..0499cf1 --- /dev/null +++ b/mail_class.php @@ -0,0 +1,105 @@ +type = $type; + $this->headers .= "From: " . $from . "\n"; + $this->headers .= "Reply-to: " . $replyto . "\n"; + $this->headers .= "X-Mailer: " . $this->xMailer . "\n"; + $this->headers .= "MIME-Version: 1.0\n"; + if ($type == 1) { // text/plain + $this->headers .= "Content-Type: text/plain; charset=iso-8859-2\n"; + } else { + srand((double)microtime() * 1000000); + $this->marker = md5(uniqid(rand())); + $this->headers .= "Content-Type: multipart/mixed;\n"; + $this->headers .= "\tboundary=\"___" . $this->marker . "==\"\n\n"; + $this->content = "--___" . $this->marker . "==\n"; + $this->content .= "Content-Type: text/plain; charset=\"iso-8859-2\"\n"; + $this->content .= "Content-Transfer-Encoding: 8bit\n\n"; + } + } + + function eMailAttachment($mimeType, $fileName, $data) + { + if ($this->type != 1) { + $this->content .= "\n\n--___" . $this->marker . "==\n"; + $this->content .= "Content-Type: " . $mimeType . "; name=\"" . $fileName . "\"\n"; + $this->content .= "Content-Transfer-Encoding: base64\n"; + $this->content .= "Content-Disposition: attachment; filename=\"" . $fileName . "\"\n\n"; + $this->content .= chunk_split(base64_encode($data)); + } + } + + function eMailSend($to) + { + if ($this->type != 1) { + $this->content .= "--___" . $this->marker . "==--\n\n"; // close marker + } + mail ($to, $this->subject, $this->content, $this->headers); + } + + function eMailContent($subject, $content) + { + $this->subject = $subject; + $this->content .= $content; + } +} + +$handle = fopen ("logo.jpg", "r"); +$logo = fread($handle, filesize("logo.jpg")); +fclose($handle); + +$tresc = 'Protokół wykonania usługi: + +Nr Zlecenia : '.$nrzlecenia.' +Data : '.$data.' + +Ulica : '.$ulica.' +Miejscowość : '.$miejscowosc.' +Nr seryjny : '.$nrseryjny.' +Typ : '.$typ.' + +WIADOMOŚĆ GENEROWANA AUTOMATYCZNIE - PROSIMY NA NIˇ NIE ODPOWIADAĆ + +System OnLine +MalComm +'; + +$wysylka = new eMail(2); // zwroc uwage na ustawienie typu 2 +$wysylka->eMailContent('Protokół wykonania usługi - nr zlecenia '.$nrzlecenia.'', $tresc); +//$wysylka->eMailAttachment('text/plain', 'mail.txt', 'Zawartość testowa'); +$wysylka->eMailAttachment('image/gif', 'protokol.jpg', $logo); +$wysylka->eMailSend('jakub.parlinski@malcomm.pl'); +} + +?> \ No newline at end of file diff --git a/mpdf.css b/mpdf.css new file mode 100644 index 0000000..b46d0d6 --- /dev/null +++ b/mpdf.css @@ -0,0 +1,20 @@ +/* + This is a secondary default stylesheet for mPDF + It will only parse element-level CSS here + Remove the comment marks below and edit as required +*/ + + + +/* + These values used to be the default prior to mPDF 4.2 + Altered to make appearance closer to that of browsers + Uncomment these lines to return to behaviour prior to v4.2 +*/ + + +/* +img { margin: 0.83em 0; vertical-align: bottom; } +table { margin: 0.5em; } +textarea { vertical-align: top; } +*/ diff --git a/mpdf.php b/mpdf.php new file mode 100644 index 0000000..dbe16fe --- /dev/null +++ b/mpdf.php @@ -0,0 +1,32723 @@ + * +// License: GPL * +// * +// Changes: See changelog.txt * +// ****************************************************************************** + + +define('mPDF_VERSION','5.7'); + +//Scale factor +define('_MPDFK', (72/25.4)); + +/*-- HTML-CSS --*/ +define('AUTOFONT_CJK',1); +define('AUTOFONT_THAIVIET',2); +define('AUTOFONT_RTL',4); +define('AUTOFONT_INDIC',8); +define('AUTOFONT_ALL',15); + +define('_BORDER_ALL',15); +define('_BORDER_TOP',8); +define('_BORDER_RIGHT',4); +define('_BORDER_BOTTOM',2); +define('_BORDER_LEFT',1); +/*-- END HTML-CSS --*/ + +if (!defined('_MPDF_PATH')) define('_MPDF_PATH', dirname(preg_replace('/\\\\/','/',__FILE__)) . '/'); +if (!defined('_MPDF_URI')) define('_MPDF_URI',_MPDF_PATH); + +require_once(_MPDF_PATH.'includes/functions.php'); +require_once(_MPDF_PATH.'config_cp.php'); + +if (!defined('_JPGRAPH_PATH')) define("_JPGRAPH_PATH", _MPDF_PATH.'jpgraph/'); + +if (!defined('_MPDF_TEMP_PATH')) define("_MPDF_TEMP_PATH", _MPDF_PATH.'tmp/'); + +if (!defined('_MPDF_TTFONTPATH')) { define('_MPDF_TTFONTPATH',_MPDF_PATH.'ttfonts/'); } +if (!defined('_MPDF_TTFONTDATAPATH')) { define('_MPDF_TTFONTDATAPATH',_MPDF_PATH.'ttfontdata/'); } + +$errorlevel=error_reporting(); +$errorlevel=error_reporting($errorlevel & ~E_NOTICE); + +//error_reporting(E_ALL); + +if(function_exists("date_default_timezone_set")) { + if (ini_get("date.timezone")=="") { date_default_timezone_set("Europe/London"); } +} +if (!function_exists("mb_strlen")) { die("Error - mPDF requires mb_string functions. Ensure that PHP is compiled with php_mbstring.dll enabled."); } + +if (!defined('PHP_VERSION_ID')) { + $version = explode('.', PHP_VERSION); + define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); +} +// Machine dependent number of bytes used to pack "double" into binary (used in cacheTables) +$test = pack("d", 134455.474557333333666); +define("_DSIZE", strlen($test)); + +class mPDF +{ + +/////////////////////////////// +// EXTERNAL (PUBLIC) VARIABLES +// Define these in config.php +/////////////////////////////// +var $CJKforceend; // mPDF 5.6.40 +// mPDF 5.6.34 +var $h2bookmarks; +var $h2toc; +var $decimal_align; // mPDF 5.6.13 +var $margBuffer; // mPDF 5.4.04 +var $splitTableBorderWidth; // mPDF 5.4.16 + +var $cacheTables; +var $bookmarkStyles; +var $useActiveForms; + +var $repackageTTF; +var $allowCJKorphans; +var $allowCJKoverflow; + +var $useKerning; +var $restrictColorSpace; +var $bleedMargin; +var $crossMarkMargin; +var $cropMarkMargin; +var $cropMarkLength; +var $nonPrintMargin; + +var $PDFX; +var $PDFXauto; + +var $PDFA; +var $PDFAauto; +var $ICCProfile; + +var $printers_info; +var $iterationCounter; +var $smCapsScale; +var $smCapsStretch; + +var $backupSubsFont; +var $backupSIPFont; +var $debugfonts; +var $useAdobeCJK; +var $percentSubset; +var $maxTTFFilesize; +var $BMPonly; + +var $tableMinSizePriority; + +var $dpi; +var $watermarkImgAlphaBlend; +var $watermarkImgBehind; +var $justifyB4br; +var $packTableData; +var $pgsIns; +var $simpleTables; +var $enableImports; + +var $debug; +var $showStats; +var $setAutoTopMargin; +var $setAutoBottomMargin; +var $autoMarginPadding; +var $collapseBlockMargins; +var $falseBoldWeight; +var $normalLineheight; +var $progressBar; +var $incrementFPR1; +var $incrementFPR2; +var $incrementFPR3; +var $incrementFPR4; + +var $SHYlang; +var $SHYleftmin; +var $SHYrightmin; +var $SHYcharmin; +var $SHYcharmax; +var $SHYlanguages; +// PageNumber Conditional Text +var $pagenumPrefix; +var $pagenumSuffix; +var $nbpgPrefix; +var $nbpgSuffix; +var $showImageErrors; +var $allow_output_buffering; +var $autoPadding; +var $useGraphs; +var $autoFontGroupSize; +var $tabSpaces; +var $useLang; +var $restoreBlockPagebreaks; +var $watermarkTextAlpha; +var $watermarkImageAlpha; +var $watermark_size; +var $watermark_pos; +var $annotSize; +var $annotMargin; +var $annotOpacity; +var $title2annots; +var $keepColumns; +var $keep_table_proportions; +var $ignore_table_widths; +var $ignore_table_percents; +var $list_align_style; +var $list_number_suffix; +var $useSubstitutions; +var $CSSselectMedia; + +var $forcePortraitHeaders; +var $forcePortraitMargins; +var $displayDefaultOrientation; +var $ignore_invalid_utf8; +var $allowedCSStags; +var $onlyCoreFonts; +var $allow_charset_conversion; + +var $jSWord; +var $jSmaxChar; +var $jSmaxCharLast; +var $jSmaxWordLast; + +var $max_colH_correction; + + +var $table_error_report; +var $table_error_report_param; +var $biDirectional; +var $text_input_as_HTML; +var $anchor2Bookmark; +var $list_indent_first_level; +var $shrink_tables_to_fit; + +var $allow_html_optional_endtags; + +var $img_dpi; + +var $defaultheaderfontsize; +var $defaultheaderfontstyle; +var $defaultheaderline; +var $defaultfooterfontsize; +var $defaultfooterfontstyle; +var $defaultfooterline; +var $header_line_spacing; +var $footer_line_spacing; + +var $pregUHCchars; +var $pregSJISchars; +var $pregCJKchars; +var $pregASCIIchars1; +var $pregASCIIchars2; +var $pregASCIIchars3; +var $pregVIETchars; +var $pregVIETPluschars; + +var $pregRTLchars; +var $pregHEBchars; +var $pregARABICchars; +var $pregNonARABICchars; +// INDIC +var $pregHIchars; +var $pregBNchars; +var $pregPAchars; +var $pregGUchars; +var $pregORchars; +var $pregTAchars; +var $pregTEchars; +var $pregKNchars; +var $pregMLchars; +var $pregSHchars; +var $pregINDextra; + +var $mirrorMargins; +var $default_lineheight_correction; +var $watermarkText; +var $watermarkImage; +var $showWatermarkText; +var $showWatermarkImage; + +var $fontsizes; + +// Aliases for backward compatability +var $UnvalidatedText; // alias = $watermarkText +var $TopicIsUnvalidated; // alias = $showWatermarkText +var $useOddEven; // alias = $mirrorMargins +var $useSubstitutionsMB; // alias = $useSubstitutions + + + +////////////////////// +// CLASS OBJECTS +////////////////////// +var $cssmgr; +var $grad; +var $bmp; +var $wmf; +var $tocontents; +var $form; +var $directw; + +////////////////////// +// INTERNAL VARIABLES +////////////////////// +var $writingToC; // mPDF 5.6.38 +// mPDF 5.6.01 +var $layers; +var $current_layer; +var $open_layer_pane; +var $decimal_offset; // mPDF 5.6.13 +var $inMeter; // mPDF 5.5.09 + +var $CJKleading; +var $CJKfollowing; +var $CJKoverflow; + +var $textshadow; + +var $colsums; +var $spanborder; +var $spanborddet; + +var $visibility; + +var $useRC128encryption; +var $uniqid; + +var $kerning; +var $fixedlSpacing; +var $minwSpacing; +var $lSpacingCSS; +var $wSpacingCSS; + +var $listDir; +var $spotColorIDs; +var $SVGcolors; +var $spotColors; +var $defTextColor; +var $defDrawColor; +var $defFillColor; + +var $tableBackgrounds; +var $inlineDisplayOff; +var $kt_y00; +var $kt_p00; +var $upperCase; +var $checkSIP; +var $checkSMP; +var $checkCJK; +var $tableCJK; + +var $watermarkImgAlpha; +var $PDFAXwarnings; +var $MetadataRoot; +var $OutputIntentRoot; +var $InfoRoot; +var $current_filename; +var $parsers; +var $current_parser; +var $_obj_stack; +var $_don_obj_stack; +var $_current_obj_id; +var $tpls; +var $tpl; +var $tplprefix; +var $_res; + +var $pdf_version; +var $noImageFile; +var $lastblockbottommargin; +var $baselineC; +var $subPos; +var $subArrMB; +var $ReqFontStyle; +var $tableClipPath ; +var $forceExactLineheight; +var $listOcc; + +var $fullImageHeight; +var $inFixedPosBlock; // Internal flag for position:fixed block +var $fixedPosBlock; // Buffer string for position:fixed block +var $fixedPosBlockDepth; +var $fixedPosBlockBBox; +var $fixedPosBlockSave; +var $maxPosL; +var $maxPosR; + +var $loaded; + +var $extraFontSubsets; +var $docTemplateStart; // Internal flag for page (page no. -1) that docTemplate starts on +var $time0; + +// Classes +var $indic; +var $barcode; + +var $SHYpatterns; +var $loadedSHYpatterns; +var $loadedSHYdictionary; +var $SHYdictionary; +var $SHYdictionaryWords; + +var $spanbgcolorarray; +var $default_font; +var $list_lineheight; +var $headerbuffer; +var $lastblocklevelchange; +var $nestedtablejustfinished; +var $linebreakjustfinished; +var $cell_border_dominance_L; +var $cell_border_dominance_R; +var $cell_border_dominance_T; +var $cell_border_dominance_B; +var $table_keep_together; +var $plainCell_properties; +var $inherit_lineheight; +var $listitemtype; +var $shrin_k1; +var $outerfilled; + +var $blockContext; +var $floatDivs; + + +var $patterns; +var $pageBackgrounds; + +var $bodyBackgroundGradient; +var $bodyBackgroundImage; +var $bodyBackgroundColor; + +var $writingHTMLheader; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block +var $writingHTMLfooter; +var $autoFontGroups; +var $angle; + +var $gradients; + +var $kwt_Reference; +var $kwt_BMoutlines; +var $kwt_toc; + +var $tbrot_Reference; +var $tbrot_BMoutlines; +var $tbrot_toc; + +var $col_Reference; +var $col_BMoutlines; +var $col_toc; + +var $currentGraphId; +var $graphs; + +var $floatbuffer; +var $floatmargins; + +var $bullet; +var $bulletarray; + +var $rtlAsArabicFarsi; // DEPRACATED + +var $currentLang; +var $default_lang; +var $default_available_fonts; +var $pageTemplate; +var $docTemplate; +var $docTemplateContinue; + +var $arabGlyphs; +var $arabHex; +var $persianGlyphs; +var $persianHex; +var $arabVowels; +var $arabPrevLink; +var $arabNextLink; + + +var $formobjects; // array of Form Objects for WMF +var $InlineProperties; +var $InlineAnnots; +var $ktAnnots; +var $tbrot_Annots; +var $kwt_Annots; +var $columnAnnots; +var $columnForms; + +var $PageAnnots; + +var $pageDim; // Keep track of page wxh for orientation changes - set in _beginpage, used in _putannots + +var $breakpoints; + +var $tableLevel; +var $tbctr; +var $innermostTableLevel; +var $saveTableCounter; +var $cellBorderBuffer; + +var $saveHTMLFooter_height; +var $saveHTMLFooterE_height; + +var $firstPageBoxHeader; +var $firstPageBoxHeaderEven; +var $firstPageBoxFooter; +var $firstPageBoxFooterEven; + +var $page_box; +var $show_marks; // crop or cross marks + +var $basepathIsLocal; + +var $use_kwt; +var $kwt; +var $kwt_height; +var $kwt_y0; +var $kwt_x0; +var $kwt_buffer; +var $kwt_Links; +var $kwt_moved; +var $kwt_saved; + +var $PageNumSubstitutions; + +var $table_borders_separate; +var $base_table_properties; +var $borderstyles; + +var $listjustfinished; +var $blockjustfinished; + +var $orig_bMargin; +var $orig_tMargin; +var $orig_lMargin; +var $orig_rMargin; +var $orig_hMargin; +var $orig_fMargin; + +var $pageheaders; +var $pagefooters; + +var $pageHTMLheaders; +var $pageHTMLfooters; + +var $saveHTMLHeader; +var $saveHTMLFooter; + +var $HTMLheaderPageLinks; +var $HTMLheaderPageAnnots; +var $HTMLheaderPageForms; + +// See config_fonts.php for these next 5 values +var $available_unifonts; +var $sans_fonts; +var $serif_fonts; +var $mono_fonts; +var $defaultSubsFont; + +// List of ALL available CJK fonts (incl. styles) (Adobe add-ons) hw removed +var $available_CJK_fonts; + +var $HTMLHeader; +var $HTMLFooter; +var $HTMLHeaderE; +var $HTMLFooterE; +var $bufferoutput; + +var $showdefaultpagenos; // DEPRACATED -left for backward compatability + + +// CJK fonts +var $Big5_widths; +var $GB_widths; +var $SJIS_widths; +var $UHC_widths; + +// SetProtection +var $encrypted; //whether document is protected +var $Uvalue; //U entry in pdf document +var $Ovalue; //O entry in pdf document +var $Pvalue; //P entry in pdf document +var $enc_obj_id; //encryption object id +var $last_rc4_key; //last RC4 key encrypted (cached for optimisation) +var $last_rc4_key_c; //last RC4 computed key +var $encryption_key; +var $padding; //used for encryption + + +// Bookmark +var $BMoutlines; +var $OutlineRoot; +// INDEX +var $ColActive; +var $Reference; +var $CurrCol; +var $NbCol; +var $y0; //Top ordinate of columns +var $ColL; +var $ColWidth; +var $ColGap; +// COLUMNS +var $ColR; +var $ChangeColumn; +var $columnbuffer; +var $ColDetails; +var $columnLinks; +var $colvAlign; +// Substitutions +var $substitute; // Array of substitution strings e.g. 112 +var $entsearch; // Array of HTML entities (>ASCII 127) to substitute +var $entsubstitute; // Array of substitution decimal unicode for the Hi entities + + +// Default values if no style sheet offered (cf. http://www.w3.org/TR/CSS21/sample.html) +var $defaultCSS; + +var $linemaxfontsize; +var $lineheight_correction; +var $lastoptionaltag; // Save current block item which HTML specifies optionsl endtag +var $pageoutput; +var $charset_in; +var $blk; +var $blklvl; +var $ColumnAdjust; +var $ws; // Word spacing +var $HREF; +var $pgwidth; +var $fontlist; +var $oldx; +var $oldy; +var $B; +var $U; //underlining flag +var $S; // SmallCaps flag +var $I; + +var $tdbegin; +var $table; +var $cell; +var $col; +var $row; + +var $divbegin; +var $divalign; +var $divwidth; +var $divheight; +var $divrevert; +var $spanbgcolor; + +var $spanlvl; +var $listlvl; +var $listnum; +var $listtype; +var $listoccur; +var $listlist; +var $listitem; + +var $pjustfinished; +var $ignorefollowingspaces; +var $SUP; +var $SUB; +var $SMALL; +var $BIG; +var $toupper; +var $tolower; +var $capitalize; +var $dash_on; +var $dotted_on; +var $strike; + +var $textbuffer; +var $currentfontstyle; +var $currentfontfamily; +var $currentfontsize; +var $colorarray; +var $bgcolorarray; +var $internallink; +var $enabledtags; + +var $lineheight; +var $basepath; +var $textparam; + +var $specialcontent; +var $selectoption; +var $objectbuffer; + +// Table Rotation +var $table_rotate; +var $tbrot_maxw; +var $tbrot_maxh; +var $tablebuffer; +var $tbrot_align; +var $tbrot_Links; + +var $divbuffer; // Buffer used when keeping DIV on one page +var $keep_block_together; // Keep a Block from page-break-inside: avoid +var $ktLinks; // Keep-together Block links array +var $ktBlock; // Keep-together Block array +var $ktForms; +var $ktReference; +var $ktBMoutlines; +var $_kttoc; + +var $tbrot_y0; +var $tbrot_x0; +var $tbrot_w; +var $tbrot_h; + +var $mb_enc; +var $directionality; + +var $extgstates; // Used for alpha channel - Transparency (Watermark) +var $mgl; +var $mgt; +var $mgr; +var $mgb; + +var $tts; +var $ttz; +var $tta; + +var $headerDetails; +var $footerDetails; + +// Best to alter the below variables using default stylesheet above +var $page_break_after_avoid; +var $margin_bottom_collapse; +var $list_indent; +var $list_align; +var $list_margin_bottom; +var $default_font_size; // in pts +var $original_default_font_size; // used to save default sizes when using table default +var $original_default_font; +var $watermark_font; +var $defaultAlign; + +// TABLE +var $defaultTableAlign; +var $tablethead; +var $thead_font_weight; +var $thead_font_style; +var $thead_font_smCaps; +var $thead_valign_default; +var $thead_textalign_default; +var $tabletfoot; +var $tfoot_font_weight; +var $tfoot_font_style; +var $tfoot_font_smCaps; +var $tfoot_valign_default; +var $tfoot_textalign_default; + +var $trow_text_rotate; + +var $cellPaddingL; +var $cellPaddingR; +var $cellPaddingT; +var $cellPaddingB; +var $table_lineheight; +var $table_border_attr_set; +var $table_border_css_set; + +var $shrin_k; // factor with which to shrink tables - used internally - do not change +var $shrink_this_table_to_fit; // 0 or false to disable; value (if set) gives maximum factor to reduce fontsize +var $MarginCorrection; // corrects for OddEven Margins +var $margin_footer; +var $margin_header; + +var $tabletheadjustfinished; +var $usingCoreFont; +var $charspacing; + +//Private properties FROM FPDF +var $DisplayPreferences; +var $flowingBlockAttr; +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; +var $fhPt; //dimensions of page format in points +var $fw; +var $fh; //dimensions of page format in user unit +var $wPt; +var $hPt; //current dimensions of page in points +var $w; +var $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 $cMarginL; //cell margin Left +var $cMarginR; //cell margin Right +var $cMarginT; //cell margin Left +var $cMarginB; //cell margin Right +var $DeflMargin; //Default left margin +var $DefrMargin; //Default right margin +var $x; +var $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 $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 $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 $autoPageBreak; //automatic page breaking +var $PageBreakTrigger; //threshold used to trigger page breaks +var $InFooter; //flag set when processing footer +var $InHTMLFooter; + +var $processingFooter; //flag set when processing footer - added for columns +var $processingHeader; //flag set when processing header - added for columns +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 $aliasNbPg; //alias for total number of pages +var $aliasNbPgGp; //alias for total number of pages in page group +var $aliasNbPgHex; +var $aliasNbPgGpHex; + +var $ispre; + +var $outerblocktags; +var $innerblocktags; + + +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** + +function mPDF($mode='',$format='A4',$default_font_size=0,$default_font='',$mgl=15,$mgr=15,$mgt=16,$mgb=16,$mgh=9,$mgf=9, $orientation='P') { + +/*-- BACKGROUNDS --*/ + if (!class_exists('grad', false)) { include(_MPDF_PATH.'classes/grad.php'); } + if (empty($this->grad)) { $this->grad = new grad($this); } +/*-- END BACKGROUNDS --*/ +/*-- FORMS --*/ + if (!class_exists('form', false)) { include(_MPDF_PATH.'classes/form.php'); } + if (empty($this->form)) { $this->form = new form($this); } +/*-- END FORMS --*/ + + $this->time0 = microtime(true); + //Some checks + $this->_dochecks(); + + // Set up Aliases for backwards compatability + $this->UnvalidatedText =& $this->watermarkText; + $this->TopicIsUnvalidated =& $this->showWatermarkText; + $this->AliasNbPg =& $this->aliasNbPg; + $this->AliasNbPgGp =& $this->aliasNbPgGp; + $this->BiDirectional =& $this->biDirectional; + $this->Anchor2Bookmark =& $this->anchor2Bookmark; + $this->KeepColumns =& $this->keepColumns; + $this->useOddEven =& $this->mirrorMargins; + $this->useSubstitutionsMB =& $this->useSubstitutions; + + $this->writingToC = false; // mPDF 5.6.38 + // mPDF 5.6.01 + $this->layers = array(); + $this->current_layer = 0; + $this->open_layer_pane = false; + + $this->visibility='visible'; + + //Initialization of properties + $this->spotColors=array(); + $this->spotColorIDs = array(); + $this->tableBackgrounds = array(); + + $this->kt_y00 = ''; + $this->kt_p00 = ''; + $this->iterationCounter = false; + $this->BMPonly = array(); + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->objectbuffer = array(); + $this->pages=array(); + $this->OrientationChanges=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->images=array(); + $this->links=array(); + $this->InFooter=false; + $this->processingFooter=false; + $this->processingHeader=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=9; + $this->U=false; + // Small Caps + $this->upperCase = array(); + $this->S = false; + $this->smCapsScale = 1; + $this->smCapsStretch = 100; + $this->margBuffer = 0; // mPDF 5.4.04 + $this->inMeter = false; // mPDF 5.5.09 + $this->decimal_offset = 0; + + $this->defTextColor = $this->TextColor = $this->SetTColor($this->ConvertColor(0),true); + $this->defDrawColor = $this->DrawColor = $this->SetDColor($this->ConvertColor(0),true); + $this->defFillColor = $this->FillColor = $this->SetFColor($this->ConvertColor(255),true); + + //SVG color names array + //http://www.w3schools.com/css/css_colornames.asp + $this->SVGcolors = array('antiquewhite'=>'#FAEBD7','aqua'=>'#00FFFF','aquamarine'=>'#7FFFD4','beige'=>'#F5F5DC','black'=>'#000000', +'blue'=>'#0000FF','brown'=>'#A52A2A','cadetblue'=>'#5F9EA0','chocolate'=>'#D2691E','cornflowerblue'=>'#6495ED','crimson'=>'#DC143C', +'darkblue'=>'#00008B','darkgoldenrod'=>'#B8860B','darkgreen'=>'#006400','darkmagenta'=>'#8B008B','darkorange'=>'#FF8C00', +'darkred'=>'#8B0000','darkseagreen'=>'#8FBC8F','darkslategray'=>'#2F4F4F','darkviolet'=>'#9400D3','deepskyblue'=>'#00BFFF', +'dodgerblue'=>'#1E90FF','firebrick'=>'#B22222','forestgreen'=>'#228B22','fuchsia'=>'#FF00FF','gainsboro'=>'#DCDCDC','gold'=>'#FFD700', +'gray'=>'#808080','green'=>'#008000','greenyellow'=>'#ADFF2F','hotpink'=>'#FF69B4','indigo'=>'#4B0082','khaki'=>'#F0E68C', +'lavenderblush'=>'#FFF0F5','lemonchiffon'=>'#FFFACD','lightcoral'=>'#F08080','lightgoldenrodyellow'=>'#FAFAD2','lightgreen'=>'#90EE90', +'lightsalmon'=>'#FFA07A','lightskyblue'=>'#87CEFA','lightslategray'=>'#778899','lightyellow'=>'#FFFFE0','lime'=>'#00FF00','limegreen'=>'#32CD32', +'magenta'=>'#FF00FF','maroon'=>'#800000','mediumaquamarine'=>'#66CDAA','mediumorchid'=>'#BA55D3','mediumseagreen'=>'#3CB371', +'mediumspringgreen'=>'#00FA9A','mediumvioletred'=>'#C71585','midnightblue'=>'#191970','mintcream'=>'#F5FFFA','moccasin'=>'#FFE4B5','navy'=>'#000080', +'olive'=>'#808000','orange'=>'#FFA500','orchid'=>'#DA70D6','palegreen'=>'#98FB98', +'palevioletred'=>'#D87093','peachpuff'=>'#FFDAB9','pink'=>'#FFC0CB','powderblue'=>'#B0E0E6','purple'=>'#800080', +'red'=>'#FF0000','royalblue'=>'#4169E1','salmon'=>'#FA8072','seagreen'=>'#2E8B57','sienna'=>'#A0522D','silver'=>'#C0C0C0','skyblue'=>'#87CEEB', +'slategray'=>'#708090','springgreen'=>'#00FF7F','steelblue'=>'#4682B4','tan'=>'#D2B48C','teal'=>'#008080','thistle'=>'#D8BFD8','turquoise'=>'#40E0D0', +'violetred'=>'#D02090','white'=>'#FFFFFF','yellow'=>'#FFFF00', +'aliceblue'=>'#f0f8ff', 'azure'=>'#f0ffff', 'bisque'=>'#ffe4c4', 'blanchedalmond'=>'#ffebcd', 'blueviolet'=>'#8a2be2', 'burlywood'=>'#deb887', +'chartreuse'=>'#7fff00', 'coral'=>'#ff7f50', 'cornsilk'=>'#fff8dc', 'cyan'=>'#00ffff', 'darkcyan'=>'#008b8b', 'darkgray'=>'#a9a9a9', +'darkgrey'=>'#a9a9a9', 'darkkhaki'=>'#bdb76b', 'darkolivegreen'=>'#556b2f', 'darkorchid'=>'#9932cc', 'darksalmon'=>'#e9967a', +'darkslateblue'=>'#483d8b', 'darkslategrey'=>'#2f4f4f', 'darkturquoise'=>'#00ced1', 'deeppink'=>'#ff1493', 'dimgray'=>'#696969', +'dimgrey'=>'#696969', 'floralwhite'=>'#fffaf0', 'ghostwhite'=>'#f8f8ff', 'goldenrod'=>'#daa520', 'grey'=>'#808080', 'honeydew'=>'#f0fff0', +'indianred'=>'#cd5c5c', 'ivory'=>'#fffff0', 'lavender'=>'#e6e6fa', 'lawngreen'=>'#7cfc00', 'lightblue'=>'#add8e6', 'lightcyan'=>'#e0ffff', +'lightgray'=>'#d3d3d3', 'lightgrey'=>'#d3d3d3', 'lightpink'=>'#ffb6c1', 'lightseagreen'=>'#20b2aa', 'lightslategrey'=>'#778899', +'lightsteelblue'=>'#b0c4de', 'linen'=>'#faf0e6', 'mediumblue'=>'#0000cd', 'mediumpurple'=>'#9370db', 'mediumslateblue'=>'#7b68ee', +'mediumturquoise'=>'#48d1cc', 'mistyrose'=>'#ffe4e1', 'navajowhite'=>'#ffdead', 'oldlace'=>'#fdf5e6', 'olivedrab'=>'#6b8e23', 'orangered'=>'#ff4500', +'palegoldenrod'=>'#eee8aa', 'paleturquoise'=>'#afeeee', 'papayawhip'=>'#ffefd5', 'peru'=>'#cd853f', 'plum'=>'#dda0dd', 'rosybrown'=>'#bc8f8f', +'saddlebrown'=>'#8b4513', 'sandybrown'=>'#f4a460', 'seashell'=>'#fff5ee', 'slateblue'=>'#6a5acd', 'slategrey'=>'#708090', 'snow'=>'#fffafa', +'tomato'=>'#ff6347', 'violet'=>'#ee82ee', 'wheat'=>'#f5deb3', 'whitesmoke'=>'#f5f5f5', 'yellowgreen'=>'#9acd32'); + + $this->ColorFlag=false; + $this->extgstates = array(); + + $this->mb_enc='windows-1252'; + $this->directionality='ltr'; + $this->defaultAlign = 'L'; + $this->defaultTableAlign = 'L'; + + $this->fixedPosBlockSave = array(); + $this->extraFontSubsets = 0; + + $this->SHYpatterns = array(); + $this->loadedSHYdictionary = false; + $this->SHYdictionary = array(); + $this->SHYdictionaryWords = array(); + $this->blockContext = 1; + $this->floatDivs = array(); + $this->DisplayPreferences=''; + + $this->patterns = array(); // Tiling patterns used for backgrounds + $this->pageBackgrounds = array(); + $this->writingHTMLheader = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block + $this->writingHTMLfooter = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block + $this->gradients = array(); + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->graphs = array(); + + $this->pgsIns = array(); + $this->PDFAXwarnings = array(); + $this->inlineDisplayOff = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + + $this->baselineC = 0.35; // Baseline for text + $this->noImageFile = str_replace("\\","/",dirname(__FILE__)) . '/includes/no_image.jpg'; + $this->subPos = 0; + $this->forceExactLineheight = false; + $this->listOcc = 0; + $this->normalLineheight = 1.3; + // These are intended as configuration variables, and should be set in config.php - which will override these values; + // set here as failsafe as will cause an error if not defined + $this->incrementFPR1 = 10; + $this->incrementFPR2 = 10; + $this->incrementFPR3 = 10; + $this->incrementFPR4 = 10; + + $this->fullImageHeight = false; + $this->floatbuffer = array(); + $this->floatmargins = array(); + $this->autoFontGroups = 0; + $this->formobjects=array(); // array of Form Objects for WMF + $this->InlineProperties=array(); + $this->InlineAnnots=array(); + $this->ktAnnots=array(); + $this->tbrot_Annots=array(); + $this->kwt_Annots=array(); + $this->columnAnnots=array(); + $this->pageDim=array(); + $this->breakpoints = array(); // used in columnbuffer + $this->tableLevel=0; + $this->tbctr=array(); // counter for nested tables at each level + $this->page_box = array(); + $this->show_marks = ''; // crop or cross marks + $this->kwt = false; + $this->kwt_height = 0; + $this->kwt_y0 = 0; + $this->kwt_x0 = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + $this->PageNumSubstitutions = array(); + $this->base_table_properties=array(); + $this->borderstyles = array('inset','groove','outset','ridge','dotted','dashed','solid','double'); + $this->tbrot_align = 'C'; + $this->pageheaders=array(); + $this->pagefooters=array(); + + $this->pageHTMLheaders=array(); + $this->pageHTMLfooters=array(); + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + + $this->ktForms = array(); + $this->HTMLheaderPageForms = array(); + $this->columnForms = array(); + $this->tbrotForms = array(); + $this->useRC128encryption = false; + $this->uniqid = ''; + + $this->bufferoutput = false; + $this->encrypted=false; //whether document is protected + $this->BMoutlines=array(); + $this->ColActive=0; //Flag indicating that columns are on (the index is being processed) + $this->Reference=array(); //Array containing the references + $this->CurrCol=0; //Current column number + $this->ColL = array(0); // Array of Left pos of columns - absolute - needs Margin correction for Odd-Even + $this->ColR = array(0); // Array of Right pos of columns - absolute pos - needs Margin correction for Odd-Even + $this->ChangeColumn = 0; + $this->columnbuffer = array(); + $this->ColDetails = array(); // Keeps track of some column details + $this->columnLinks = array(); // Cross references PageLinks + $this->substitute = array(); // Array of substitution strings e.g. 112 + $this->entsearch = array(); // Array of HTML entities (>ASCII 127) to substitute + $this->entsubstitute = array(); // Array of substitution decimal unicode for the Hi entities + $this->lastoptionaltag = ''; + $this->charset_in = ''; + $this->blk = array(); + $this->blklvl = 0; + $this->tts = false; + $this->ttz = false; + $this->tta = false; + $this->ispre=false; + + $this->checkSIP = false; + $this->checkSMP = false; + $this->checkCJK = false; + $this->tableCJK = false; + + $this->headerDetails=array(); + $this->footerDetails=array(); + $this->page_break_after_avoid = false; + $this->margin_bottom_collapse = false; + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->table_border_attr_set = 0; + $this->table_border_css_set = 0; + $this->shrin_k = 1.0; + $this->shrink_this_table_to_fit = 0; + $this->MarginCorrection = 0; + + $this->tabletheadjustfinished = false; + $this->usingCoreFont = false; + $this->charspacing=0; + + $this->autoPageBreak = true; + + require(_MPDF_PATH.'config.php'); // config data + + $this->_setPageSize($format, $orientation); + $this->DefOrientation=$orientation; + + $this->margin_header=$mgh; + $this->margin_footer=$mgf; + + $bmargin=$mgb; + + $this->DeflMargin = $mgl; + $this->DefrMargin = $mgr; + + $this->orig_tMargin = $mgt; + $this->orig_bMargin = $bmargin; + $this->orig_lMargin = $this->DeflMargin; + $this->orig_rMargin = $this->DefrMargin; + $this->orig_hMargin = $this->margin_header; + $this->orig_fMargin = $this->margin_footer; + + if ($this->setAutoTopMargin=='pad') { $mgt += $this->margin_header; } + if ($this->setAutoBottomMargin=='pad') { $mgb += $this->margin_footer; } + $this->SetMargins($this->DeflMargin,$this->DefrMargin,$mgt); // sets l r t margin + //Automatic page break + $this->SetAutoPageBreak($this->autoPageBreak,$bmargin); // sets $this->bMargin & PageBreakTrigger + + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + + //Interior cell margin (1 mm) ? not used + $this->cMarginL = 1; + $this->cMarginR = 1; + //Line width (0.2 mm) + $this->LineWidth=.567/_MPDFK; + + //To make the function Footer() work - replaces {nb} with page number + $this->AliasNbPages(); + $this->AliasNbPageGroups(); + + $this->aliasNbPgHex = '{nbHEXmarker}'; + $this->aliasNbPgGpHex = '{nbpgHEXmarker}'; + + //Enable all tags as default + $this->DisableTags(); + //Full width display mode + $this->SetDisplayMode(100); // fullwidth? 'fullpage' + //Compression + $this->SetCompression(true); + //Set default display preferences + $this->SetDisplayPreferences(''); + + // Font data + require(_MPDF_PATH.'config_fonts.php'); + // Available fonts + $this->available_unifonts = array(); + foreach ($this->fontdata AS $f => $fs) { + if (isset($fs['R']) && $fs['R']) { $this->available_unifonts[] = $f; } + if (isset($fs['B']) && $fs['B']) { $this->available_unifonts[] = $f.'B'; } + if (isset($fs['I']) && $fs['I']) { $this->available_unifonts[] = $f.'I'; } + if (isset($fs['BI']) && $fs['BI']) { $this->available_unifonts[] = $f.'BI'; } + } + + $this->default_available_fonts = $this->available_unifonts; + + $optcore = false; + $onlyCoreFonts = false; + if (preg_match('/([\-+])aCJK/i',$mode, $m)) { + preg_replace('/([\-+])aCJK/i','',$mode); + if ($m[1]=='+') { $this->useAdobeCJK = true; } + else { $this->useAdobeCJK = false; } + } + + if (strlen($mode)==1) { + if ($mode=='s') { $this->percentSubset = 100; $mode = ''; } + else if ($mode=='c') { $onlyCoreFonts = true; $mode = ''; } + } + else if (substr($mode,-2)=='-s') { + $this->percentSubset = 100; + $mode = substr($mode,0,strlen($mode)-2); + } + else if (substr($mode,-2)=='-c') { + $onlyCoreFonts = true; + $mode = substr($mode,0,strlen($mode)-2); + } + else if (substr($mode,-2)=='-x') { + $optcore = true; + $mode = substr($mode,0,strlen($mode)-2); + } + + // Autodetect if mode is a language_country string (en-GB or en_GB or en) + if ((strlen($mode) == 5 && $mode != 'UTF-8') || strlen($mode) == 2) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($mode, $this->useAdobeCJK); + if ($coreSuitable && $optcore) { $onlyCoreFonts = true; } + if ($mpdf_pdf_unifonts) { + $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); + $this->default_available_fonts = $mpdf_pdf_unifonts; + } + $this->currentLang = $mode; + $this->default_lang = $mode; + } + + $this->onlyCoreFonts = $onlyCoreFonts; + + if ($this->onlyCoreFonts) { + $this->setMBencoding('windows-1252'); // sets $this->mb_enc + } + else { + $this->setMBencoding('UTF-8'); // sets $this->mb_enc + } + @mb_regex_encoding('UTF-8'); // required only for mb_ereg... and mb_split functions + + + // Adobe CJK fonts + $this->available_CJK_fonts = array('gb','big5','sjis','uhc','gbB','big5B','sjisB','uhcB','gbI','big5I','sjisI','uhcI', + 'gbBI','big5BI','sjisBI','uhcBI'); + + + //Standard fonts + $this->CoreFonts=array('ccourier'=>'Courier','ccourierB'=>'Courier-Bold','ccourierI'=>'Courier-Oblique','ccourierBI'=>'Courier-BoldOblique', + 'chelvetica'=>'Helvetica','chelveticaB'=>'Helvetica-Bold','chelveticaI'=>'Helvetica-Oblique','chelveticaBI'=>'Helvetica-BoldOblique', + 'ctimes'=>'Times-Roman','ctimesB'=>'Times-Bold','ctimesI'=>'Times-Italic','ctimesBI'=>'Times-BoldItalic', + 'csymbol'=>'Symbol','czapfdingbats'=>'ZapfDingbats'); + $this->fontlist=array("ctimes","ccourier","chelvetica","csymbol","czapfdingbats"); + + // Substitutions + $this->setHiEntitySubstitutions(); + + if ($this->onlyCoreFonts) { + $this->useSubstitutions = true; + $this->SetSubstitutions(); + } + else { $this->useSubstitutions = false; } + +/*-- HTML-CSS --*/ + + if (!class_exists('cssmgr', false)) { include(_MPDF_PATH .'classes/cssmgr.php'); } + $this->cssmgr = new cssmgr($this); + if (file_exists(_MPDF_PATH.'mpdf.css')) { + $css = file_get_contents(_MPDF_PATH.'mpdf.css'); + $css2 = $this->cssmgr->ReadDefaultCSS($css); + $this->defaultCSS = $this->cssmgr->array_merge_recursive_unique($this->defaultCSS,$css2); + } +/*-- END HTML-CSS --*/ + + if ($default_font=='') { + if ($this->onlyCoreFonts) { + if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->mono_fonts)) { $default_font = 'ccourier'; } + else if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->sans_fonts)) { $default_font = 'chelvetica'; } + else { $default_font = 'ctimes'; } + } + else { $default_font = $this->defaultCSS['BODY']['FONT-FAMILY']; } + } + if (!$default_font_size) { + $mmsize = $this->ConvertSize($this->defaultCSS['BODY']['FONT-SIZE']); + $default_font_size = $mmsize*(_MPDFK); + } + + if ($default_font) { $this->SetDefaultFont($default_font); } + if ($default_font_size) { $this->SetDefaultFontSize($default_font_size); } + + $this->SetLineHeight(); // lineheight is in mm + + $this->SetFColor($this->ConvertColor(255)); + $this->HREF=''; + $this->oldy=-1; + $this->B=0; + $this->U=false; + $this->S=false; + $this->I=0; + + $this->listlvl=0; + $this->listnum=0; + $this->listtype=''; + $this->listoccur=array(); + $this->listlist=array(); + $this->listitem=array(); + + $this->tdbegin=false; + $this->table=array(); + $this->cell=array(); + $this->col=-1; + $this->row=-1; + $this->cellBorderBuffer = array(); + + $this->divbegin=false; + $this->divalign=''; + $this->divwidth=0; + $this->divheight=0; + $this->spanbgcolor=false; + $this->divrevert=false; + $this->spanborder=false; + $this->spanborddet=array(); + + $this->blockjustfinished=false; + $this->listjustfinished=false; + $this->ignorefollowingspaces = true; //in order to eliminate exceeding left-side spaces + $this->toupper=false; + $this->tolower=false; + $this->capitalize=false; + $this->dash_on=false; + $this->dotted_on=false; + $this->SUP=false; + $this->SUB=false; + $this->strike=false; + $this->textshadow=''; + + $this->currentfontfamily=''; + $this->currentfontsize=''; + $this->currentfontstyle=''; + $this->colorarray=array(); + $this->spanbgcolorarray=array(); + $this->textbuffer=array(); + $this->internallink=array(); + $this->basepath = ""; + + $this->SetBasePath(''); + + $this->textparam = array(); + + $this->specialcontent = ''; + $this->selectoption = array(); + +/*-- IMPORTS --*/ + + $this->tpls = array(); + $this->tpl = 0; + $this->tplprefix = "/TPL"; + $this->res = array(); + if ($this->enableImports) { + $this->SetImportUse(); + } +/*-- END IMPORTS --*/ + + if ($this->progressBar) { $this->StartProgressBarOutput($this->progressBar) ; } // *PROGRESS-BAR* +} + + +function _setPageSize($format, &$orientation) { + //Page format + if(is_string($format)) + { + if ($format=='') { $format = 'A4'; } + $pfo = 'P'; + if(preg_match('/([0-9a-zA-Z]*)-L/i',$format,$m)) { // e.g. A4-L = A4 landscape + $format=$m[1]; + $pfo='L'; + } + $format = $this->_getPageFormat($format); + if (!$format) { $this->Error('Unknown page format: '.$format); } + else { $orientation = $pfo; } + + $this->fwPt=$format[0]; + $this->fhPt=$format[1]; + } + else + { + if (!$format[0] || !$format[1]) { $this->Error('Invalid page format: '.$format[0].' '.$format[1]); } + $this->fwPt=$format[0]*_MPDFK; + $this->fhPt=$format[1]*_MPDFK; + } + $this->fw=$this->fwPt/_MPDFK; + $this->fh=$this->fhPt/_MPDFK; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' or $orientation=='portrait') + { + $orientation='P'; + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + } + elseif($orientation=='l' or $orientation=='landscape') + { + $orientation='L'; + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + } + else $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$orientation; + + $this->w=$this->wPt/_MPDFK; + $this->h=$this->hPt/_MPDFK; +} + +function _getPageFormat($format) { + switch (strtoupper($format)) { + case '4A0': {$format = array(4767.87,6740.79); break;} + case '2A0': {$format = array(3370.39,4767.87); break;} + case 'A0': {$format = array(2383.94,3370.39); break;} + case 'A1': {$format = array(1683.78,2383.94); break;} + case 'A2': {$format = array(1190.55,1683.78); break;} + case 'A3': {$format = array(841.89,1190.55); break;} + case 'A4': default: {$format = array(595.28,841.89); break;} + case 'A5': {$format = array(419.53,595.28); break;} + case 'A6': {$format = array(297.64,419.53); break;} + case 'A7': {$format = array(209.76,297.64); break;} + case 'A8': {$format = array(147.40,209.76); break;} + case 'A9': {$format = array(104.88,147.40); break;} + case 'A10': {$format = array(73.70,104.88); break;} + case 'B0': {$format = array(2834.65,4008.19); break;} + case 'B1': {$format = array(2004.09,2834.65); break;} + case 'B2': {$format = array(1417.32,2004.09); break;} + case 'B3': {$format = array(1000.63,1417.32); break;} + case 'B4': {$format = array(708.66,1000.63); break;} + case 'B5': {$format = array(498.90,708.66); break;} + case 'B6': {$format = array(354.33,498.90); break;} + case 'B7': {$format = array(249.45,354.33); break;} + case 'B8': {$format = array(175.75,249.45); break;} + case 'B9': {$format = array(124.72,175.75); break;} + case 'B10': {$format = array(87.87,124.72); break;} + case 'C0': {$format = array(2599.37,3676.54); break;} + case 'C1': {$format = array(1836.85,2599.37); break;} + case 'C2': {$format = array(1298.27,1836.85); break;} + case 'C3': {$format = array(918.43,1298.27); break;} + case 'C4': {$format = array(649.13,918.43); break;} + case 'C5': {$format = array(459.21,649.13); break;} + case 'C6': {$format = array(323.15,459.21); break;} + case 'C7': {$format = array(229.61,323.15); break;} + case 'C8': {$format = array(161.57,229.61); break;} + case 'C9': {$format = array(113.39,161.57); break;} + case 'C10': {$format = array(79.37,113.39); break;} + case 'RA0': {$format = array(2437.80,3458.27); break;} + case 'RA1': {$format = array(1729.13,2437.80); break;} + case 'RA2': {$format = array(1218.90,1729.13); break;} + case 'RA3': {$format = array(864.57,1218.90); break;} + case 'RA4': {$format = array(609.45,864.57); break;} + case 'SRA0': {$format = array(2551.18,3628.35); break;} + case 'SRA1': {$format = array(1814.17,2551.18); break;} + case 'SRA2': {$format = array(1275.59,1814.17); break;} + case 'SRA3': {$format = array(907.09,1275.59); break;} + case 'SRA4': {$format = array(637.80,907.09); break;} + case 'LETTER': {$format = array(612.00,792.00); break;} + case 'LEGAL': {$format = array(612.00,1008.00); break;} + case 'LEDGER': {$format = array(279.00,432.00); break;} + case 'TABLOID': {$format = array(279.00,432.00); break;} + case 'EXECUTIVE': {$format = array(521.86,756.00); break;} + case 'FOLIO': {$format = array(612.00,936.00); break;} + case 'B': {$format=array(362.83,561.26 ); break;} // 'B' format paperback size 128x198mm + case 'A': {$format=array(314.65,504.57 ); break;} // 'A' format paperback size 111x178mm + case 'DEMY': {$format=array(382.68,612.28 ); break;} // 'Demy' format paperback size 135x216mm + case 'ROYAL': {$format=array(433.70,663.30 ); break;} // 'Royal' format paperback size 153x234mm + default: $format = false; + } + return $format; +} + + +/*-- PROGRESS-BAR --*/ +function StartProgressBarOutput($mode=1) { + // must be relative path, or URI (not a file system path) + if (!defined('_MPDF_URI')) { + $this->progressBar = false; + if ($this->debug) { $this->Error("You need to define _MPDF_URI to use the progress bar!"); } + else return false; + } + $this->progressBar = $mode; + if ($this->progbar_altHTML) { + echo $this->progbar_altHTML; + } + else { + echo ' + + mPDF File Progress + + + + +

+
'.$this->progbar_heading.'
+
+ '; + if ($this->progressBar==2) { echo ' + + +
+ Writing HTML code
+ +
+
 
+
+ +
+ Autosizing elements
+
+
 
+
+ +

+ Writing Tables
+
+
 
+
+ +


+ '; } + echo ' Writing PDF file
+
+
 
+
+ + '; + if ($this->progressBar==2) { echo ' +
+ Memory usage
+
+
 
+
+ 0 '.ini_get("memory_limit").'
+

+ Memory usage (peak)
+
+
 
+
+ 0 '.ini_get("memory_limit").'
+
+ '; } + echo '

+ + +
+ '; + } + ob_flush(); + flush(); +} + +function UpdateProgressBar($el,$val,$txt='') { + // $val should be a string - 5 = actual value, +15 = increment + + if ($this->progressBar<2) { + if ($el>3) { return; } + else if ($el ==1) { $el = 2; } + } + echo ''."\n"; + ob_flush(); + flush(); +} +/*-- END PROGRESS-BAR --*/ + + + +function RestrictUnicodeFonts($res) { + // $res = array of (Unicode) fonts to restrict to: e.g. norasi|norasiB - language specific + if (count($res)) { // Leave full list of available fonts if passed blank array + $this->available_unifonts = $res; + } + else { $this->available_unifonts = $this->default_available_fonts; } + if (count($this->available_unifonts) == 0) { $this->available_unifonts[] = $this->default_available_fonts[0]; } + $this->available_unifonts = array_values($this->available_unifonts); +} + + +function setMBencoding($enc) { + if ($this->mb_enc != $enc) { + $this->mb_enc = $enc; + mb_internal_encoding($this->mb_enc); + } +} + + +function SetMargins($left,$right,$top) { + //Set left, top and right margins + $this->lMargin=$left; + $this->rMargin=$right; + $this->tMargin=$top; +} + +function ResetMargins() { + //ReSet left, top margins + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P' && $this->CurOrientation=='L') { + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->tMargin=$this->orig_rMargin; + $this->bMargin=$this->orig_lMargin; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS + $this->tMargin=$this->orig_lMargin; + $this->bMargin=$this->orig_rMargin; + } + $this->lMargin=$this->DeflMargin; + $this->rMargin=$this->DefrMargin; + $this->MarginCorrection = 0; + $this->PageBreakTrigger=$this->h-$this->bMargin; + } + else if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->lMargin=$this->DefrMargin; + $this->rMargin=$this->DeflMargin; + $this->MarginCorrection = $this->DefrMargin-$this->DeflMargin; + + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS + $this->lMargin=$this->DeflMargin; + $this->rMargin=$this->DefrMargin; + if ($this->mirrorMargins) { $this->MarginCorrection = $this->DeflMargin-$this->DefrMargin; } + } + $this->x=$this->lMargin; + +} + +function SetLeftMargin($margin) { + //Set left margin + $this->lMargin=$margin; + if($this->page>0 and $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' or $zoom=='fullwidth' or $zoom=='real' or $zoom=='default' or !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' or $layout=='continuous' or $layout=='two' or $layout=='twoleft' or $layout=='tworight' or $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 // Arrives as UTF-8 + $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 SetAnchor2Bookmark($x) { + $this->anchor2Bookmark = $x; +} + +function AliasNbPages($alias='{nb}') { + //Define an alias for total number of pages + $this->aliasNbPg=$alias; +} + +function AliasNbPageGroups($alias='{nbpg}') { + //Define an alias for total number of pages in a group + $this->aliasNbPgGp=$alias; +} + +function SetAlpha($alpha, $bm='Normal', $return=false, $mode='B') { +// alpha: real value from 0 (transparent) to 1 (opaque) +// bm: blend mode, one of the following: +// Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, +// HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity +// set alpha for stroking (CA) and non-stroking (ca) operations +// mode determines F (fill) S (stroke) B (both) + if (($this->PDFA || $this->PDFX) && $alpha!=1) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Image opacity must be 100% (Opacity changed to 100%)"; } + $alpha = 1; + } + $a = array('BM'=>'/'.$bm); + if ($mode=='F' || $mode='B') $a['ca'] = $alpha; + if ($mode=='S' || $mode='B') $a['CA'] = $alpha; + $gs = $this->AddExtGState($a); + if ($return) { return sprintf('/GS%d gs', $gs); } + else { $this->_out(sprintf('/GS%d gs', $gs)); } +} + +function AddExtGState($parms) { + $n = count($this->extgstates); + // check if graphics state already exists + for ($i=1; $i<=$n; $i++) { + if (count($this->extgstates[$i]['parms']) == count($parms)) { + $same = true; + foreach($this->extgstates[$i]['parms'] AS $k=>$v) { + if (!isset($parms[$k]) || $parms[$k] != $v) { $same = false; break; } + } + if ($same) { return $i; } + } + } + $n++; + $this->extgstates[$n]['parms'] = $parms; + return $n; +} + +function SetVisibility($v) { + if (($this->PDFA || $this->PDFX) && $this->visibility!='visible') { $this->PDFAXwarnings[] = "Cannot set visibility to anything other than full when using PDFA or PDFX"; return ''; } + else if (!$this->PDFA && !$this->PDFX) + $this->pdf_version='1.5'; + if($this->visibility!='visible') { + $this->_out('EMC'); + $this->hasOC=intval($this->hasOC ); // mPDF 5.6.01 + } + if($v=='printonly') { + $this->_out('/OC /OC1 BDC'); + $this->hasOC=($this->hasOC | 1); // mPDF 5.6.01 + } + elseif($v=='screenonly') { + $this->_out('/OC /OC2 BDC'); + $this->hasOC=($this->hasOC | 2); // mPDF 5.6.01 + } + elseif($v=='hidden') { + $this->_out('/OC /OC3 BDC'); + $this->hasOC=($this->hasOC | 4); // mPDF 5.6.01 + } + elseif($v!='visible') + $this->Error('Incorrect visibility: '.$v); + $this->visibility=$v; +} + +function Error($msg) { + //Fatal error + header('Content-Type: text/html; charset=utf-8'); + die('mPDF error: '.$msg); +} + +function Open() { + //Begin document + if($this->state==0) $this->_begindoc(); +} + +function Close() { + if ($this->progressBar) { $this->UpdateProgressBar(2,'2','Closing last page'); } // *PROGRESS-BAR* + //Terminate document + if($this->state==3) return; + if($this->page==0) $this->AddPage($this->CurOrientation); + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } // *TABLES* + if ($this->tablebuffer) { $this->printtablebuffer(); } // *TABLES* +/*-- COLUMNS --*/ + + if ($this->ColActive) { + $this->SetColumns(0); + $this->ColActive = 0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + } +/*-- END COLUMNS --*/ + if (count($this->divbuffer)) { $this->printdivbuffer(); } + + // BODY Backgrounds + $s = ''; + + $s .= $this->PrintBodyBackgrounds(); + + $s .= $this->PrintPageBackgrounds(); + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->pages[$this->page]); + $this->pageBackgrounds = array(); + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + if (!$this->tocontents || !$this->tocontents->TOCmark) { //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + } + if ($this->tocontents && ($this->tocontents->TOCmark || count($this->tocontents->m_TOC))) { $this->tocontents->insertTOC(); } // *TOC* + + //Close page + $this->_endpage(); + + //Close document + $this->_enddoc(); +} + +/*-- BACKGROUNDS --*/ +function _resizeBackgroundImage($imw, $imh, $cw, $ch, $resize=0, $repx, $repy, $pba=array(), $size=array()) { // mPDF 5.6.10 + // pba is background positioning area (from CSS background-origin) may not always be set [x,y,w,h] + // size is from CSS3 background-size - takes precendence over old resize + // $w - absolute length or % or auto or cover | contain + // $h - absolute length or % or auto or cover | contain + // mPDF 5.6.10 + if (isset($pba['w'])) $cw = $pba['w']; + if (isset($pba['h'])) $ch = $pba['h']; + + $cw = $cw*_MPDFK; + $ch = $ch*_MPDFK; + if (empty($size) && !$resize) { return array($imw, $imh, $repx, $repy); } + + // mPDF 5.6.10 + if (isset($size['w']) && $size['w']) { + if ($size['w']=='contain') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area. + // Same as resize==3 + $h = $imh * $cw/$imw; + $w = $cw; + if ($h > $ch) { + $w = $w * $ch/$h; + $h = $ch; + } + } + else if ($size['w']=='cover') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area. + $h = $imh * $cw/$imw; + $w = $cw; + if ($h < $ch) { + $w = $w * $h/$ch; + $h = $ch; + } + } + else { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $size['w'] = ($cw * $size['w']); + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $size['h'] = ($ch * $size['h']); + } + if ($size['w']=='auto' && $size['h']=='auto') { + $w = $imw; + $h = $imh; + } + else if ($size['w']=='auto' && $size['h']!='auto') { + $w = $imw * $size['h']/$imh; + $h = $size['h']; + } + else if ($size['w']!='auto' && $size['h']=='auto') { + $h = $imh * $size['w']/$imw; + $w = $size['w']; + } + else { + $w = $size['w']; + $h = $size['h']; + } + } + return array($w, $h, $repx, $repy); + } + else if ($resize==1 && $imw > $cw) { + $h = $imh * $cw/$imw; + return array($cw, $h, $repx, $repy); + } + else if ($resize==2 && $imh > $ch) { + $w = $imw * $ch/$imh; + return array($w, $ch, $repx, $repy); + } + else if ($resize==3) { + $w = $imw; + $h = $imh; + if ($w > $cw) { + $h = $h * $cw/$w; + $w = $cw; + } + if ($h > $ch) { + $w = $w * $ch/$h; + $h = $ch; + } + return array($w, $h, $repx, $repy); + } + else if ($resize==4) { + $h = $imh * $cw/$imw; + return array($cw, $h, $repx, $repy); + } + else if ($resize==5) { + $w = $imw * $ch/$imh; + return array($w, $ch, $repx, $repy); + } + else if ($resize==6) { + return array($cw, $ch, $repx, $repy); + } + return array($imw, $imh, $repx, $repy); +} + + +function SetBackground(&$properties, &$maxwidth) { + // mPDF 5.6.10 5.6.11 + if (isset($properties['BACKGROUND-ORIGIN']) && ($properties['BACKGROUND-ORIGIN']=='border-box' || $properties['BACKGROUND-ORIGIN']== 'content-box')) { $origin = $properties['BACKGROUND-ORIGIN']; } + else { $origin = 'padding-box'; } + // mPDF 5.6.10 + if (isset($properties['BACKGROUND-SIZE'])) { + if (stristr($properties['BACKGROUND-SIZE'] ,'contain') ) { $bsw = $bsh = 'contain'; } + else if (stristr($properties['BACKGROUND-SIZE'] ,'cover') ) { $bsw = $bsh = 'cover'; } + else { + $bsw = $bsh = 'auto'; + $sz = preg_split('/\s+/',trim($properties['BACKGROUND-SIZE'])); + if (count($sz)==2) { $bsw = $sz[0]; $bsh = $sz[1]; } + else { $bsw = $sz[0]; } + if (!stristr($bsw ,'%') && !stristr($bsw ,'auto') ) { $bsw = $this->ConvertSize($bsw ,$maxwidth,$this->FontSize); } + if (!stristr($bsh ,'%') && !stristr($bsh ,'auto') ) { $bsh = $this->ConvertSize($bsh ,$maxwidth,$this->FontSize); } + } + $size = array('w'=>$bsw, 'h'=>$bsh); + } + if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/',$properties['BACKGROUND-IMAGE'])) { + return array('gradient'=>$properties['BACKGROUND-IMAGE'], 'origin'=>$origin, 'size'=>$size ); // mPDF 5.6.10 + } + else { + $file = $properties['BACKGROUND-IMAGE']; + $sizesarray = $this->Image($file,0,0,0,0,'','',false, false, false, false, true); + if (isset($sizesarray['IMAGE_ID'])) { + $image_id = $sizesarray['IMAGE_ID']; + $orig_w = $sizesarray['WIDTH']*_MPDFK; // in user units i.e. mm + $orig_h = $sizesarray['HEIGHT']*_MPDFK; // (using $this->img_dpi) + if (isset($properties['BACKGROUND-IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['BACKGROUND-IMAGE-RESOLUTION']) && isset($sizesarray['set-dpi']) && $sizesarray['set-dpi']>0) { + $orig_w *= $this->img_dpi / $sizesarray['set-dpi']; + $orig_h *= $this->img_dpi / $sizesarray['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['BACKGROUND-IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $orig_w *= $this->img_dpi / $dpi; + $orig_h *= $this->img_dpi / $dpi; + } + } + } + $x_repeat = true; + $y_repeat = true; + if (isset($properties['BACKGROUND-REPEAT'])) { + if ($properties['BACKGROUND-REPEAT']=='no-repeat' || $properties['BACKGROUND-REPEAT']=='repeat-x') { $y_repeat = false; } + if ($properties['BACKGROUND-REPEAT']=='no-repeat' || $properties['BACKGROUND-REPEAT']=='repeat-y') { $x_repeat = false; } + } + $x_pos = 0; + $y_pos = 0; + if (isset($properties['BACKGROUND-POSITION'])) { + $ppos = preg_split('/\s+/',$properties['BACKGROUND-POSITION']); + $x_pos = $ppos[0]; + $y_pos = $ppos[1]; + if (!stristr($x_pos ,'%') ) { $x_pos = $this->ConvertSize($x_pos ,$maxwidth,$this->FontSize); } + if (!stristr($y_pos ,'%') ) { $y_pos = $this->ConvertSize($y_pos ,$maxwidth,$this->FontSize); } + } + if (isset($properties['BACKGROUND-IMAGE-RESIZE'])) { $resize = $properties['BACKGROUND-IMAGE-RESIZE']; } + else { $resize = 0; } + if (isset($properties['BACKGROUND-IMAGE-OPACITY'])) { $opacity = $properties['BACKGROUND-IMAGE-OPACITY']; } + else { $opacity = 1; } + return array('image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$sizesarray['itype'], 'origin'=>$origin, 'size'=>$size ); + } + } + return false; +} +/*-- END BACKGROUNDS --*/ + +function PrintBodyBackgrounds() { + $s = ''; + $clx = 0; + $cly = 0; + $clw = $this->w; + $clh = $this->h; + // If using bleed and trim margins in paged media + if ($this->pageDim[$this->page]['outer_width_LR'] || $this->pageDim[$this->page]['outer_width_TB']) { + $clx = $this->pageDim[$this->page]['outer_width_LR'] - $this->pageDim[$this->page]['bleedMargin']; + $cly = $this->pageDim[$this->page]['outer_width_TB'] - $this->pageDim[$this->page]['bleedMargin']; + $clw = $this->w - 2*$clx; + $clh = $this->h - 2*$cly; + } + + if ($this->bodyBackgroundColor) { + $s .= 'q ' .$this->SetFColor($this->bodyBackgroundColor, true)."\n"; + if ($this->bodyBackgroundColor{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($this->bodyBackgroundColor{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($this->bodyBackgroundColor{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($this->bodyBackgroundColor{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re f Q', ($clx*_MPDFK), ($cly*_MPDFK),$clw*_MPDFK,$clh*_MPDFK)."\n"; + } + +/*-- BACKGROUNDS --*/ + if ($this->bodyBackgroundGradient) { + $g = $this->grad->parseBackgroundGradient($this->bodyBackgroundGradient); + if ($g) { + $s .= $this->grad->Gradient($clx, $cly, $clw, $clh, (isset($g['gradtype']) ? $g['gradtype'] : null), $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true); + } + } + if ($this->bodyBackgroundImage) { + if ( $this->bodyBackgroundImage['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->bodyBackgroundImage['gradient'])) { + $g = $this->grad->parseMozGradient( $this->bodyBackgroundImage['gradient']); + if ($g) { + $s .= $this->grad->Gradient($clx, $cly, $clw, $clh, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true); + } + } + else if ($this->bodyBackgroundImage['image_id']) { // Background pattern + $n = count($this->patterns)+1; + // If using resize, uses TrimBox (not including the bleed) + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($this->bodyBackgroundImage['orig_w'], $this->bodyBackgroundImage['orig_h'], $clw, $clh, $this->bodyBackgroundImage['resize'], $this->bodyBackgroundImage['x_repeat'], $this->bodyBackgroundImage['y_repeat']); + + $this->patterns[$n] = array('x'=>$clx, 'y'=>$cly, 'w'=>$clw, 'h'=>$clh, 'pgh'=>$this->h, 'image_id'=>$this->bodyBackgroundImage['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$this->bodyBackgroundImage['x_pos'], 'y_pos'=>$this->bodyBackgroundImage['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$this->bodyBackgroundImage['itype']); + if (($this->bodyBackgroundImage['opacity']>0 || $this->bodyBackgroundImage['opacity']==='0') && $this->bodyBackgroundImage['opacity']<1) { $opac = $this->SetAlpha($this->bodyBackgroundImage['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, ($clx*_MPDFK), ($cly*_MPDFK),$clw*_MPDFK, $clh*_MPDFK) ."\n"; + } + } +/*-- END BACKGROUNDS --*/ + return $s; +} + + +function PrintPageBackgrounds($adjustmenty=0) { + $s = ''; + + ksort($this->pageBackgrounds); + foreach($this->pageBackgrounds AS $bl=>$pbs) { + foreach ($pbs AS $pb) { + if ((!isset($pb['image_id']) && !isset($pb['gradient'])) || isset($pb['shadowonly'])) { // Background colour or boxshadow + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $this->current_layer = $pb['z-index']; + $s .= "\n".'/OCBZ-index /ZI'.$pb['z-index'].' BDC'."\n"; + } + + if($pb['visibility']!='visible') { + if($pb['visibility']=='printonly') + $s .= '/OC /OC1 BDC'."\n"; + else if($pb['visibility']=='screenonly') + $s .= '/OC /OC2 BDC'."\n"; + else if($pb['visibility']=='hidden') + $s .= '/OC /OC3 BDC'."\n"; + } + // Box shadow + if (isset($pb['shadow']) && $pb['shadow']) { $s .= $pb['shadow']."\n"; } + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= 'q '.$this->SetFColor($pb['col'], true)."\n"; + if ($pb['col']{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($pb['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($pb['col']{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($pb['col']{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re f Q',$pb['x']*_MPDFK,($this->h-$pb['y'])*_MPDFK,$pb['w']*_MPDFK,-$pb['h']*_MPDFK)."\n"; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + if($pb['visibility']!='visible') + $s .= 'EMC'."\n"; + + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $s .= "\n".'EMCBZ-index'."\n"; + $this->current_layer = 0; + } + } + } +/*-- BACKGROUNDS --*/ + foreach ($pbs AS $pb) { + // mPDF 5.6.01 - LAYERS + if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) { + if($pb['z-index']>0) { + $this->current_layer = $pb['z-index']; + $s .= "\n".'/OCGZ-index /ZI'.$pb['z-index'].' BDC'."\n"; + } + if($pb['visibility']!='visible') { + if($pb['visibility']=='printonly') + $s .= '/OC /OC1 BDC'."\n"; + else if($pb['visibility']=='screenonly') + $s .= '/OC /OC2 BDC'."\n"; + else if($pb['visibility']=='hidden') + $s .= '/OC /OC3 BDC'."\n"; + } + } + if (isset($pb['gradient']) && $pb['gradient']) { + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= $this->grad->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true); + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + else if (isset($pb['image_id']) && $pb['image_id']) { // Background Image + $pb['y'] -= $adjustmenty; + $pb['h'] += $adjustmenty; + $n = count($this->patterns)+1; + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat'], $pb['bpa'], $pb['size']); // mPDF 5.6.10 + $this->patterns[$n] = array('x'=>$pb['x'], 'y'=>$pb['y'], 'w'=>$pb['w'], 'h'=>$pb['h'], 'pgh'=>$this->h, 'image_id'=>$pb['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$pb['x_pos'], 'y_pos'=>$pb['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$pb['itype'], 'bpa'=>$pb['bpa']); // mPDF 5.6.10 + $x = $pb['x']*_MPDFK; + $y = ($this->h - $pb['y'])*_MPDFK; + $w = $pb['w']*_MPDFK; + $h = -$pb['h']*_MPDFK; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + if ($this->writingHTMLfooter || $this->writingHTMLheader) { // Write each (tiles) image rather than use as a pattern + $iw = $pb['orig_w']/_MPDFK; + $ih = $pb['orig_h']/_MPDFK; + + $w = $pb['w']; + $h = $pb['h']; + $x0 = $pb['x']; + $y0 = $pb['y']; + + // mPDF 5.6.11 + if (isset($pb['bpa']) && $pb['bpa']) { + $w = $pb['bpa']['w']; + $h = $pb['bpa']['h']; + $x0 = $pb['bpa']['x']; + $y0 = $pb['bpa']['y']; + } + + // mPDF 5.6.11 + if (isset($pb['size']['w']) && $pb['size']['w']) { + $size = $pb['size']; + + if ($size['w']=='contain') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area. + // Same as resize==3 + $ih = $ih * $pb['bpa']['w']/$iw; + $iw = $pb['bpa']['w']; + if ($ih > $pb['bpa']['h']) { + $iw = $iw * $pb['bpa']['h']/$ih; + $ih = $pb['bpa']['h']; + } + } + else if ($size['w']=='cover') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area. + $ih = $ih * $pb['bpa']['w']/$iw; + $iw = $pb['bpa']['w']; + if ($ih < $pb['bpa']['h']) { + $iw = $iw * $ih/$pb['bpa']['h']; + $ih = $pb['bpa']['h']; + } + } + else { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $size['w'] = ($pb['bpa']['w'] * $size['w']); + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $size['h'] = ($pb['bpa']['h'] * $size['h']); + } + if ($size['w']=='auto' && $size['h']=='auto') { + $iw = $iw; + $ih = $ih; + } + else if ($size['w']=='auto' && $size['h']!='auto') { + $iw = $iw * $size['h']/$ih; + $ih = $size['h']; + } + else if ($size['w']!='auto' && $size['h']=='auto') { + $ih = $ih * $size['w']/$iw; + $iw = $size['w']; + } + else { + $iw = $size['w']; + $ih = $size['h']; + } + } + } + + // Number to repeat + if ($pb['x_repeat']) { $nx = ceil($pb['w']/$iw)+1; } // mPDF 5.6.11 + else { $nx = 1; } + if ($pb['y_repeat']) { $ny = ceil($pb['h']/$ih)+1; } // mPDF 5.6.11 + else { $ny = 1; } + + $x_pos = $pb['x_pos']; + if (stristr($x_pos ,'%') ) { + $x_pos += 0; + $x_pos /= 100; + $x_pos = ($pb['bpa']['w'] * $x_pos) - ($iw * $x_pos); // mPDF 5.6.11 + } + $y_pos = $pb['y_pos']; + if (stristr($y_pos ,'%') ) { + $y_pos += 0; + $y_pos /= 100; + $y_pos = ($pb['bpa']['h'] * $y_pos) - ($ih * $y_pos); // mPDF 5.6.11 + } + if ($nx>1) { + while($x_pos>($pb['x']-$pb['bpa']['x'])) { $x_pos -= $iw; } // mPDF 5.6.11 + } + if ($ny>1) { + while($y_pos>($pb['y']-$pb['bpa']['y'])) { $y_pos -= $ih; } // mPDF 5.6.11 + } + for($xi=0;$xi<$nx;$xi++) { + for($yi=0;$yi<$ny;$yi++) { + $x = $x0 + $x_pos + ($iw*$xi); + $y = $y0 + $y_pos + ($ih*$yi); + if ($pb['opacity']>0 && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac,$iw*_MPDFK,$ih*_MPDFK,$x*_MPDFK,($this->h-($y+$ih))*_MPDFK,$pb['image_id']) ."\n"; + } + } + } + else { + if (($pb['opacity']>0 || $pb['opacity']==='0') && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) ."\n"; + } + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) { + if($pb['visibility']!='visible') + $s .= 'EMC'."\n"; + + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $s .= "\n".'EMCGZ-index'."\n"; + $this->current_layer = 0; + } + } + + } +/*-- END BACKGROUNDS --*/ + } + return $s; +} + +function PrintTableBackgrounds($adjustmenty=0) { + $s = ''; +/*-- BACKGROUNDS --*/ + ksort($this->tableBackgrounds); + foreach($this->tableBackgrounds AS $bl=>$pbs) { + foreach ($pbs AS $pb) { + if ((!isset($pb['gradient']) || !$pb['gradient']) && (!isset($pb['image_id']) || !$pb['image_id'])) { + $s .= 'q '.$this->SetFColor($pb['col'], true)."\n"; + if ($pb['col']{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($pb['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($pb['col']{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($pb['col']{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re %s Q',$pb['x']*_MPDFK,($this->h-$pb['y'])*_MPDFK,$pb['w']*_MPDFK,-$pb['h']*_MPDFK,'f')."\n"; + } + if (isset($pb['gradient']) && $pb['gradient']) { + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= $this->grad->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true); + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + if (isset($pb['image_id']) && $pb['image_id']) { // Background pattern + $pb['y'] -= $adjustmenty; + $pb['h'] += $adjustmenty; + $n = count($this->patterns)+1; + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat']); + $this->patterns[$n] = array('x'=>$pb['x'], 'y'=>$pb['y'], 'w'=>$pb['w'], 'h'=>$pb['h'], 'pgh'=>$this->h, 'image_id'=>$pb['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$pb['x_pos'], 'y_pos'=>$pb['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$pb['itype']); + $x = $pb['x']*_MPDFK; + $y = ($this->h - $pb['y'])*_MPDFK; + $w = $pb['w']*_MPDFK; + $h = -$pb['h']*_MPDFK; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + if ($pb['opacity']>0 && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) ."\n"; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + } + } +/*-- END BACKGROUNDS --*/ + return $s; +} + +// mPDF 5.6.01 - LAYERS +function BeginLayer($id) { + if($this->current_layer>0) $this->EndLayer(); + if ($id < 1) { return false; } + if (!isset($this->layers[$id])) { + $this->layers[$id] = array('name'=>'Layer '.($id) ); + if (($this->PDFA || $this->PDFX)) { $this->PDFAXwarnings[] = "Cannot use layers when using PDFA or PDFX"; return ''; } + else if (!$this->PDFA && !$this->PDFX) { $this->pdf_version='1.5'; } + } + $this->current_layer = $id; + $this->_out('/OCZ-index /ZI'.$id.' BDC'); + + $this->pageoutput[$this->page] = array(); +} + +function EndLayer() { + if($this->current_layer>0) { + $this->_out('EMCZ-index'); + $this->current_layer = 0; + } +} + + + +// Depracated - can use AddPage for all +function AddPages($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') +{ + $this->AddPage($orientation,$condition,$resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue,$pagesel,$newformat); +} + + +function AddPageByArray($a) { + if (!is_array($a)) { $a = array(); } + $orientation = (isset($a['orientation']) ? $a['orientation'] : ''); + $condition = (isset($a['condition']) ? $a['condition'] : (isset($a['type']) ? $a['type'] : '')); + $resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : ''); + $pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''); + $suppress = (isset($a['suppress']) ? $a['suppress'] : ''); + $mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '')); + $mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '')); + $mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '')); + $mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '')); + $mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '')); + $mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '')); + $ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '')); + $ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '')); + $ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '')); + $efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '')); + $ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0)); + $ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0)); + $ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0)); + $efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0)); + $pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '')); + $newformat = (isset($a['newformat']) ? $a['newformat'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '')); + + $this->AddPage($orientation,$condition,$resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue,$pagesel,$newformat); + +} + + +function AddPage($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') +{ +/*-- CSS-FLOAT --*/ + // Float DIV + // Cannot do with columns on, or if any change in page orientation/margins etc. + // If next page already exists - i.e background /headers and footers already written + if ($this->state > 0 && $this->page < count($this->pages)) { + $bak_cml = $this->cMarginL; + $bak_cmr = $this->cMarginR; + $bak_dw = $this->divwidth; + // Paint Div Border if necessary + if ($this->blklvl > 0) { + $save_tr = $this->table_rotate; // *TABLES* + $this->table_rotate = 0; // *TABLES* + if ($this->y == $this->blk[$this->blklvl]['y0']) { $this->blk[$this->blklvl]['startpage']++; } + if (($this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table'] ) { $toplvl = $this->blklvl; } + else { $toplvl = $this->blklvl-1; } + $sy = $this->y; + for ($bl=1;$bl<=$toplvl;$bl++) { + $this->PaintDivBB('pagebottom',0,$bl); + } + $this->y = $sy; + $this->table_rotate = $save_tr; // *TABLES* + } + $s = $this->PrintPageBackgrounds(); + + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + + $this->printfloatbuffer(); + + //Move to next page + $this->page++; + $this->ResetMargins(); + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + $this->_out('2 J'); + $this->LineWidth=$lw; + $this->_out(sprintf('%.3F w',$lw*_MPDFK)); + if($family) $this->SetFont($family,$style,$size,true,true); + $this->DrawColor=$dc; + if($dc!=$this->defDrawColor) $this->_out($dc); + $this->FillColor=$fc; + if($fc!=$this->defFillColor) $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + for($bl=1;$bl<=$this->blklvl;$bl++) { + $this->blk[$bl]['y0'] = $this->y; + // Don't correct more than once for background DIV containing a Float + if (!isset($this->blk[$bl]['marginCorrected'][$this->page])) { $this->blk[$bl]['x0'] += $this->MarginCorrection; } + $this->blk[$bl]['marginCorrected'][$this->page] = true; + } + $this->cMarginL = $bak_cml; + $this->cMarginR = $bak_cmr; + $this->divwidth = $bak_dw; + return ''; + } +/*-- END CSS-FLOAT --*/ + + //Start a new page + if($this->state==0) $this->Open(); + + $bak_cml = $this->cMarginL; + $bak_cmr = $this->cMarginR; + $bak_dw = $this->divwidth; + + + $bak_lh = $this->lineheight; + + $orientation = substr(strtoupper($orientation),0,1); + $condition = strtoupper($condition); + + + if ($condition == 'NEXT-EVEN') { // always adds at least one new page to create an Even page + if (!$this->mirrorMargins) { $condition = ''; } + else { + if ($pagesel) { $pbch = $pagesel; $pagesel = ''; } // *CSS-PAGE* + else { $pbch = false; } // *CSS-PAGE* + $this->AddPage($this->CurOrientation,'O'); + if ($pbch ) { $pagesel = $pbch; } // *CSS-PAGE* + $condition = ''; + } + } + if ($condition == 'NEXT-ODD') { // always adds at least one new page to create an Odd page + if (!$this->mirrorMargins) { $condition = ''; } + else { + if ($pagesel) { $pbch = $pagesel; $pagesel = ''; } // *CSS-PAGE* + else { $pbch = false; } // *CSS-PAGE* + $this->AddPage($this->CurOrientation,'E'); + if ($pbch ) { $pagesel = $pbch; } // *CSS-PAGE* + $condition = ''; + } + } + + + if ($condition == 'E') { // only adds new page if needed to create an Even page + if (!$this->mirrorMargins || ($this->page)%2==0) { return false; } + } + if ($condition == 'O') { // only adds new page if needed to create an Odd page + if (!$this->mirrorMargins || ($this->page)%2==1) { return false; } + } + + if ($resetpagenum || $pagenumstyle || $suppress) { + $this->PageNumSubstitutions[] = array('from'=>($this->page+1), 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress); + } + + + $save_tr = $this->table_rotate; // *TABLES* + $this->table_rotate = 0; // *TABLES* + $save_kwt = $this->kwt; + $this->kwt = 0; + // mPDF 5.6.01 - LAYERS + $save_layer = $this->current_layer; + $save_vis = $this->visibility; + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + // Paint Div Border if necessary + //PAINTS BACKGROUND COLOUR OR BORDERS for DIV - DISABLED FOR COLUMNS (cf. AcceptPageBreak) AT PRESENT in ->PaintDivBB + if (!$this->ColActive && $this->blklvl > 0) { + if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0']) { + if (isset($this->blk[$this->blklvl]['startpage'])) { $this->blk[$this->blklvl]['startpage']++; } + else { $this->blk[$this->blklvl]['startpage'] = 1; } + } + if ((isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table'] ) { $toplvl = $this->blklvl; } + else { $toplvl = $this->blklvl-1; } + $sy = $this->y; + for ($bl=1;$bl<=$toplvl;$bl++) { + + // mPDF 5.6.01 - LAYERS + if ($this->blk[$bl]['z-index']>0) { + $this->BeginLayer($this->blk[$bl]['z-index']); + } + if (isset($this->blk[$bl]['visibility']) && $this->blk[$bl]['visibility'] && $this->blk[$bl]['visibility']!='visible') { + $this->SetVisibility($this->blk[$bl]['visibility']); + } + + $this->PaintDivBB('pagebottom',0,$bl); + } + $this->y = $sy; + // RESET block y0 and x0 - see below + } + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + // BODY Backgrounds + if ($this->page > 0) { + $s = ''; + $s .= $this->PrintBodyBackgrounds(); + + $s .= $this->PrintPageBackgrounds(); + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->pages[$this->page]); + $this->pageBackgrounds = array(); + } + + $save_kt = $this->keep_block_together; + $this->keep_block_together = 0; + + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + $family=$this->FontFamily; + $style=$this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $size=$this->FontSizePt; + $this->ColumnAdjust = true; // enables column height adjustment for the page + $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->Reset(); + $this->pageoutput[$this->page] = array(); + + $this->Footer(); + //Close page + $this->_endpage(); + } + + + //Start new page + $this->_beginpage($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); + if ($this->docTemplate) { + $pagecount = $this->SetSourceFile($this->docTemplate); + if (($this->page - $this->docTemplateStart) > $pagecount) { + if ($this->docTemplateContinue) { + $tplIdx = $this->ImportPage($pagecount); + $this->UseTemplate($tplIdx); + } + } + else { + $tplIdx = $this->ImportPage(($this->page - $this->docTemplateStart)); + $this->UseTemplate($tplIdx); + } + } + if ($this->pageTemplate) { + $this->UseTemplate($this->pageTemplate); + } + + // Tiling Patterns + $this->_out('___PAGE___START'.date('jY')); + $this->_out('___BACKGROUND___PATTERNS'.date('jY')); + $this->_out('___HEADER___MARKER'.date('jY')); + $this->pageBackgrounds = array(); + + //Set line cap style to square + $this->SetLineCap(2); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.3F w',$lw*_MPDFK)); + //Set font + if($family) $this->SetFont($family,$style,$size,true,true); // forces write + //Set colors + $this->DrawColor=$dc; + if($dc!=$this->defDrawColor) $this->_out($dc); + $this->FillColor=$fc; + if($fc!=$this->defFillColor) $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('%.3F w',$lw*_MPDFK)); + } + //Restore font + if($family) $this->SetFont($family,$style,$size,true,true); // forces write + //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; + $this->InFooter=false; + + // mPDF 5.6.01 - LAYERS + if ($save_layer>0) + $this->BeginLayer($save_layer); + + if($save_vis!='visible') + $this->SetVisibility($save_vis); + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } + if ($this->ColActive) { $this->SetCol(0); } +/*-- END COLUMNS --*/ + + + //RESET BLOCK BORDER TOP + if (!$this->ColActive) { + for($bl=1;$bl<=$this->blklvl;$bl++) { + $this->blk[$bl]['y0'] = $this->y; + if (isset($this->blk[$bl]['x0'])) { $this->blk[$bl]['x0'] += $this->MarginCorrection; } + else { $this->blk[$bl]['x0'] = $this->MarginCorrection; } + // Added mPDF 3.0 Float DIV + $this->blk[$bl]['marginCorrected'][$this->page] = true; + } + } + + + $this->table_rotate = $save_tr; // *TABLES* + $this->kwt = $save_kwt; + + $this->keep_block_together = $save_kt ; + + $this->cMarginL = $bak_cml; + $this->cMarginR = $bak_cmr; + $this->divwidth = $bak_dw; + + $this->lineheight = $bak_lh; +} + + +function PageNo() { + //Get current page number + return $this->page; +} + +function AddSpotColorsFromFile($file) { + $colors = @file($file) or die("Cannot load spot colors file - ".$file); + foreach($colors AS $sc) { + list($name, $c, $m, $y, $k) = preg_split("/\t/",$sc); + $c = intval($c); + $m = intval($m); + $y = intval($y); + $k = intval($k); + $this->AddSpotColor($name, $c, $m, $y, $k); + } +} + +function AddSpotColor($name, $c, $m, $y, $k) { + $name = strtoupper(trim($name)); + if(!isset($this->spotColors[$name])) { + $i=count($this->spotColors)+1; + $this->spotColors[$name]=array('i'=>$i,'c'=>$c,'m'=>$m,'y'=>$y,'k'=>$k); + $this->spotColorIDs[$i]=$name; + } +} + +function SetColor($col, $type='') { + $out = ''; + if ($col{0}==3 || $col{0}==5) { // RGB / RGBa + $out = sprintf('%.3F %.3F %.3F rg',ord($col{1})/255,ord($col{2})/255,ord($col{3})/255); + } + else if ($col{0}==1) { // GRAYSCALE + $out = sprintf('%.3F g',ord($col{1})/255); + } + else if ($col{0}==2) { // SPOT COLOR + $out = sprintf('/CS%d cs %.3F scn',ord($col{1}),ord($col{2})/100); + } + else if ($col{0}==4 || $col{0}==6) { // CMYK / CMYKa + $out = sprintf('%.3F %.3F %.3F %.3F k', ord($col{1})/100, ord($col{2})/100, ord($col{3})/100, ord($col{4})/100); + } + if ($type=='Draw') { $out = strtoupper($out); } // e.g. rg => RG + else if ($type=='CodeOnly') { $out = preg_replace('/\s(rg|g|k)/','',$out); } + return $out; +} + + +function SetDColor($col, $return=false) { + $out = $this->SetColor($col, 'Draw'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->DrawColor = $out; + if($this->page>0 && ((isset($this->pageoutput[$this->page]['DrawColor']) && $this->pageoutput[$this->page]['DrawColor'] != $this->DrawColor) || !isset($this->pageoutput[$this->page]['DrawColor']) || $this->keep_block_together)) { $this->_out($this->DrawColor); } + $this->pageoutput[$this->page]['DrawColor'] = $this->DrawColor; +} + +function SetFColor($col, $return=false) { + $out = $this->SetColor($col, 'Fill'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->FillColor = $out; + $this->ColorFlag = ($out != $this->TextColor); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor']) || $this->keep_block_together)) { $this->_out($this->FillColor); } + $this->pageoutput[$this->page]['FillColor'] = $this->FillColor; +} + +function SetTColor($col, $return=false) { + $out = $this->SetColor($col, 'Text'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->TextColor = $out; + $this->ColorFlag = ($this->FillColor != $out); +} + + +function SetDrawColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for all stroking operations + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetDColor($col, $return); + return $out; +} + +function SetFillColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for all filling operations + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetFColor($col, $return); + return $out; +} + +function SetTextColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for text + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetTColor($col, $return); + return $out; +} + +function _getCharWidth(&$cw, $u, $isdef=true) { + if ($u==0) { $w = false; } + else { $w = (ord($cw[$u*2]) << 8) + ord($cw[$u*2+1]); } + if ($w == 65535) { return 0; } + else if ($w) { return $w; } + else if ($isdef) { return false; } + else { return 0; } +} + +function _charDefined(&$cw, $u) { + if ($u==0) { return false; } + $w = (ord($cw[$u*2]) << 8) + ord($cw[$u*2+1]); + if ($w) { return true; } + else { return false; } +} + +function GetCharWidthCore($c) { + //Get width of a single character in the current Core font + $c = (string)$c; + $w = 0; + // Soft Hyphens chr(173) + if ($c == chr(173) && $this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + return 0; + } + else if ($this->S && isset($this->upperCase[ord($c)])) { + $charw = $this->CurrentFont['cw'][chr($this->upperCase[ord($c)])]; + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + } + else if (isset($this->CurrentFont['cw'][$c])) { + $w += $this->CurrentFont['cw'][$c]; + } + else if (isset($this->CurrentFont['cw'][ord($c)])) { + $w += $this->CurrentFont['cw'][ord($c)]; + } + $w *= ($this->FontSize/ 1000); + if ($this->minwSpacing || $this->fixedlSpacing) { + if ($c==' ') $nb_spaces = 1; + else $nb_spaces = 0; + $w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing); + } + return ($w); +} + +function GetCharWidthNonCore($c, $addSubset=true) { + //Get width of a single character in the current Non-Core font + $c = (string)$c; + $w = 0; + $unicode = $this->UTF8StringToArray($c, $addSubset); + $char = $unicode[0]; +/*-- CJK-FONTS --*/ + if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts + if ($char == 173) { return 0; } // Soft Hyphens + elseif (isset($this->CurrentFont['cw'][$char])) { $w+=$this->CurrentFont['cw'][$char]; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { +/*-- END CJK-FONTS --*/ + if ($char == 173) { return 0; } // Soft Hyphens + else if ($this->S && isset($this->upperCase[$char])) { + $charw = $this->_getCharWidth($this->CurrentFont['cw'],$this->upperCase[$char]); + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { + $charw = $this->_getCharWidth($this->CurrentFont['cw'],$char); + if ($charw!==false) { $w+=$charw; } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + } // *CJK-FONTS* + $w *= ($this->FontSize/ 1000); + if ($this->minwSpacing || $this->fixedlSpacing) { + if ($c==' ') $nb_spaces = 1; + else $nb_spaces = 0; + $w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing); + } + return ($w); +} + + +function GetCharWidth($c, $addSubset=true) { + if (!$this->usingCoreFont) { + return $this->GetCharWidthNonCore($c, $addSubset); + } + else { + return $this->GetCharWidthCore($c); + } +} + +function GetStringWidth($s, $addSubset=true) { + //Get width of a string in the current font + $s = (string)$s; + $cw = &$this->CurrentFont['cw']; + $w = 0; + $kerning = 0; + $lastchar = 0; + $nb_carac = 0; + $nb_spaces = 0; + // mPDF ITERATION + if ($this->iterationCounter) $s = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $s); + + if (!$this->usingCoreFont) { + $s = str_replace("\xc2\xad",'',$s ); + $unicode = $this->UTF8StringToArray($s, $addSubset); + if ($this->minwSpacing || $this->fixedlSpacing) { + $nb_carac = count($unicode); + $nb_spaces = mb_substr_count($s,' ', $this->mb_enc); + } +/*-- CJK-FONTS --*/ + if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts + foreach($unicode as $char) { + if (isset($cw[$char])) { $w+=$cw[$char]; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + } + else { +/*-- END CJK-FONTS --*/ + foreach($unicode as $char) { + if ($this->S && isset($this->upperCase[$char])) { + $charw = $this->_getCharWidth($cw,$this->upperCase[$char]); + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { + $charw = $this->_getCharWidth($cw,$char); + if ($charw!==false) { $w+=$charw; } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + if ($this->kerning && $this->useKerning && $lastchar) { + if (isset($this->CurrentFont['kerninfo'][$lastchar][$char])) { + $kerning += $this->CurrentFont['kerninfo'][$lastchar][$char]; + } + } + $lastchar = $char; + } + } + } // *CJK-FONTS* + + } + else { + if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $s = str_replace(chr(173),'',$s ); + } + $nb_carac = $l = strlen($s); + if ($this->minwSpacing || $this->fixedlSpacing) { + $nb_spaces = substr_count($s,' '); + } + for($i=0; $i<$l; $i++) { + if ($this->S && isset($this->upperCase[ord($s[$i])])) { + $charw = $cw[chr($this->upperCase[ord($s[$i])])]; + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + } + else if (isset($cw[$s[$i]])) { + $w += $cw[$s[$i]]; + } + else if (isset($cw[ord($s[$i])])) { + $w += $cw[ord($s[$i])]; + } + if ($this->kerning && $this->useKerning && $i>0) { + if (isset($this->CurrentFont['kerninfo'][$s[($i-1)]][$s[$i]])) { + $kerning += $this->CurrentFont['kerninfo'][$s[($i-1)]][$s[$i]]; + } + } + } + } + unset($cw); + if ($this->kerning && $this->useKerning) { $w += $kerning; } + $w *= ($this->FontSize/ 1000); + $w += (($nb_carac + $nb_spaces) * $this->fixedlSpacing) + ($nb_spaces * $this->minwSpacing); + return ($w); +} + +function SetLineWidth($width) { + //Set line width + $this->LineWidth=$width; + $lwout = (sprintf('%.3F w',$width*_MPDFK)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineWidth']) && $this->pageoutput[$this->page]['LineWidth'] != $lwout) || !isset($this->pageoutput[$this->page]['LineWidth']) || $this->keep_block_together)) { + $this->_out($lwout); + } + $this->pageoutput[$this->page]['LineWidth'] = $lwout; +} + +function Line($x1,$y1,$x2,$y2) { + //Draw a line + $this->_out(sprintf('%.3F %.3F m %.3F %.3F l S',$x1*_MPDFK,($this->h-$y1)*_MPDFK,$x2*_MPDFK,($this->h-$y2)*_MPDFK)); +} + +function Arrow($x1,$y1,$x2,$y2,$headsize=3,$fill='B',$angle=25) { + //F == fill //S == stroke //B == stroke and fill + // angle = splay of arrowhead - 1 - 89 degrees + if($fill=='F') $fill='f'; + elseif($fill=='FD' or $fill=='DF' or $fill=='B') $fill='B'; + else $fill='S'; + $a = atan2(($y2-$y1),($x2-$x1)); + $b = $a + deg2rad($angle); + $c = $a - deg2rad($angle); + $x3 = $x2 - ($headsize* cos($b)); + $y3 = $this->h-($y2 - ($headsize* sin($b))); + $x4 = $x2 - ($headsize* cos($c)); + $y4 = $this->h-($y2 - ($headsize* sin($c))); + + $x5 = $x3-($x3-$x4)/2; // mid point of base of arrowhead - to join arrow line to + $y5 = $y3-($y3-$y4)/2; + + $s = ''; + $s.=sprintf('%.3F %.3F m %.3F %.3F l S',$x1*_MPDFK,($this->h-$y1)*_MPDFK,$x5*_MPDFK,$y5*_MPDFK); + $this->_out($s); + + $s = ''; + $s.=sprintf('%.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l ',$x5*_MPDFK,$y5*_MPDFK,$x3*_MPDFK,$y3*_MPDFK,$x2*_MPDFK,($this->h-$y2)*_MPDFK,$x4*_MPDFK,$y4*_MPDFK,$x5*_MPDFK,$y5*_MPDFK); + $s.=$fill; + $this->_out($s); +} + + +function Rect($x,$y,$w,$h,$style='') { + //Draw a rectangle + if($style=='F') $op='f'; + elseif($style=='FD' or $style=='DF') $op='B'; + else $op='S'; + $this->_out(sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$h*_MPDFK,$op)); +} + +function AddFont($family,$style='') { + if(empty($family)) { return; } + $family = strtolower($family); + $style=strtoupper($style); + $style=str_replace('U','',$style); + if($style=='IB') $style='BI'; + $fontkey = $family.$style; + // check if the font has been already added + if(isset($this->fonts[$fontkey])) { + return; + } + +/*-- CJK-FONTS --*/ + if (in_array($family,$this->available_CJK_fonts)) { + if (empty($this->Big5_widths)) { require(_MPDF_PATH . 'includes/CJKdata.php'); } + $this->AddCJKFont($family); // don't need to add style + return; + } +/*-- END CJK-FONTS --*/ + + if ($this->usingCoreFont) { die("mPDF Error - problem with Font management"); } + + $stylekey = $style; + if (!$style) { $stylekey = 'R'; } + + if (!isset($this->fontdata[$family][$stylekey]) || !$this->fontdata[$family][$stylekey]) { + die('mPDF Error - Font is not supported - '.$family.' '.$style); + } + + $name = ''; + $originalsize = 0; + $sip = false; + $smp = false; + $unAGlyphs = false; // mPDF 5.4.05 + $haskerninfo = false; + $BMPselected = false; + @include(_MPDF_TTFONTDATAPATH.$fontkey.'.mtx.php'); + + $ttffile = ''; + if (defined('_MPDF_SYSTEM_TTFONTS')) { + $ttffile = _MPDF_SYSTEM_TTFONTS.$this->fontdata[$family][$stylekey]; + if (!file_exists($ttffile)) { $ttffile = ''; } + } + if (!$ttffile) { + $ttffile = _MPDF_TTFONTPATH.$this->fontdata[$family][$stylekey]; + if (!file_exists($ttffile)) { die("mPDF Error - cannot find TTF TrueType font file - ".$ttffile); } + } + $ttfstat = stat($ttffile); + + if (isset($this->fontdata[$family]['TTCfontID'][$stylekey])) { $TTCfontID = $this->fontdata[$family]['TTCfontID'][$stylekey]; } + else { $TTCfontID = 0; } + + + $BMPonly = false; + if (in_array($family,$this->BMPonly)) { $BMPonly = true; } + $regenerate = false; + if ($BMPonly && !$BMPselected) { $regenerate = true; } + else if (!$BMPonly && $BMPselected) { $regenerate = true; } + if ($this->useKerning && !$haskerninfo) { $regenerate = true; } + // mPDF 5.4.05 + if (isset($this->fontdata[$family]['unAGlyphs']) && $this->fontdata[$family]['unAGlyphs'] && !$unAGlyphs) { + $regenerate = true; + $unAGlyphs = true; + } + else if ((!isset($this->fontdata[$family]['unAGlyphs']) || !$this->fontdata[$family]['unAGlyphs']) && $unAGlyphs) { + $regenerate = true; + $unAGlyphs = false; + } + if (!isset($name) || $originalsize != $ttfstat['size'] || $regenerate) { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $ttf->getMetrics($ttffile, $TTCfontID, $this->debugfonts, $BMPonly, $this->useKerning, $unAGlyphs); // mPDF 5.4.05 + $cw = $ttf->charWidths; + $kerninfo = $ttf->kerninfo; + $haskerninfo = true; + $name = preg_replace('/[ ()]/','',$ttf->fullName); + $sip = $ttf->sipset; + $smp = $ttf->smpset; + + $desc= array('Ascent'=>round($ttf->ascent), + 'Descent'=>round($ttf->descent), + 'CapHeight'=>round($ttf->capHeight), + 'Flags'=>$ttf->flags, + 'FontBBox'=>'['.round($ttf->bbox[0])." ".round($ttf->bbox[1])." ".round($ttf->bbox[2])." ".round($ttf->bbox[3]).']', + 'ItalicAngle'=>$ttf->italicAngle, + 'StemV'=>round($ttf->stemV), + 'MissingWidth'=>round($ttf->defaultWidth)); + $panose = ''; + // mPDF 5.5.19 + if (count($ttf->panose)) { + $panoseArray = array_merge(array($ttf->sFamilyClass, $ttf->sFamilySubClass), $ttf->panose); + foreach($panoseArray as $value) + $panose .= ' '.dechex($value); + } + $up = round($ttf->underlinePosition); + $ut = round($ttf->underlineThickness); + $originalsize = $ttfstat['size']+0; + $type = 'TTF'; + //Generate metrics .php file + $s='useKerning) { + $s.='$kerninfo='.var_export($kerninfo,true).";\n"; + $s.='$haskerninfo=true;'."\n"; + } + else $s.='$haskerninfo=false;'."\n"; + // mPDF 5.4.05 + if ($this->fontdata[$family]['unAGlyphs']) { + $s.='$unAGlyphs=true;'."\n"; + } + else $s.='$unAGlyphs=false;'."\n"; + $s.="?>"; + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.mtx.php',"w"); + fwrite($fh,$s,strlen($s)); + fclose($fh); + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.cw.dat',"wb"); + fwrite($fh,$cw,strlen($cw)); + fclose($fh); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cgm'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.z'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cw127.php'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cw'); + } + else if ($this->debugfonts) { $this->Error('Cannot write to the font caching directory - '._MPDF_TTFONTDATAPATH); } + unset($ttf); + } + else { + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$fontkey.'.cw.dat'); + } + + if (isset($this->fontdata[$family]['indic']) && $this->fontdata[$family]['indic']) { $indic = true; } + else { $indic = false; } + if (isset($this->fontdata[$family]['sip-ext']) && $this->fontdata[$family]['sip-ext']) { $sipext = $this->fontdata[$family]['sip-ext']; } + else { $sipext = ''; } + + + $i = count($this->fonts)+$this->extraFontSubsets+1; + if ($sip || $smp) { + $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'panose'=>$panose, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subsets'=>array(0=>range(0,127)), 'subsetfontids'=>array($i), 'used'=>false, 'indic'=>$indic, 'sip'=>$sip, 'sipext'=>$sipext, 'smp'=>$smp, 'TTCfontID' => $TTCfontID, 'unAGlyphs' => false); // mPDF 5.4.05 + } + else { + $ss = array(); + for ($s=32; $s<128; $s++) { $ss[$s] = $s; } + $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'panose'=>$panose, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subset'=>$ss, 'used'=>false, 'indic'=>$indic, 'sip'=>$sip, 'sipext'=>$sipext, 'smp'=>$smp, 'TTCfontID' => $TTCfontID, 'unAGlyphs' => $unAGlyphs); // mPDF 5.4.05 + } + if ($this->useKerning && $haskerninfo) { $this->fonts[$fontkey]['kerninfo'] = $kerninfo; } + $this->FontFiles[$fontkey]=array('length1'=>$originalsize, 'type'=>"TTF", 'ttffile'=>$ttffile, 'sip'=>$sip, 'smp'=>$smp); + unset($cw); +} + + + +function SetFont($family,$style='',$size=0, $write=true, $forcewrite=false) { + $family=strtolower($family); + if (!$this->onlyCoreFonts) { + if ($family == 'sans' || $family == 'sans-serif') { $family = $this->sans_fonts[0]; } + if ($family == 'serif') { $family = $this->serif_fonts[0]; } + if ($family == 'mono' || $family == 'monospace') { $family = $this->mono_fonts[0]; } + } + if (isset($this->fonttrans[$family]) && $this->fonttrans[$family]) { $family = $this->fonttrans[$family]; } + if($family=='') { + if ($this->FontFamily) { $family=$this->FontFamily; } + else if ($this->default_font) { $family=$this->default_font; } + else { $this->Error("No font or default font set!"); } + } + $this->ReqFontStyle = $style; // required or requested style - used later for artificial bold/italic + + if (($family == 'csymbol') || ($family == 'czapfdingbats') || ($family == 'ctimes') || ($family == 'ccourier') || ($family == 'chelvetica')) { + if ($this->PDFA || $this->PDFX) { + if ($family == 'csymbol' || $family == 'czapfdingbats') { + $this->Error("Symbol and Zapfdingbats cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a)."); + } + if ($family == 'ctimes' || $family == 'ccourier' || $family == 'chelvetica') { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Core Adobe font ".ucfirst($family)." cannot be embedded in mPDF, which is required for PDFA1-b or PDFX/1-a. (Embedded font will be substituted.)"; } + if ($family == 'chelvetica') { $family = 'sans'; } + if ($family == 'ctimes') { $family = 'serif'; } + if ($family == 'ccourier') { $family = 'mono'; } + } + $this->usingCoreFont = false; + } + else { $this->usingCoreFont = true; } + if($family=='csymbol' || $family=='czapfdingbats') { $style=''; } + } + else { $this->usingCoreFont = false; } + + $this->U=false; + $this->S=false; + if ($style) { + $style=strtoupper($style); + if(strpos($style,'U')!==false) { + $this->U=true; + $style=str_replace('U','',$style); + } + if(strpos($style,'S')!==false) { + $this->S=true; + // Small Caps + if (empty($this->upperCase)) { @include(_MPDF_PATH.'includes/upperCase.php'); } + $style=str_replace('S','',$style); + } + if ($style=='IB') $style='BI'; + } + if ($size==0) $size=$this->FontSizePt; + + $fontkey=$family.$style; + + $stylekey = $style; + if (!$stylekey) { $stylekey = "R"; } + + if (!$this->onlyCoreFonts && !$this->usingCoreFont) { + if(!isset($this->fonts[$fontkey]) || count($this->default_available_fonts) != count($this->available_unifonts) ) { // not already added +/*-- CJK-FONTS --*/ + // CJK fonts + if (in_array($fontkey,$this->available_CJK_fonts)) { + if(!isset($this->fonts[$fontkey])) { // already added + if (empty($this->Big5_widths)) { require(_MPDF_PATH . 'includes/CJKdata.php'); } + $this->AddCJKFont($family); // don't need to add style + } + } + // Test to see if requested font/style is available - or substitute + else +/*-- END CJK-FONTS --*/ + if (!in_array($fontkey,$this->available_unifonts)) { + // If font[nostyle] exists - set it + if (in_array($family,$this->available_unifonts)) { + $style = ''; + } + + // Else if only one font available - set it (assumes if only one font available it will not have a style) + else if (count($this->available_unifonts) == 1) { + $family = $this->available_unifonts[0]; + $style = ''; + } + + else { + $found = 0; + // else substitute font of similar type + if (in_array($family,$this->sans_fonts)) { + $i = array_intersect($this->sans_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + else if (in_array($family,$this->serif_fonts)) { + $i = array_intersect($this->serif_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + else if (in_array($family,$this->mono_fonts)) { + $i = array_intersect($this->mono_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + + if (!$found) { + // set first available font + $fs = $this->available_unifonts[0]; + preg_match('/^([a-z_0-9\-]+)([BI]{0,2})$/',$fs,$fas); // Allow "-" + // with requested style if possible + $ws = $fas[1].$style; + if (in_array($ws,$this->available_unifonts)) { + $family = $fas[1]; // leave $style as is + } + else if (in_array($fas[1],$this->available_unifonts)) { + // or without style + $family = $fas[1]; + $style = ''; + } + else { + // or with the style specified + $family = $fas[1]; + $style = $fas[2]; + } + } + } + $fontkey = $family.$style; + } + } + // try to add font (if not already added) + $this->AddFont($family, $style); + + //Test if font is already selected + if($this->FontFamily == $family && $this->FontFamily == $this->currentfontfamily && $this->FontStyle == $style && $this->FontStyle == $this->currentfontstyle && $this->FontSizePt == $size && $this->FontSizePt == $this->currentfontsize && !$forcewrite) { + return $family; + } + + $fontkey = $family.$style; + + //Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size / _MPDFK; + $this->CurrentFont = &$this->fonts[$fontkey]; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + + + + // Added - currentfont (lowercase) used in HTML2PDF + $this->currentfontfamily=$family; + $this->currentfontsize=$size; + $this->currentfontstyle=$style.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->setMBencoding('UTF-8'); + } + + else { // if using core fonts + + + if ($this->PDFA || $this->PDFX) { + $this->Error('Core Adobe fonts cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a) - cannot use option to use core fonts.'); + } + $this->setMBencoding('windows-1252'); + + //Test if font is already selected + if(($this->FontFamily == $family) AND ($this->FontStyle == $style) AND ($this->FontSizePt == $size) && !$forcewrite) { + return $family; + } + + if (!isset($this->CoreFonts[$fontkey])) { + if (in_array($family,$this->serif_fonts)) { $family = 'ctimes'; } + else if (in_array($family,$this->mono_fonts)) { $family = 'ccourier'; } + else { $family = 'chelvetica'; } + $this->usingCoreFont = true; + $fontkey = $family.$style; + } + + if(!isset($this->fonts[$fontkey])) { + // STANDARD CORE FONTS + if (isset($this->CoreFonts[$fontkey])) { + //Load metric file + $file=$family; + if($family=='ctimes' || $family=='chelvetica' || $family=='ccourier') { $file.=strtolower($style); } + $file.='.php'; + include(_MPDF_PATH.'font/'.$file); + if(!isset($cw)) { $this->Error('Could not include font metric file'); } + $i=count($this->fonts)+$this->extraFontSubsets+1; + $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw); + if ($this->useKerning) { $this->fonts[$fontkey]['kerninfo'] = $kerninfo; } + } + else { + die('mPDF error - Font not defined'); + } + } + //Test if font is already selected + if(($this->FontFamily == $family) AND ($this->FontStyle == $style) AND ($this->FontSizePt == $size) && !$forcewrite) { + return $family; + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/_MPDFK; + $this->CurrentFont=&$this->fonts[$fontkey]; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + // Added - currentfont (lowercase) used in HTML2PDF + $this->currentfontfamily=$family; + $this->currentfontsize=$size; + $this->currentfontstyle=$style.($this->U ? 'U' : '').($this->S ? 'S' : ''); + + } + + return $family; +} + +function SetFontSize($size,$write=true) { + //Set font size in points + if($this->FontSizePt==$size) return; + $this->FontSizePt=$size; + $this->FontSize=$size/_MPDFK; + $this->currentfontsize=$size; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + // Edited mPDF 3.0 + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } +} + +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) { + $l = array($x*_MPDFK,$this->hPt-$y*_MPDFK,$w*_MPDFK,$h*_MPDFK,$link); + if ($this->keep_block_together) { // Save to array - don't write yet + $this->ktLinks[$this->page][]= $l; + return; + } + else if ($this->table_rotate) { // *TABLES* + $this->tbrot_Links[$this->page][]= $l; // *TABLES* + return; // *TABLES* + } // *TABLES* + else if ($this->kwt) { + $this->kwt_Links[$this->page][]= $l; + return; + } + + if ($this->writingHTMLheader || $this->writingHTMLfooter) { + $this->HTMLheaderPageLinks[]= $l; + return; + } + //Put a link on the page + $this->PageLinks[$this->page][]= $l; + // Save cross-reference to Column buffer + $ref = count($this->PageLinks[$this->page])-1; // *COLUMNS* + $this->columnLinks[$this->CurrCol][INTVAL($this->x)][INTVAL($this->y)] = $ref; // *COLUMNS* + +} + +function Text($x,$y,$txt) { + // Output a string + // Called (internally) by Watermark and _tableWrite [rotated cells] + // Expects input to be mb_encoded if necessary and RTL reversed + + // ARTIFICIAL BOLD AND ITALIC + $s = 'q '; + if ($this->falseBoldWeight && strpos($this->ReqFontStyle,"B") !== false && strpos($this->FontStyle,"B") === false) { + $s .= '2 Tr 1 J 1 j '; + $s .= sprintf('%.3F w ',($this->FontSize/130)*_MPDFK*$this->falseBoldWeight); + $tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$tc) { $s .= $tc.' '; } // stroke (outline) = same colour as text(fill) + } + if (strpos($this->ReqFontStyle,"I") !== false && strpos($this->FontStyle,"I") === false) { + $aix = '1 0 0.261799 1 %.3F %.3F Tm'; + } + else { $aix = '%.3F %.3F Td'; } + + if($this->ColorFlag) $s.=$this->TextColor.' '; + + $this->CurrentFont['used']= true; + if ($this->CurrentFont['type']=='TTF' && ($this->CurrentFont['sip'] || $this->CurrentFont['smp'])) { + $txt2 = str_replace(chr(194).chr(160),chr(32),$txt); + $txt2 = $this->UTF8toSubset($txt2); + $s.=sprintf('BT '.$aix.' %s Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$txt2); + } + else if (!$this->usingCoreFont) { + $txt2 = str_replace(chr(194).chr(160),chr(32),$txt); + $this->UTF8StringToArray($txt2); // this is just to add chars to subset list + if ($this->kerning && $this->useKerning) { $s .= $this->_kern($txt2, '', $aix, $x, $y); } + else { + //Convert string to UTF-16BE without BOM + $txt2= $this->UTF8ToUTF16BE($txt2, false); + $s.=sprintf('BT '.$aix.' (%s) Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$this->_escape($txt2)); + } + } + else { + $txt2 = str_replace(chr(160),chr(32),$txt); + if ($this->kerning && $this->useKerning) { $s .= $this->_kern($txt2, '', $aix, $x, $y); } + else { + $s.=sprintf('BT '.$aix.' (%s) Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$this->_escape($txt2)); + } + } + if($this->U && $txt!='') { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $s.= ' '.$c.' '; } + if (isset($this->CurrentFont['up'])) { $up=$this->CurrentFont['up']; } + else { $up = -100; } + $adjusty = (-$up/1000* $this->FontSize); + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $s.=' '.(sprintf(' %.3F w',$ut*_MPDFK)); + $s.=' '.$this->_dounderline($x,$y + $adjusty,$txt); + $s.=' '.(sprintf(' %.3F w',$olw*_MPDFK)); + if($this->FillColor!=$c) { $s.= ' '.$this->FillColor.' '; } + } + // STRIKETHROUGH + if($this->strike && $txt!='') { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $s.= ' '.$c.' '; } + //Superscript and Subscript Y coordinate adjustment (now for striked-through texts) + if (isset($this->CurrentFont['desc']['CapHeight'])) { $ch=$this->CurrentFont['desc']['CapHeight']; } + else { $ch = 700; } + $adjusty = (-$ch/1000* $this->FontSize) * 0.35; + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $s.=' '.(sprintf(' %.3F w',$ut*_MPDFK)); + $s.=' '.$this->_dounderline($x,$y+$adjusty,$txt); + $s.=' '.(sprintf(' %.3F w',$olw*_MPDFK)); + if($this->FillColor!=$c) { $s.= ' '.$this->FillColor.' '; } + } + $s .= 'Q'; + $this->_out($s); +} + +/*-- DIRECTW --*/ +function WriteText($x,$y,$txt) { + // Output a string using Text() but does encoding and text reversing of RTL + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + $this->magic_reverse_dir($txt, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($txt); // *INDIC* + $this->Text($x,$y,$txt); +} + +function WriteCell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='', $currentx=0) { + //Output a cell using Cell() but does encoding and text reversing of RTL + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + $this->magic_reverse_dir($txt, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($txt); // *INDIC* + $this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link, $currentx); +} +/*-- END DIRECTW --*/ + + +function ResetSpacing() { + if ($this->ws != 0) { $this->_out('BT 0 Tw ET'); } + $this->ws=0; + if ($this->charspacing != 0) { $this->_out('BT 0 Tc ET'); } + $this->charspacing=0; +} + + +function SetSpacing($cs,$ws) { + if (intval($cs*1000)==0) { $cs = 0; } + if ($cs) { $this->_out(sprintf('BT %.3F Tc ET',$cs)); } + else if ($this->charspacing != 0) { $this->_out('BT 0 Tc ET'); } + $this->charspacing=$cs; + if (intval($ws*1000)==0) { $ws = 0; } + if ($ws) { $this->_out(sprintf('BT %.3F Tw ET',$ws)); } + else if ($this->ws != 0) { $this->_out('BT 0 Tw ET'); } + $this->ws=$ws; +} + +// WORD SPACING +function GetJspacing($nc,$ns,$w,$inclCursive) { + $ws = 0; + $charspacing = 0; + $ww = $this->jSWord; + $ncx = $nc-1; + if ($nc == 0) { return array(0,0); } + else if ($nc==1) { $charspacing = $w; } + // Only word spacing allowed / possible + else if ($this->fixedlSpacing !== false || $inclCursive) { + if ($ns) { $ws = $w / $ns; } + } + else if (!$ns) { + $charspacing = $w / ($ncx ); + if (($this->jSmaxChar > 0) && ($charspacing > $this->jSmaxChar)) { + $charspacing = $this->jSmaxChar; + } + } + else if ($ns == ($ncx )) { + $charspacing = $w / $ns; + } + else { + if ($this->usingCoreFont) { + $cs = ($w * (1 - $this->jSWord)) / ($ncx ); + if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) { + $cs = $this->jSmaxChar; + $ww = 1 - (($cs * ($ncx ))/$w); + } + $charspacing = $cs; + $ws = ($w * ($ww) ) / $ns; + } + else { + $cs = ($w * (1 - $this->jSWord)) / ($ncx -$ns); + if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) { + $cs = $this->jSmaxChar; + $ww = 1 - (($cs * ($ncx -$ns))/$w); + } + $charspacing = $cs; + $ws = (($w * ($ww) ) / $ns) - $charspacing; + } + } + return array($charspacing,$ws); +} + +function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='', $currentx=0, $lcpaddingL=0, $lcpaddingR=0, $valign='M', $spanfill=0, $abovefont=0, $belowfont=0, $exactWidth=false) { + //Output a cell + // Expects input to be mb_encoded if necessary and RTL reversed + // NON_BREAKING SPACE + if ($this->usingCoreFont) { + $txt = str_replace(chr(160),chr(32),$txt); + } + else { + $txt = str_replace(chr(194).chr(160),chr(32),$txt); + } + + $oldcolumn = $this->CurrCol; + // Automatic page break + // Allows PAGE-BREAK-AFTER = avoid to work + + if (!$this->tableLevel && (($this->y+$this->divheight>$this->PageBreakTrigger) || ($this->y+$h>$this->PageBreakTrigger) || + ($this->y+($h*2)>$this->PageBreakTrigger && $this->blk[$this->blklvl]['page_break_after_avoid'])) and !$this->InFooter and $this->AcceptPageBreak()) { + $x=$this->x;//Current X position + + + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + // Added to correct for OddEven Margins + $x += $this->MarginCorrection; + if ($currentx) { + $currentx += $this->MarginCorrection; + } + $this->x=$x; + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + // Test: to put line through centre of cell: $this->Line($this->x,$this->y+($h/2),$this->x+50,$this->y+($h/2)); + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($currentx) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } + + // COLUMNS Update/overwrite the lowest bottom of printing y value for a column + if ($this->ColActive) { + if ($h) { $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$h; } + else { $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$this->divheight; } + } +/*-- END COLUMNS --*/ + + // KEEP BLOCK TOGETHER Update/overwrite the lowest bottom of printing y value on first page + if ($this->keep_block_together) { + if ($h) { $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$h; } +// else { $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$this->divheight; } + } + + if($w==0) $w = $this->w-$this->rMargin-$this->x; + $s=''; + if($fill==1 && $this->FillColor) { + if((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor']) || $this->keep_block_together) { $s .= $this->FillColor.' '; } + $this->pageoutput[$this->page]['FillColor'] = $this->FillColor; + } + + + $boxtop = $this->y; + $boxheight = $h; + $boxbottom = $this->y+$h; + + if($txt!='') { + // FONT SIZE - this determines the baseline caculation + if ($this->linemaxfontsize && !$this->processingHeader) { $bfs = $this->linemaxfontsize; } + else { $bfs = $this->FontSize; } + //Calculate baseline Superscript and Subscript Y coordinate adjustment + $bfx = $this->baselineC; + $baseline = $bfx*$bfs; + if($this->SUP) { $baseline += ($bfx-1.05)*$this->FontSize; } + else if($this->SUB) { $baseline += ($bfx + 0.04)*$this->FontSize; } + else if($this->bullet) { $baseline += ($bfx-0.7)*$this->FontSize; } + + // Vertical align (for Images) + if ($abovefont || $belowfont) { // from flowing block - valign always M + $va = $abovefont + (0.5*$bfs); + } + else if ($this->lineheight_correction) { + if ($valign == 'T') { $va = (0.5 * $bfs * $this->lineheight_correction); } + else if ($valign == 'B') { $va = $h-(0.5 * $bfs * $this->lineheight_correction); } + else { $va = 0.5*$h; } // Middle + } + else { + if ($valign == 'T') { $va = (0.5 * $bfs * $this->default_lineheight_correction); } + else if ($valign == 'B') { $va = $h-(0.5 * $bfs * $this->default_lineheight_correction); } + else { $va = 0.5*$h; } // Middle + } + + // ONLY SET THESE IF WANT TO CONFINE BORDER +/- FILL TO FIT FONTSIZE - NOT FULL CELL AS IS ORIGINAL FUNCTION + // spanfill or spanborder are set in FlowingBlock functions + if ($spanfill || !empty($this->spanborddet) || $link!='') { + $exth = 0.2; // Add to fontsize to increase height of background / link / border + $boxtop = $this->y+$baseline+$va-($this->FontSize*(1+$exth/2)*(0.5+$bfx)); + $boxheight = $this->FontSize * (1+$exth); + $boxbottom = $boxtop + $boxheight; + } + } + + $bbw = $tbw = $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + if (!isset($this->spanborddet['B'])) { $this->spanborddet['B'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['T'])) { $this->spanborddet['T'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['L'])) { $this->spanborddet['L'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['R'])) { $this->spanborddet['R'] = array('s' => 0, 'style' => '', 'w' => 0); } + $bbw = $this->spanborddet['B']['w']; + $tbw = $this->spanborddet['T']['w']; + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if($fill==1 || $border==1 || !empty($this->spanborddet)) { + if (!empty($this->spanborddet)) { + if ($fill==1) { + $s.=sprintf('%.3F %.3F %.3F %.3F re f ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($w+$lbw+$rbw)*_MPDFK,(-$boxheight-$tbw-$bbw)*_MPDFK); + } + $s.= ' q '; + $dashon = 3; + $dashoff = 3.5; + $dot = 2.5; + if($tbw) { + $short = 0; + if ($this->spanborddet['T']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$tbw*$dashon*_MPDFK,$tbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['T']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$tbw*$dot*_MPDFK,-$tbw/2*_MPDFK); + $short = $tbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['T']['c'],true); + if ($this->spanborddet['T']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$tbw/3*_MPDFK); + $xadj = $xadj2 = 0; + if ($this->spanborddet['L']['style'] == 'double') { $xadj = $this->spanborddet['L']['w']*2/3; } + if ($this->spanborddet['R']['style'] == 'double') { $xadj2 = $this->spanborddet['R']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw*5/6)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxtop+$tbw*5/6)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw+$xadj)*_MPDFK,($this->h-$boxtop+$tbw/6)*_MPDFK,($this->x+$w+$rbw-$short-$xadj2)*_MPDFK,($this->h-$boxtop+$tbw/6)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$tbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw/2)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxtop+$tbw/2)*_MPDFK); + } + } + if($bbw) { + $short = 0; + if ($this->spanborddet['B']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$bbw*$dashon*_MPDFK,$bbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['B']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$bbw*$dot*_MPDFK,-$bbw/2*_MPDFK); + $short = $bbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['B']['c'],true); + if ($this->spanborddet['B']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$bbw/3*_MPDFK); + $xadj = $xadj2 = 0; + if ($this->spanborddet['L']['style'] == 'double') { $xadj = $this->spanborddet['L']['w']*2/3; } + if ($this->spanborddet['R']['style'] == 'double') { $xadj2 = $this->spanborddet['R']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw+$xadj)*_MPDFK,($this->h-$boxbottom-$bbw/6)*_MPDFK,($this->x+$w+$rbw-$short-$xadj2)*_MPDFK,($this->h-$boxbottom-$bbw/6)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxbottom-$bbw*5/6)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxbottom-$bbw*5/6)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$bbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxbottom-$bbw/2)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxbottom-$bbw/2)*_MPDFK); + } + } + if($lbw) { + $short = 0; + if ($this->spanborddet['L']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$lbw*$dashon*_MPDFK,$lbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['L']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$lbw*$dot*_MPDFK,-$lbw/2*_MPDFK); + $short = $lbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['L']['c'],true); + if ($this->spanborddet['L']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$lbw/3*_MPDFK); + $yadj = $yadj2 = 0; + if ($this->spanborddet['T']['style'] == 'double') { $yadj = $this->spanborddet['T']['w']*2/3; } + if ($this->spanborddet['B']['style'] == 'double') { $yadj2 = $this->spanborddet['B']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw/6)*_MPDFK,($this->h-$boxtop+$tbw-$yadj)*_MPDFK,($this->x-$lbw/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short+$yadj2)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw*5/6)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x-$lbw*5/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$lbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw/2)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x-$lbw/2)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + } + if($rbw) { + $short = 0; + if ($this->spanborddet['R']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$rbw*$dashon*_MPDFK,$rbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['R']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$rbw*$dot*_MPDFK,-$rbw/2*_MPDFK); + $short = $rbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['R']['c'],true); + if ($this->spanborddet['R']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$rbw/3*_MPDFK); + $yadj = $yadj2 = 0; + if ($this->spanborddet['T']['style'] == 'double') { $yadj = $this->spanborddet['T']['w']*2/3; } + if ($this->spanborddet['B']['style'] == 'double') { $yadj2 = $this->spanborddet['B']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw/6)*_MPDFK,($this->h-$boxtop+$tbw-$yadj)*_MPDFK,($this->x+$w+$rbw/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short+$yadj2)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw*5/6)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x+$w+$rbw*5/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$rbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw/2)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x+$w+$rbw/2)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + } + $s.= ' Q '; + } + else { + if ($fill==1) $op=($border==1) ? 'B' : 'f'; + else $op='S'; + $s.=sprintf('%.3F %.3F %.3F %.3F re %s ',$this->x*_MPDFK,($this->h-$boxtop)*_MPDFK,$w*_MPDFK,-$boxheight*_MPDFK,$op); + } + } + + if(is_string($border)) { + $x=$this->x; + $y=$this->y; + if(is_int(strpos($border,'L'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-$boxtop)*_MPDFK,$x*_MPDFK,($this->h-($boxbottom))*_MPDFK); + if(is_int(strpos($border,'T'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-$boxtop)*_MPDFK,($x+$w)*_MPDFK,($this->h-$boxtop)*_MPDFK); + if(is_int(strpos($border,'R'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($x+$w)*_MPDFK,($this->h-$boxtop)*_MPDFK,($x+$w)*_MPDFK,($this->h-($boxbottom))*_MPDFK); + if(is_int(strpos($border,'B'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-($boxbottom))*_MPDFK,($x+$w)*_MPDFK,($this->h-($boxbottom))*_MPDFK); + } + + if($txt!='') { + if ($exactWidth) + $stringWidth = $w; + else + $stringWidth = $this->GetStringWidth($txt) + ( $this->charspacing * mb_strlen( $txt, $this->mb_enc ) / _MPDFK ) + + ( $this->ws * mb_substr_count( $txt, ' ', $this->mb_enc ) / _MPDFK ); + + // Set x OFFSET FOR PRINTING + if($align=='R') { + $dx=$w-$this->cMarginR - $stringWidth - $lcpaddingR; + } + elseif($align=='C') { + $dx=(($w - $stringWidth )/2); + } + elseif($align=='L' or $align=='J') $dx=$this->cMarginL + $lcpaddingL; + else $dx = 0; + + if($this->ColorFlag) $s .='q '.$this->TextColor.' '; + + // OUTLINE + if($this->textparam['outline-s'] && !$this->S) { // mPDF 5.6.07 + $s .=' '.sprintf('%.3F w',$this->LineWidth*_MPDFK).' '; + $s .=" $this->DrawColor "; + $s .=" 2 Tr "; + } + else if ($this->falseBoldWeight && strpos($this->ReqFontStyle,"B") !== false && strpos($this->FontStyle,"B") === false && !$this->S) { // can't use together with OUTLINE or Small Caps + $s .= ' 2 Tr 1 J 1 j '; + $s .= ' '.sprintf('%.3F w',($this->FontSize/130)*_MPDFK*$this->falseBoldWeight).' '; + $tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$tc) { $s .= ' '.$tc.' '; } // stroke (outline) = same colour as text(fill) + } + else { $s .=" 0 Tr "; } // mPDF 5.6.07 + + if (strpos($this->ReqFontStyle,"I") !== false && strpos($this->FontStyle,"I") === false) { // Artificial italic + $aix = '1 0 0.261799 1 %.3F %.3F Tm '; + } + else { $aix = '%.3F %.3F Td '; } + + // THE TEXT + $sub = ''; + $this->CurrentFont['used']= true; + + // WORD SPACING + // IF multibyte - Tw has no effect - need to use alternative method - do word spacing using an adjustment before each space + if ($this->ws && !$this->usingCoreFont && !$this->CurrentFont['sip'] && !$this->CurrentFont['smp'] && !$this->S) { + $sub .= ' BT 0 Tw ET '; + if ($this->kerning && $this->useKerning) { $sub .= $this->_kern($txt, 'MBTw', $aix, ($this->x+$dx), ($this->y+$baseline+$va)); } + else { + $space = " "; + //Convert string to UTF-16BE without BOM + $space= $this->UTF8ToUTF16BE($space , false); + $space=$this->_escape($space ); + $sub .=sprintf('BT '.$aix,($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK); + $t = explode(' ',$txt); + $sub .=sprintf(' %.3F Tc [',$this->charspacing); + $numt = count($t); + for($i=0;$i<$numt;$i++) { + $tx = $t[$i]; + //Convert string to UTF-16BE without BOM + $tx = $this->UTF8ToUTF16BE($tx , false); + $tx = $this->_escape($tx); + $sub .=sprintf('(%s) ',$tx); + if (($i+1)<$numt) { + $adj = -($this->ws)*1000/$this->FontSizePt; + $sub .=sprintf('%d(%s) ',$adj,$space); + } + } + $sub .='] TJ '; + $sub .=' ET'; + } + } + else { + $txt2= $txt; + if ($this->CurrentFont['type']=='TTF' && ($this->CurrentFont['sip'] || $this->CurrentFont['smp'])) { + if ($this->S) { $sub .= $this->_smallCaps($txt2, 'SIPSMP', $aix, $dx, _MPDFK, $baseline, $va); } + else { + $txt2 = $this->UTF8toSubset($txt2); + $sub .=sprintf('BT '.$aix.' %s Tj ET',($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK,$txt2); + } + } + else { + if ($this->S) { $sub .= $this->_smallCaps($txt2, '', $aix, $dx, _MPDFK, $baseline, $va); } + else if ($this->kerning && $this->useKerning) { $sub .= $this->_kern($txt2, '', $aix, ($this->x+$dx), ($this->y+$baseline+$va)); } + else { + if (!$this->usingCoreFont) { + $txt2 = $this->UTF8ToUTF16BE($txt2, false); + } + $txt2=$this->_escape($txt2); + $sub .=sprintf('BT '.$aix.' (%s) Tj ET',($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK,$txt2); + } + } + } + // UNDERLINE + if($this->U) { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $sub .= ' '.$c.' '; } + if (isset($this->CurrentFont['up'])) { $up=$this->CurrentFont['up']; } + else { $up = -100; } + $adjusty = (-$up/1000* $this->FontSize); + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $sub .=' '.(sprintf(' %.3F w 0 j 0 J ',$ut*_MPDFK)); + $sub .=' '.$this->_dounderline($this->x+$dx,$this->y+$baseline+$va+$adjusty,$txt); + $sub .=' '.(sprintf(' %.3F w 2 j 2 J ',$olw*_MPDFK)); + if($this->FillColor!=$c) { $sub .= ' '.$this->FillColor.' '; } + } + + // STRIKETHROUGH + if($this->strike) { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $sub .= ' '.$c.' '; } + //Superscript and Subscript Y coordinate adjustment (now for striked-through texts) + if (isset($this->CurrentFont['desc']['CapHeight'])) { $ch=$this->CurrentFont['desc']['CapHeight']; } + else { $ch = 700; } + $adjusty = (-$ch/1000* $this->FontSize) * 0.35; + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $sub .=' '.(sprintf(' %.3F w 0 j 0 J ',$ut*_MPDFK)); + $sub .=' '.$this->_dounderline($this->x+$dx,$this->y+$baseline+$va+$adjusty,$txt); + $sub .=' '.(sprintf(' %.3F w 2 j 2 J ',$olw*_MPDFK)); + if($this->FillColor!=$c) { $sub .= ' '.$this->FillColor.' '; } + } + + // TEXT SHADOW + if ($this->textshadow) { // First to process is last in CSS comma separated shadows + foreach($this->textshadow AS $ts) { + $s .= ' q '; + $s .= $this->SetTColor($ts['col'], true)."\n"; + if ($ts['col']{0}==5 && ord($ts['col']{4})<100) { // RGBa + $s .= $this->SetAlpha(ord($ts['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($ts['col']{0}==6 && ord($ts['col']{5})<100) { // CMYKa + $s .= $this->SetAlpha(ord($ts['col']{5})/100, 'Normal', true, 'F')."\n"; + } + else if ($ts['col']{0}==1 && $ts['col']{2}==1 && ord($ts['col']{3})<100) { // Gray + $s .= $this->SetAlpha(ord($ts['col']{3})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf(' 1 0 0 1 %.4F %.4F cm', $ts['x']*_MPDFK, -$ts['y']*_MPDFK)."\n"; + $s .= $sub; + $s .= ' Q '; + } + } + + $s .= $sub; + + // COLOR + if($this->ColorFlag) $s .=' Q'; + + // LINK + if($link!='') { + $this->Link($this->x,$boxtop,$w,$boxheight,$link); + } + } + if($s) $this->_out($s); + + // WORD SPACING + if ($this->ws && !$this->usingCoreFont) { + $this->_out(sprintf('BT %.3F Tc ET',$this->charspacing)); + } + $this->lasth=$h; + if( strpos($txt,"\n") !== false) $ln=1; // cell recognizes \n from
tag + if($ln>0) + { + //Go to next line + $this->y += $h; + if($ln==1) { + //Move to next line + if ($currentx != 0) { $this->x=$currentx; } + else { $this->x=$this->lMargin; } + } + } + else $this->x+=$w; + + +} + + +function _kern($txt, $mode, $aix, $x, $y) { + if ($mode == 'MBTw') { // Multibyte requiring word spacing + $space = ' '; + //Convert string to UTF-16BE without BOM + $space= $this->UTF8ToUTF16BE($space , false); + $space=$this->_escape($space ); + $s = sprintf(' BT '.$aix,$x*_MPDFK,($this->h-$y)*_MPDFK); + $t = explode(' ',$txt); + for($i=0;$iUTF8StringToArray($tx); + for($ti=0;$ti 0 && isset($this->CurrentFont['kerninfo'][$unicode[($ti-1)]][$unicode[$ti]])) { + $kern = -$this->CurrentFont['kerninfo'][$unicode[($ti-1)]][$unicode[$ti]]; + $tj .= sprintf(')%d(',$kern); + } + $tc = code2utf($unicode[$ti]); + $tc = $this->UTF8ToUTF16BE($tc, false); + $tj .= $this->_escape($tc); + } + $tj .= ')'; + $s.=sprintf(' %.3F Tc [%s] TJ',$this->charspacing,$tj); + + + if (($i+1)ws+$this->charspacing,$space); + } + } + $s.=' ET '; + } + else if (!$this->usingCoreFont) { + $s = ''; + $tj = '('; + $unicode = $this->UTF8StringToArray($txt); + for($i=0;$i 0 && isset($this->CurrentFont['kerninfo'][$unicode[($i-1)]][$unicode[$i]])) { + $kern = -$this->CurrentFont['kerninfo'][$unicode[($i-1)]][$unicode[$i]]; + $tj .= sprintf(')%d(',$kern); + } + $tx = code2utf($unicode[$i]); + $tx = $this->UTF8ToUTF16BE($tx, false); + $tj .= $this->_escape($tx); + } + $tj .= ')'; + $s.=sprintf(' BT '.$aix.' [%s] TJ ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$tj); + } + else { // CORE Font + $s = ''; + $tj = '('; + $l = strlen($txt); + for($i=0;$i<$l;$i++) { + if ($i > 0 && isset($this->CurrentFont['kerninfo'][$txt[($i-1)]][$txt[$i]])) { + $kern = -$this->CurrentFont['kerninfo'][$txt[($i-1)]][$txt[$i]]; + $tj .= sprintf(')%d(',$kern); + } + $tj .= $this->_escape($txt[$i]); + } + $tj .= ')'; + $s.=sprintf(' BT '.$aix.' [%s] TJ ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$tj); + } + + return $s; +} + + +function _smallCaps($txt, $mode, $aix, $dx, $k, $baseline, $va) { + $upp = false; + $str = array(); + $bits = array(); + if (!$this->usingCoreFont) { + $unicode = $this->UTF8StringToArray($txt); + foreach($unicode as $char) { + if ($this->ws && $char == 32) { // space + if (count($str)) { $bits[] = array($upp, $str, false); } + $bits[] = array(false, array(32), true); + $str = array(); + $upp = false; + } + else if (isset($this->upperCase[$char])) { + if (!$upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $this->upperCase[$char]; + if ((!isset($this->CurrentFont['sip']) || !$this->CurrentFont['sip']) && (!isset($this->CurrentFont['smp']) || !$this->CurrentFont['smp'])) { + $this->CurrentFont['subset'][$this->upperCase[$char]] = $this->upperCase[$char]; + } + $upp = true; + } + else { + if ($upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $char; + $upp = false; + } + } + } + else { + for($i=0;$iupperCase[ord($txt[$i])]) && $this->upperCase[ord($txt[$i])] < 256) { + if (!$upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $this->upperCase[ord($txt[$i])]; + $upp = true; + } + else { + if ($upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = ord($txt[$i]); + $upp = false; + } + } + } + if (count($str)) { $bits[] = array($upp, $str, false); } + + $fid = $this->CurrentFont['i']; + + $s=sprintf(' BT '.$aix,($this->x+$dx)*$k,($this->h-($this->y+$baseline+$va))*$k); + foreach($bits AS $b) { + if ($b[0]) { $upp = true; } + else { $upp = false; } + + $size = count ($b[1]); + $txt = ''; + for ($i = 0; $i < $size; $i++) { + $txt .= code2utf($b[1][$i]); + } + if ($this->usingCoreFont) { + $txt = utf8_decode($txt); + } + if ($mode == 'SIPSMP') { + $txt = $this->UTF8toSubset($txt); + } + else { + if (!$this->usingCoreFont) { + $txt = $this->UTF8ToUTF16BE($txt, false); + } + $txt=$this->_escape($txt); + $txt = '('.$txt.')'; + } + if ($b[2]) { // space + $s.=sprintf(' /F%d %.3F Tf %d Tz', $fid, $this->FontSizePt, 100); + $s.=sprintf(' %.3F Tc', ($this->charspacing+$this->ws)); + $s.=sprintf(' %s Tj', $txt); + } + else if ($upp) { + $s.=sprintf(' /F%d %.3F Tf', $fid, $this->FontSizePt*$this->smCapsScale); + $s.=sprintf(' %d Tz', $this->smCapsStretch); + $s.=sprintf(' %.3F Tc', ($this->charspacing*100/$this->smCapsStretch)); + $s.=sprintf(' %s Tj', $txt); + } + else { + $s.=sprintf(' /F%d %.3F Tf %d Tz', $fid, $this->FontSizePt, 100); + $s.=sprintf(' %.3F Tc', ($this->charspacing)); + $s.=sprintf(' %s Tj', $txt); + } + } + $s.=' ET '; + return $s; +} + + +function MultiCell($w,$h,$txt,$border=0,$align='',$fill=0,$link='',$directionality='ltr',$encoded=false) +{ + // Parameter (pre-)encoded - When called internally from ToC or textarea: mb_encoding already done - but not reverse RTL/Indic + if (!$encoded) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // Font-specific ligature substitution for Indic fonts + else if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { // *INDIC* + $this->ConvertIndic($tmp); // *INDIC* + } // *INDIC* + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + } + if (!$align) { $align = $this->defaultAlign; } + + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) $w=$this->w-$this->rMargin-$this->x; + + $wmax = ($w - ($this->cMarginL+$this->cMarginR)); + if ($this->usingCoreFont) { + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + while($nb>0 and $s[$nb-1]=="\n") $nb--; + } + else { + $s=str_replace("\r",'',$txt); + $nb=mb_strlen($s, $this->mb_enc ); + while($nb>0 and mb_substr($s,$nb-1,1,$this->mb_enc )=="\n") $nb--; + } + $b=0; + if($border) { + if($border==1) { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else { + $b2=''; + if(is_int(strpos($border,'L'))) $b2.='L'; + if(is_int(strpos($border,'R'))) $b2.='R'; + $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + + + + if (!$this->usingCoreFont) { + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } + else if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + while($i<$nb) { + //Get next character + $c = mb_substr($s,$i,1,$this->mb_enc ); + if($c == "\n") { + //Explicit line break + // WORD SPACING + $this->ResetSpacing(); + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + continue; + } + if($c == " ") { + $sep=$i; + $ls=$l; + $ns++; + } + + $l += $this->GetCharWidthNonCore($c); + + if($l>$wmax) { + //Automatic line break + if($sep==-1) { // Only one word + if($i==$j) $i++; + // WORD SPACING + $this->ResetSpacing(); + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + } + else { + $tmp = rtrim(mb_substr($s,$j,$sep-$j,$this->mb_enc)); + if($align=='J') { + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING UNICODE + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(194).chr(160),chr(32),$tmp ); + $len_ligne = $this->GetStringWidth($tmp ); + $nb_carac = mb_strlen( $tmp , $this->mb_enc ) ; + $nb_spaces = mb_substr_count( $tmp ,' ', $this->mb_enc ) ; + + $inclCursive=false; + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $tmp)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $tmp)) { $inclCursive = true; } // *INDIC* + } + list($charspacing,$ws) = $this->GetJspacing($nb_carac,$nb_spaces,((($wmax) - $len_ligne) * _MPDFK),$inclCursive); + $this->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + } + else $i++; + } + //Last chunk + // WORD SPACING + + $this->ResetSpacing(); + + } + + + else { + + while($i<$nb) { + //Get next character + $c=$s[$i]; + if($c == "\n") { + //Explicit line break + // WORD SPACING + $this->ResetSpacing(); + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + continue; + } + if($c == " ") { + $sep=$i; + $ls=$l; + $ns++; + } + + $l += $this->GetCharWidthCore($c); + if($l>$wmax) { + //Automatic line break + if($sep==-1) { + if($i==$j) $i++; + // WORD SPACING + $this->ResetSpacing(); + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); + } + else { + if($align=='J') { + $tmp = rtrim(substr($s,$j,$sep-$j)); + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING NON_UNICDOE/CJK + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(160),chr(32),$tmp); + $len_ligne = $this->GetStringWidth($tmp ); + $nb_carac = strlen( $tmp ) ; + $nb_spaces = substr_count( $tmp ,' ' ) ; + list($charspacing,$ws) = $this->GetJspacing($nb_carac,$nb_spaces,((($wmax) - $len_ligne) * _MPDFK),false); + $this->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + } + else $i++; + } + //Last chunk + // WORD SPACING + + $this->ResetSpacing(); + + } + //Last chunk + if($border and is_int(strpos($border,'B'))) $b.='B'; + if (!$this->usingCoreFont) { + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + } + else { $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); } + $this->x=$this->lMargin; +} + + +/*-- DIRECTW --*/ +function Write($h,$txt,$currentx=0,$link='',$directionality='ltr',$align='') { + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->Write($h,$txt,$currentx,$link,$directionality,$align); +} +/*-- END DIRECTW --*/ + + +/*-- HTML-CSS --*/ +function saveInlineProperties() { + $saved = array(); + $saved[ 'family' ] = $this->FontFamily; + $saved[ 'style' ] = $this->FontStyle; + $saved[ 'sizePt' ] = $this->FontSizePt; + $saved[ 'size' ] = $this->FontSize; + $saved[ 'HREF' ] = $this->HREF; + $saved[ 'underline' ] = $this->U; + $saved[ 'smCaps' ] = $this->S; + $saved[ 'strike' ] = $this->strike; + $saved[ 'textshadow' ] = $this->textshadow; + $saved[ 'SUP' ] = $this->SUP; + $saved[ 'SUB' ] = $this->SUB; + $saved[ 'linewidth' ] = $this->LineWidth; + $saved[ 'drawcolor' ] = $this->DrawColor; + $saved[ 'textparam' ] = $this->textparam; + $saved[ 'toupper' ] = $this->toupper; + $saved[ 'tolower' ] = $this->tolower; + $saved[ 'capitalize' ] = $this->capitalize; + $saved[ 'fontkerning' ] = $this->kerning; + $saved[ 'lSpacingCSS' ] = $this->lSpacingCSS; + $saved[ 'wSpacingCSS' ] = $this->wSpacingCSS; + $saved[ 'I' ] = $this->I; + $saved[ 'B' ] = $this->B; + $saved[ 'colorarray' ] = $this->colorarray; + $saved[ 'bgcolorarray' ] = $this->spanbgcolorarray; + $saved[ 'border' ] = $this->spanborddet; + $saved[ 'color' ] = $this->TextColor; + $saved[ 'bgcolor' ] = $this->FillColor; + $saved[ 'lang' ] = $this->currentLang; + $saved[ 'display_off' ] = $this->inlineDisplayOff; + + return $saved; +} + +function restoreInlineProperties( &$saved) { + $FontFamily = $saved[ 'family' ]; + $this->FontStyle = $saved[ 'style' ]; + $this->FontSizePt = $saved[ 'sizePt' ]; + $this->FontSize = $saved[ 'size' ]; + + $this->currentLang = $saved['lang']; + if ($this->useLang && !$this->usingCoreFont) { + if ($this->currentLang != $this->default_lang && ((strlen($this->currentLang) == 5 && $this->currentLang != 'UTF-8') || strlen($this->currentLang ) == 2)) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($this->currentLang, $this->useAdobeCJK); + if ($mpdf_pdf_unifonts) { $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); } + else { $this->RestrictUnicodeFonts($this->default_available_fonts ); } + } + else { + $this->RestrictUnicodeFonts($this->default_available_fonts ); + } + } + + $this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well + + $this->HREF = $saved[ 'HREF' ]; + $this->U = $saved[ 'underline' ]; + $this->S = $saved[ 'smCaps' ]; + $this->strike = $saved[ 'strike' ]; + $this->textshadow = $saved[ 'textshadow' ]; + $this->SUP = $saved[ 'SUP' ]; + $this->SUB = $saved[ 'SUB' ]; + $this->LineWidth = $saved[ 'linewidth' ]; + $this->DrawColor = $saved[ 'drawcolor' ]; + $this->textparam = $saved[ 'textparam' ]; + $this->inlineDisplayOff = $saved['display_off']; + + $this->toupper = $saved[ 'toupper' ]; + $this->tolower = $saved[ 'tolower' ]; + $this->capitalize = $saved[ 'capitalize' ]; + $this->kerning = $saved[ 'fontkerning' ]; + $this->lSpacingCSS = $saved[ 'lSpacingCSS' ]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + else { $this->fixedlSpacing = false; } + $this->wSpacingCSS = $saved[ 'wSpacingCSS' ]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + else { $this->minwSpacing = 0; } + + $this->SetFont($FontFamily, $saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ],false); + + $this->currentfontstyle = $saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->currentfontsize = $saved[ 'sizePt' ]; + $this->SetStylesArray(array('S'=>$this->S, 'U'=>$this->U, 'B'=>$saved[ 'B' ], 'I'=>$saved[ 'I' ])); + + $this->TextColor = $saved[ 'color' ]; + $this->FillColor = $saved[ 'bgcolor' ]; + $this->colorarray = $saved[ 'colorarray' ]; + $cor = $saved[ 'colorarray' ]; + if ($cor) $this->SetTColor($cor); + $this->spanbgcolorarray = $saved[ 'bgcolorarray' ]; + $cor = $saved[ 'bgcolorarray' ]; + if ($cor) $this->SetFColor($cor); + $this->spanborddet = $saved[ 'border' ]; +} + + + +// Used when ColActive for tables - updated to return first block with background fill OR borders +function GetFirstBlockFill() { + // Returns the first blocklevel that uses a bgcolor fill + $startfill = 0; + for ($i=1;$i<=$this->blklvl;$i++) { + if ($this->blk[$i]['bgcolor'] || $this->blk[$i]['border_left']['w'] || $this->blk[$i]['border_right']['w'] || $this->blk[$i]['border_top']['w'] || $this->blk[$i]['border_bottom']['w'] ) { + $startfill = $i; + break; + } + } + return $startfill; +} + +function SetBlockFill($blvl) { + if ($this->blk[$blvl]['bgcolor']) { + $this->SetFColor($this->blk[$blvl]['bgcolorarray']); + return 1; + } + else { + $this->SetFColor($this->ConvertColor(255)); + return 0; + } +} + + +//-------------------------FLOWING BLOCK------------------------------------// +//The following functions were originally written by Damon Kohler // +//--------------------------------------------------------------------------// + +function saveFont() { + $saved = array(); + $saved[ 'family' ] = $this->FontFamily; + $saved[ 'style' ] = $this->FontStyle; + $saved[ 'sizePt' ] = $this->FontSizePt; + $saved[ 'size' ] = $this->FontSize; + $saved[ 'curr' ] = &$this->CurrentFont; + $saved[ 'color' ] = $this->TextColor; + $saved[ 'spanbgcolor' ] = $this->spanbgcolor; + $saved[ 'spanbgcolorarray' ] = $this->spanbgcolorarray; + $saved[ 'bord' ] = $this->spanborder; + $saved[ 'border' ] = $this->spanborddet; + $saved[ 'HREF' ] = $this->HREF; + $saved[ 'underline' ] = $this->U; + $saved[ 'smCaps' ] = $this->S; + $saved[ 'strike' ] = $this->strike; + $saved[ 'textshadow' ] = $this->textshadow; + $saved[ 'SUP' ] = $this->SUP; + $saved[ 'SUB' ] = $this->SUB; + $saved[ 'linewidth' ] = $this->LineWidth; + $saved[ 'drawcolor' ] = $this->DrawColor; + $saved[ 'textparam' ] = $this->textparam; + $saved[ 'ReqFontStyle' ] = $this->ReqFontStyle; + $saved[ 'fontkerning' ] = $this->kerning; + $saved[ 'fixedlSpacing' ] = $this->fixedlSpacing; + $saved[ 'minwSpacing' ] = $this->minwSpacing; + return $saved; +} + +function restoreFont( &$saved, $write=true) { + if (!isset($saved) || empty($saved)) return; + + $this->FontFamily = $saved[ 'family' ]; + $this->FontStyle = $saved[ 'style' ]; + $this->FontSizePt = $saved[ 'sizePt' ]; + $this->FontSize = $saved[ 'size' ]; + $this->CurrentFont = &$saved[ 'curr' ]; + $this->TextColor = $saved[ 'color' ]; + $this->spanbgcolor = $saved[ 'spanbgcolor' ]; + $this->spanbgcolorarray = $saved[ 'spanbgcolorarray' ]; + $this->spanborder = $saved[ 'bord' ]; + $this->spanborddet = $saved[ 'border' ]; + $this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well + $this->HREF = $saved[ 'HREF' ]; + $this->U = $saved[ 'underline' ]; + $this->S = $saved[ 'smCaps' ]; + $this->kerning = $saved[ 'fontkerning' ]; + $this->fixedlSpacing = $saved[ 'fixedlSpacing' ]; + $this->minwSpacing = $saved[ 'minwSpacing' ]; + $this->strike = $saved[ 'strike' ]; + $this->textshadow = $saved[ 'textshadow' ]; + $this->SUP = $saved[ 'SUP' ]; + $this->SUB = $saved[ 'SUB' ]; + $this->LineWidth = $saved[ 'linewidth' ]; + $this->DrawColor = $saved[ 'drawcolor' ]; + $this->textparam = $saved[ 'textparam' ]; + if ($write) { + $this->SetFont($saved[ 'family' ],$saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ],true,true); // force output + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + else + $this->SetFont($saved[ 'family' ],$saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ]); + $this->ReqFontStyle = $saved[ 'ReqFontStyle' ]; +} + +function newFlowingBlock( $w, $h, $a = '', $is_table = false, $is_list = false, $blockstate = 0, $newblock=true, $blockdir='ltr') +{ + if (!$a) { + if ($blockdir=='rtl') { $a = 'R'; } + else { $a = 'L'; } + } + $this->flowingBlockAttr[ 'width' ] = ($w * _MPDFK); + // line height in user units + $this->flowingBlockAttr[ 'is_table' ] = $is_table; + $this->flowingBlockAttr[ 'is_list' ] = $is_list; + $this->flowingBlockAttr[ 'height' ] = $h; + $this->flowingBlockAttr[ 'lineCount' ] = 0; + $this->flowingBlockAttr[ 'align' ] = $a; + $this->flowingBlockAttr[ 'font' ] = array(); + $this->flowingBlockAttr[ 'content' ] = array(); + $this->flowingBlockAttr[ 'contentB' ] = array(); + $this->flowingBlockAttr[ 'contentWidth' ] = 0; + $this->flowingBlockAttr[ 'blockstate' ] = $blockstate; + + $this->flowingBlockAttr[ 'newblock' ] = $newblock; + $this->flowingBlockAttr[ 'valign' ] = 'M'; + $this->flowingBlockAttr['blockdir'] = $blockdir; + +} + +function finishFlowingBlock($endofblock=false, $next='') { + $currentx = $this->x; + //prints out the last chunk + $is_table = $this->flowingBlockAttr[ 'is_table' ]; + $is_list = $this->flowingBlockAttr[ 'is_list' ]; + $maxWidth =& $this->flowingBlockAttr[ 'width' ]; + $lineHeight =& $this->flowingBlockAttr[ 'height' ]; + $align =& $this->flowingBlockAttr[ 'align' ]; + $content =& $this->flowingBlockAttr[ 'content' ]; + $contentB =& $this->flowingBlockAttr[ 'contentB' ]; + $font =& $this->flowingBlockAttr[ 'font' ]; + $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; + $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; + $valign =& $this->flowingBlockAttr[ 'valign' ]; + $blockstate = $this->flowingBlockAttr[ 'blockstate' ]; + + $newblock = $this->flowingBlockAttr[ 'newblock' ]; + $blockdir = $this->flowingBlockAttr['blockdir']; + + + // *********** BLOCK BACKGROUND COLOR *****************// + if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { + $fill = 0; + } + else { + $this->SetFColor($this->ConvertColor(255)); + $fill = 0; + } + + $hanger = ''; // mPDF 5.6.40 + + // Always right trim! + // Right trim content and adjust width if need to justify (later) + if (isset($content[count($content)-1]) && preg_match('/[ ]+$/',$content[count($content)-1], $m)) { + $strip = strlen($m[0]); + $content[count($content)-1] = substr($content[count($content)-1],0,(strlen($content[count($content)-1])-$strip)); + $this->restoreFont( $font[ count($content)-1 ],false ); + $contentWidth -= $this->GetStringWidth($m[0]) * _MPDFK; + } + + // the amount of space taken up so far in user units + $usedWidth = 0; + + // COLS + $oldcolumn = $this->CurrCol; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + // Print out each chunk + +/*-- TABLES --*/ + if ($is_table) { + $ipaddingL = 0; + $ipaddingR = 0; + $paddingL = 0; + $paddingR = 0; + } + else { +/*-- END TABLES --*/ + $ipaddingL = $this->blk[$this->blklvl]['padding_left']; + $ipaddingR = $this->blk[$this->blklvl]['padding_right']; + $paddingL = ($ipaddingL * _MPDFK); + $paddingR = ($ipaddingR * _MPDFK); + $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; + $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + // Set Current lineheight (correction factor) + $lhfixed = false; +/*-- LISTS --*/ + if ($is_list) { + if (preg_match('/([0-9.,]+)mm/',$this->list_lineheight[$this->listlvl][$this->listOcc],$am)) { + $lhfixed = true; + $def_fontsize = $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listOcc][$this->listnum]['size']; + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->list_lineheight[$this->listlvl][$this->listOcc]; + } + } + else +/*-- END LISTS --*/ +/*-- TABLES --*/ + if ($is_table) { + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight,$am)) { + $lhfixed = true; + $def_fontsize = $this->FontSize; // needs to be default font-size for block **** + $this->lineheight_correction = $lineHeight / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->table_lineheight; + } + } + else +/*-- END TABLES --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + if (preg_match('/([0-9.,]+)mm/',$this->blk[$this->blklvl]['line_height'],$am)) { + $lhfixed = true; + $def_fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; // needs to be default font-size for block **** + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->blk[$this->blklvl]['line_height']; + } + } + else { + $this->lineheight_correction = $this->normalLineheight; + } + + // correct lineheight to maximum fontsize + if ($lhfixed) { $maxlineHeight = $this->lineheight; } + else { $maxlineHeight = 0; } + $this->forceExactLineheight = true; + $maxfontsize = 0; + // While we're at it, check if contains cursive text + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } // *RTL* + foreach ( $content as $k => $chunk ) + { + $this->restoreFont( $font[ $k ],false ); + if (!isset($this->objectbuffer[$k])) { + // Soft Hyphens chr(173) + if (!$this->usingCoreFont) { + $content[$k] = $chunk = str_replace("\xc2\xad",'',$chunk ); + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $content[$k] = $chunk = str_replace(chr(173),'',$chunk ); + } + // Special case of sub/sup carried over on its own to last line + if (($this->SUB || $this->SUP) && count($content)==1) { $actfs = $this->FontSize*100/55; } // 55% is font change for sub/sup + else { $actfs = $this->FontSize; } + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && ($actfs > $def_fontsize || ($actfs > ($lineHeight * $this->lineheight_correction) && $is_list))) { + $this->forceExactLineheight = false; + } + $maxfontsize = max($maxfontsize,$actfs); + } + } + + if(isset($font[count($font)-1])) { + $lastfontreqstyle = $font[count($font)-1]['ReqFontStyle']; + $lastfontstyle = $font[count($font)-1]['style']; + } + else { + $lastfontreqstyle=null; + $lastfontstyle=null; + } + if ($blockdir == 'ltr' && strpos($lastfontreqstyle,"I") !== false && strpos($lastfontstyle,"I") === false) { // Artificial italic + $lastitalic = $this->FontSize*0.15*_MPDFK; + } + else { $lastitalic = 0; } + + +/*-- LISTS --*/ + if ($is_list && is_array($this->bulletarray) && count($this->bulletarray)) { + $actfs = $this->bulletarray['fontsize']; + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && $actfs > $def_fontsize) { $this->forceExactLineheight = false; } + $maxfontsize = max($maxfontsize,$actfs); + } +/*-- END LISTS --*/ + + // when every text item checked i.e. $maxfontsize is set properly + + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + + foreach ( $content as $k => $chunk ) + { + if (isset($this->objectbuffer[$k])) { + $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; + $va = $this->objectbuffer[$k]['vertical-align']; // = $objattr['vertical-align'] = set as M,T,B,S + if ($lhfixed && $oh > $def_fontsize) { $this->forceExactLineheight = false; } + + if ($va == 'BS') { // (BASELINE default) + $af = max($af, ($oh - ($maxfontsize * (0.5 + $this->baselineC)))); + } + else if ($va == 'M') { + $af = max($af, ($oh - $maxfontsize)/2); + $bf = max($bf, ($oh - $maxfontsize)/2); + } + else if ($va == 'TT') { + $bf = max($bf, ($oh - $maxfontsize)); + } + else if ($va == 'TB') { + $af = max($af, ($oh - $maxfontsize)); + } + else if ($va == 'T') { + $mta = max($mta, $oh); + } + else if ($va == 'B') { + $mba = max($mba, $oh); + } + } + } + if ((!$lhfixed || !$this->forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + + $lineHeight = $maxlineHeight; + // If NOT images, and maxfontsize NOT > lineHeight - this value determines text baseline positioning + if ($lhfixed && $af==0 && $bf==0 && $maxfontsize<=($def_fontsize * $this->lineheight_correction * 0.8 )) { + $this->linemaxfontsize = $def_fontsize; + } + else { $this->linemaxfontsize = $maxfontsize; } + + // Get PAGEBREAK TO TEST for height including the bottom border/padding + $check_h = max($this->divheight,$lineHeight); + + // This fixes a proven bug... + if ($endofblock && $newblock && $blockstate==0 && !$content) { $check_h = 0; } + // but ? needs to fix potentially more widespread... + // if (!$content) { $check_h = 0; } + + if ($this->blklvl > 0 && !$is_table) { + if ($endofblock && $blockstate > 1) { + if ($this->blk[$this->blklvl]['page_break_after_avoid']) { $check_h += $lineHeight; } + $check_h += ($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); + } + // mPDF 5.4.03 + if (($newblock && ($blockstate==1 || $blockstate==3) && $lineCount == 0) || ($endofblock && $blockstate ==3 && $lineCount == 0)) { + $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); + } + } + + // Force PAGE break if column height cannot take check-height + if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { + $this->SetCol($this->NbCol-1); + } + + // mPDF 5.4.04 + // Avoid just border/background-color moved on to next page + if ($endofblock && $blockstate > 1 && !$content) { $buff = $this->margBuffer; } + else { $buff = 0; } + + + // PAGEBREAK + // mPDF 5.4.04 + if(!$is_table && ($this->y+$check_h) > ($this->PageBreakTrigger + $buff) and !$this->InFooter and $this->AcceptPageBreak()) { + $bak_x=$this->x;//Current X position + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + + $this->x=$bak_x; + // Added to correct for OddEven Margins + $currentx += $this->MarginCorrection; + $this->x += $this->MarginCorrection; + + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + if ($this->keep_block_together && !$is_table && $this->kt_p00 < $this->page && ($this->y+$check_h) > $this->kt_y00) { + $this->printdivbuffer(); + $this->keep_block_together = 0; + } + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $oldcolumn = $this->CurrCol; + } + + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } +/*-- END COLUMNS --*/ + + // TOP MARGIN + if ($newblock && ($blockstate==1 || $blockstate==3) && ($this->blk[$this->blklvl]['margin_top']) && $lineCount == 0 && !$is_table && !$is_list) { + $this->DivLn($this->blk[$this->blklvl]['margin_top'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + if ($newblock && ($blockstate==1 || $blockstate==3) && $lineCount == 0 && !$is_table && !$is_list) { + $this->blk[$this->blklvl]['y0'] = $this->y; + $this->blk[$this->blklvl]['startpage'] = $this->page; + if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } // mPDF 5.6.63 + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + // ADDED for Paragraph_indent + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align != 'C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $WidthCorrection = ($ti*_MPDFK); + } + + + // PADDING and BORDER spacing/fill + if (($newblock) && ($blockstate==1 || $blockstate==3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 0) && (!$is_table) && (!$is_list)) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'],-3,true,false,1); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + $this->x = $currentx; + } + + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + if ($content) { + + // In FinishFlowing Block no lines are justified as it is always last line + // but if CJKorphan has allowed content width to go over max width, use J charspacing to compress line + // JUSTIFICATION J - NOT! + $nb_carac = 0; + $nb_spaces = 0; + $jcharspacing = 0; + $jws = 0; + $inclCursive=false; + $dottab = false; // mPDF 5.6.19 + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + if ($this->usingCoreFont) { + $chunk = str_replace(chr(160),chr(32),$chunk ); + } + else { + $chunk = str_replace(chr(194).chr(160),chr(32),$chunk ); + } + $nb_carac += mb_strlen( $chunk, $this->mb_enc ); + $nb_spaces += mb_substr_count( $chunk,' ', $this->mb_enc ); + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $chunk)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $chunk)) { $inclCursive = true; } // *INDIC* + } + } + else if ($this->objectbuffer[$k]['type']=='dottab') { $dottab = $this->objectbuffer[$k]['outdent']; } // mPDF 5.6.19 + } + // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) + // If "orphans" in fact is just a final space - ignore this + // mPDF 5.6.40 + $lastchar = mb_substr($content[(count($content)-1)],mb_strlen($content[(count($content)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + if (preg_match("/[".$this->CJKoverflow."]/u", $lastchar)) { $CJKoverflow = true; } + else {$CJKoverflow = false; } + if ((((($contentWidth + $lastitalic) > $maxWidth) && ($content[count($content)-1] != ' ') ) || + (!$endofblock && $align=='J' && ($next=='image' || $next=='select' || $next=='input' || $next=='textarea' || ($next=='br' && $this->justifyB4br)))) && !($CJKoverflow && $this->allowCJKoverflow) ) { // mPDF 5.6.40 + // WORD SPACING + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$contentWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } +/*-- CJK-FONTS --*/ + // mPDF 5.6.40 + else if ($this->checkCJK && $align=='J' && $CJKoverflow && $this->allowCJKoverflow && $this->CJKforceend) { + // force-end overhang + $hanger = mb_substr($content[count($content)-1],mb_strlen($content[count($content)-1],$this->mb_enc)-1,1,$this->mb_enc ); + if (preg_match("/[".$this->CJKoverflow."]/u", $hanger)) { + $content[count($content)-1] = mb_substr($content[count($content)-1],0,mb_strlen($content[count($content)-1],$this->mb_enc)-1,$this->mb_enc ); + $this->restoreFont( $font[ count($content)-1 ],false ); + $contentWidth -= $this->GetStringWidth($hanger) * _MPDFK; + $nb_carac -= 1; + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$contentWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } + } +/*-- END CJK-FONTS --*/ + + // Check if will fit at word/char spacing of previous line - if so continue it + // but only allow a maximum of $this->jSmaxWordLast and $this->jSmaxCharLast + else if ($contentWidth < ($maxWidth - $lastitalic-$WidthCorrection - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK))) && !$this->fixedlSpacing) { + if ($this->ws > $this->jSmaxWordLast) { + $jws = $this->jSmaxWordLast; + } + if ($this->charspacing > $this->jSmaxCharLast) { + $jcharspacing = $this->jSmaxCharLast; + } + $check = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) - ( $jcharspacing * $nb_carac) - ( $jws * $nb_spaces); + if ($check <= 0) { + $jcharspacing = 0; + $jws = 0; + } + } + + $empty = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + + $empty -= ($jcharspacing * $nb_carac); + $empty -= ($jws * $nb_spaces); + + $empty /= _MPDFK; + + if (!$is_table) { + $this->maxPosR = max($this->maxPosR , ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'] - $empty)); + $this->maxPosL = min($this->maxPosL , ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $empty)); + } + + $arraysize = count($content); + + $margins = ($this->cMarginL+$this->cMarginR) + ($ipaddingL+$ipaddingR + $fpaddingR + $fpaddingR ); + + if (!$is_table) { $this->DivLn($lineHeight,$this->blklvl,false); } // false -> don't advance y + + // DIRECTIONALITY RTL + $all_rtl = false; + $contains_rtl = false; +/*-- RTL --*/ + if ($blockdir == 'rtl' || $this->biDirectional) { + $all_rtl = true; + foreach ( $content as $k => $chunk ) { + $reversed = $this->magic_reverse_dir($chunk, false, $blockdir); + if ($reversed > 0) { $contains_rtl = true; } + if ($reversed < 2) { $all_rtl = false; } + $content[$k] = $chunk; + } + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { + $content = array_reverse($content,false); + $contentB = array_reverse($contentB,false); + } + } +/*-- END RTL --*/ + + $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; + if ($dottab !== false && $blockdir=='rtl') { $this->x -= $dottab; } // mPDF 5.6.19 + else if ($align == 'R') { $this->x += $empty; } + else if ($align == 'J' && $blockdir == 'rtl') { $this->x += $empty; } + else if ($align == 'C') { $this->x += ($empty / 2); } + + // Paragraph INDENT + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align !='C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $this->x += $ti; + } + + + foreach ( $content as $k => $chunk ) + { + + // FOR IMAGES + if ((($blockdir == 'rtl') && ($contains_rtl )) || $all_rtl ) { $dirk = $arraysize-1 - $k; } else { $dirk = $k; } + + $va = 'M'; // default for text + if (isset($this->objectbuffer[$dirk]) && $this->objectbuffer[$dirk]) { + $xadj = $this->x - $this->objectbuffer[$dirk]['OUTER-X']; + $this->objectbuffer[$dirk]['OUTER-X'] += $xadj; + $this->objectbuffer[$dirk]['BORDER-X'] += $xadj; + $this->objectbuffer[$dirk]['INNER-X'] += $xadj; + $va = $this->objectbuffer[$dirk]['vertical-align']; + $yadj = $this->y - $this->objectbuffer[$dirk]['OUTER-Y']; + if ($va == 'BS') { + $yadj += $af + ($this->linemaxfontsize * (0.5 + $this->baselineC)) - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'M' || $va == '') { + $yadj += $af + ($this->linemaxfontsize /2) - ($this->objectbuffer[$dirk]['OUTER-HEIGHT']/2); + } + else if ($va == 'TB') { + $yadj += $af + $this->linemaxfontsize - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'TT') { + $yadj += $af; + } + else if ($va == 'B') { + $yadj += $af + $this->linemaxfontsize + $bf - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'T') { + $yadj += 0; + } + $this->objectbuffer[$dirk]['OUTER-Y'] += $yadj; + $this->objectbuffer[$dirk]['BORDER-Y'] += $yadj; + $this->objectbuffer[$dirk]['INNER-Y'] += $yadj; + } + + + // DIRECTIONALITY RTL + if ((($blockdir == 'rtl') && ($contains_rtl )) || $all_rtl ) { $this->restoreFont( $font[ $arraysize-1 - $k ] ); } + else { $this->restoreFont( $font[ $k ] ); } + + // mPDF 5.6.13 Decimal alignment - set in _tableWrite + if ($is_table && substr($align,0,1)=='D' && $k==0 ) { + $dp = $this->decimal_align[substr($align,0,2)]; + $s = preg_split('/'.preg_quote($dp,'/').'/', $content[0], 2); // ? needs to be /u if not core + $s0 = $this->GetStringWidth($s[0], false); + $this->x += ($this->decimal_offset - $s0); + } + + $this->SetSpacing(($this->fixedlSpacing*_MPDFK)+$jcharspacing,($this->fixedlSpacing+$this->minwSpacing)*_MPDFK+$jws); + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + // mPDF 5.6.26 + $save_vis = $this->visibility; + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { + $this->SetVisibility($this->textparam['visibility']); + } + + // *********** SPAN BACKGROUND COLOR ***************** // + if (isset($this->spanbgcolor) && $this->spanbgcolor) { + $cor = $this->spanbgcolorarray; + $this->SetFColor($cor); + $save_fill = $fill; $spanfill = 1; $fill = 1; + } + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false && isset($this->spanborddet['L'])) $this->x += $this->spanborddet['L']['w']; + if (strpos($contentB[$k],'L')===false) $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; + if (strpos($contentB[$k],'R')===false) $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; + } + // WORD SPACING + $stringWidth = $this->GetStringWidth($chunk ) + ( $this->charspacing * mb_strlen($chunk,$this->mb_enc ) / _MPDFK ) + + ( $this->ws * mb_substr_count($chunk,' ',$this->mb_enc ) / _MPDFK ); + if (isset($this->objectbuffer[$dirk])) { + if ($this->objectbuffer[$dirk]['type']=='dottab') { + $this->objectbuffer[$dirk]['OUTER-WIDTH'] +=$empty; + $this->objectbuffer[$dirk]['OUTER-WIDTH'] +=$this->objectbuffer[$dirk]['outdent']; // mPDF 5.6.19 + } + $stringWidth = $this->objectbuffer[$dirk]['OUTER-WIDTH']; + } + + if ($stringWidth==0) { $stringWidth = 0.000001; } + if ($k == $arraysize-1) { + // mPDF 5.6.40 + if ($this->checkCJK && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { + // force-end overhang + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + $this->Cell( $this->GetStringWidth($hanger), $lineHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + else { + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + } + else $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0,0,'M', $fill, $af, $bf, true );//first or middle part + + + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'R')!==false && $k != $arraysize-1) $this->x += $this->spanborddet['R']['w']; + } + // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // + if (isset($spanfill) && $spanfill) { + $fill = $save_fill; $spanfill = 0; + if ($fill) { $this->SetFColor($bcor); } + } + // mPDF 5.6.26 + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { + $this->SetVisibility($save_vis); + } + + } + + $this->printobjectbuffer($is_table, $blockdir); + + $this->objectbuffer = array(); + + $this->ResetSpacing(); + +/*-- LISTS --*/ + // LIST BULLETS/NUMBERS + if ($is_list && is_array($this->bulletarray) && ($lineCount == 0) ) { + + $savedFont = $this->saveFont(); + + $bull = $this->bulletarray; + if (isset($bull['level']) && isset($bull['occur']) && isset($this->InlineProperties['LIST'][$bull['level']][$bull['occur']])) { + $this->restoreInlineProperties($this->InlineProperties['LIST'][$bull['level']][$bull['occur']]); + } + if (isset($bull['level']) && isset($bull['occur']) && isset($bull['num']) && isset($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) && $this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) { $this->restoreInlineProperties($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = true; + $this->SetFont('czapfdingbats','',$this->FontSizePt/2.5); + } + else { $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); } // force output + //Output bullet + $this->x = $currentx; + if (isset($bull['x'])) { $this->x += $bull['x']; } + $this->y -= $lineHeight; + if (isset($bull['col']) && $bull['col']) { $this->SetTColor($bull['col']); } // mPDF 5.6.67 + + if (isset($bull['txt'])) { $this->Cell($bull['w'], $lineHeight,$bull['txt'],'','',$bull['align'],0,'',0,-$this->cMarginL, -$this->cMarginR ); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = false; + } + $this->x = $currentx; // Reset + $this->y += $lineHeight; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + $this->restoreFont( $savedFont ); + // $font = array( $savedFont ); + + $this->bulletarray = array(); // prevents repeat of bullet/number if
  • ....
    .....
  • + } +/*-- END LISTS --*/ + + + } // END IF CONTENT + +/*-- CSS-IMAGE-FLOAT --*/ + // Update values if set to skipline + if ($this->floatmargins) { $this->_advanceFloatMargins(); } + + + if ($endofblock && $blockstate>1) { + // If float exists at this level + if (isset($this->floatmargins['R']['y1'])) { $fry1 = $this->floatmargins['R']['y1']; } + else { $fry1 = 0; } + if (isset($this->floatmargins['L']['y1'])) { $fly1 = $this->floatmargins['L']['y1']; } + else { $fly1 = 0; } + if ($this->y < $fry1 || $this->y < $fly1) { + $drop = max($fry1,$fly1) - $this->y; + $this->DivLn($drop); + $this->x = $currentx; + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + + // PADDING and BORDER spacing/fill + if ($endofblock && ($blockstate > 1) && ($this->blk[$this->blklvl]['padding_bottom'] || $this->blk[$this->blklvl]['border_bottom'] || $this->blk[$this->blklvl]['css_set_height']) && (!$is_table) && (!$is_list)) { + // If CSS height set, extend bottom - if on same page as block started, and CSS HEIGHT > actual height, + // and does not force pagebreak + $extra = 0; + if ($this->blk[$this->blklvl]['css_set_height'] && $this->blk[$this->blklvl]['startpage']==$this->page) { + // predicted height + $h1 = ($this->y-$this->blk[$this->blklvl]['y0']) + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; + if ($h1 < ($this->blk[$this->blklvl]['css_set_height']+$this->blk[$this->blklvl]['padding_bottom']+$this->blk[$this->blklvl]['padding_top'])) { $extra = ($this->blk[$this->blklvl]['css_set_height']+$this->blk[$this->blklvl]['padding_bottom']+$this->blk[$this->blklvl]['padding_top']) - $h1; } + if($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra > $this->PageBreakTrigger) { + $extra = $this->PageBreakTrigger - ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); + } + } + + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra,-3,true,false,2); + $this->x = $currentx; + + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + } + + // SET Bottom y1 of block (used for painting borders) + if (($endofblock) && ($blockstate > 1) && (!$is_table) && (!$is_list)) { + $this->blk[$this->blklvl]['y1'] = $this->y; + } + + // BOTTOM MARGIN + if (($endofblock) && ($blockstate > 1) && ($this->blk[$this->blklvl]['margin_bottom']) && (!$is_table) && (!$is_list)) { + if($this->y+$this->blk[$this->blklvl]['margin_bottom'] < $this->PageBreakTrigger and !$this->InFooter) { + $this->DivLn($this->blk[$this->blklvl]['margin_bottom'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + } + + // Reset lineheight + $lineHeight = $this->divheight; +} + + + + + +function printobjectbuffer($is_table=false, $blockdir=false) { + if (!$blockdir) { $blockdir = $this->directionality; } + if ($is_table && $this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + $save_y = $this->y; + $save_x = $this->x; + $save_currentfontfamily = $this->FontFamily; + $save_currentfontsize = $this->FontSizePt; + $save_currentfontstyle = $this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + if ($blockdir == 'rtl') { $rtlalign = 'R'; } else { $rtlalign = 'L'; } + foreach ($this->objectbuffer AS $ib => $objattr) { + if ($objattr['type'] == 'bookmark' || $objattr['type'] == 'indexentry' || $objattr['type'] == 'toc') { + $x = $objattr['OUTER-X']; + $y = $objattr['OUTER-Y']; + $this->y = $y - $this->FontSize/2; + $this->x = $x; + if ($objattr['type'] == 'bookmark' ) { $this->Bookmark($objattr['CONTENT'],$objattr['bklevel'] ,$y - $this->FontSize); } // *BOOKMARKS* + if ($objattr['type'] == 'indexentry') { $this->IndexEntry($objattr['CONTENT']); } // *INDEX* + if ($objattr['type'] == 'toc') { $this->TOC_Entry($objattr['CONTENT'], $objattr['toclevel'], $objattr['toc_id']); } // *TOC* + } +/*-- ANNOTATIONS --*/ + else if ($objattr['type'] == 'annot') { + if ($objattr['POS-X']) { $x = $objattr['POS-X']; } + else if ($this->annotMargin<>0) { $x = -$objattr['OUTER-X']; } + else { $x = $objattr['OUTER-X']; } + if ($objattr['POS-Y']) { $y = $objattr['POS-Y']; } + else { $y = $objattr['OUTER-Y'] - $this->FontSize/2; } + // Create a dummy entry in the _out/columnBuffer with position sensitive data, + // linking $y-1 in the Columnbuffer with entry in $this->columnAnnots + // and when columns are split in length will not break annotation from current line + $this->y = $y-1; + $this->x = $x-1; + $this->Line($x-1,$y-1,$x-1,$y-1); + $this->Annotation($objattr['CONTENT'], $x , $y , $objattr['ICON'], $objattr['AUTHOR'], $objattr['SUBJECT'], $objattr['OPACITY'], $objattr['COLOR'], $objattr['POPUP'], $objattr['FILE']); + } +/*-- END ANNOTATIONS --*/ + else { + $y = $objattr['OUTER-Y']; + $x = $objattr['OUTER-X']; + $w = $objattr['OUTER-WIDTH']; + $h = $objattr['OUTER-HEIGHT']; + if (isset($objattr['text'])) { $texto = $objattr['text']; } + $this->y = $y; + $this->x = $x; + if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'],'',$objattr['fontsize'] ); } + } + + // HR + if ($objattr['type'] == 'hr') { + $this->SetDColor($objattr['color']); + switch($objattr['align']) { + case 'C': + $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; + $empty /= 2; + $x += $empty; + break; + case 'R': + $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; + $x += $empty; + break; + } + $oldlinewidth = $this->LineWidth; + $this->SetLineWidth($objattr['linewidth']/$k ); + $this->y += ($objattr['linewidth']/2) + $objattr['margin_top']/$k; + $this->Line($x,$this->y,$x+$objattr['INNER-WIDTH'],$this->y); + $this->SetLineWidth($oldlinewidth); + $this->SetDColor($this->ConvertColor(0)); + } + // IMAGE + if ($objattr['type'] == 'image') { + // mPDF 5.6.01 - LAYERS + if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->currentlayer==0) { + $this->BeginLayer($objattr['z-index']); + } + if(isset($objattr['visibility']) && $objattr['visibility']!='visible' && $objattr['visibility']) { + $this->SetVisibility($objattr['visibility']); + } + if (isset($objattr['opacity'])) { $this->SetAlpha($objattr['opacity']); } + $rotate = 0; + $obiw = $objattr['INNER-WIDTH']; + $obih = $objattr['INNER-HEIGHT']; + $sx = $objattr['INNER-WIDTH']*_MPDFK / $objattr['orig_w']; + $sy = abs($objattr['INNER-HEIGHT'])*_MPDFK / abs($objattr['orig_h']); + $sx = ($objattr['INNER-WIDTH']*_MPDFK / $objattr['orig_w']); + $sy = ($objattr['INNER-HEIGHT']*_MPDFK / $objattr['orig_h']); + + if (isset($objattr['ROTATE'])) { $rotate = $objattr['ROTATE']; } + if ($rotate==90) { + // Clockwise + $obiw = $objattr['INNER-HEIGHT']; + $obih = $objattr['INNER-WIDTH']; + $tr = $this->transformTranslate(0, -$objattr['INNER-WIDTH'], true) ; + $tr .= ' '. $this->transformRotate(90, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-WIDTH'] ),true) ; + $sx = $obiw*_MPDFK / $objattr['orig_h']; + $sy = $obih*_MPDFK / $objattr['orig_w']; + } + else if ($rotate==-90 || $rotate==270) { + // AntiClockwise + $obiw = $objattr['INNER-HEIGHT']; + $obih = $objattr['INNER-WIDTH']; + $tr = $this->transformTranslate($objattr['INNER-WIDTH'], ($objattr['INNER-HEIGHT']-$objattr['INNER-WIDTH']), true) ; + $tr .= ' '. $this->transformRotate(-90, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-WIDTH'] ),true) ; + $sx = $obiw*_MPDFK / $objattr['orig_h']; + $sy = $obih*_MPDFK / $objattr['orig_w']; + } + else if ($rotate==180) { + // Mirror + $tr = $this->transformTranslate($objattr['INNER-WIDTH'], -$objattr['INNER-HEIGHT'], true) ; + $tr .= ' '. $this->transformRotate(180, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-HEIGHT'] ),true) ; + } + else { $tr = ''; } + $tr = trim($tr); + if ($tr) { $tr .= ' '; } + $gradmask = ''; + + +/*-- BACKGROUNDS --*/ + if (isset($objattr['GRADIENT-MASK'])) { + $g = $this->grad->parseMozGradient( $objattr['GRADIENT-MASK'] ); + if ($g) { + $dummy = $this->grad->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true, true); + $gradmask = '/TGS'.count($this->gradients).' gs '; + // $this->_out("q ".$tr.$this->grad->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true)." Q"); + } + } +/*-- END BACKGROUNDS --*/ +/*-- IMAGES-WMF --*/ + if (isset($objattr['itype']) && $objattr['itype']=='wmf') { + $outstring = sprintf('q '.$tr.'%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X']*_MPDFK-$sx*$objattr['wmf_x'], (($this->h-$objattr['INNER-Y'])*_MPDFK)+$sy*$objattr['wmf_y'], $objattr['ID']); + } + else +/*-- END IMAGES-WMF --*/ + if (isset($objattr['itype']) && $objattr['itype']=='svg') { + $outstring = sprintf('q '.$tr.'%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X']*_MPDFK-$sx*$objattr['wmf_x'], (($this->h-$objattr['INNER-Y'])*_MPDFK)+$sy*$objattr['wmf_y'], $objattr['ID']); + } + else { + $outstring = sprintf("q ".$tr."%.3F 0 0 %.3F %.3F %.3F cm ".$gradmask."/I%d Do Q",$obiw*_MPDFK, $obih*_MPDFK, $objattr['INNER-X'] *_MPDFK, ($this->h-($objattr['INNER-Y'] +$obih ))*_MPDFK,$objattr['ID'] ); + } + $this->_out($outstring); + // LINK + if (isset($objattr['link'])) $this->Link($objattr['INNER-X'],$objattr['INNER-Y'],$objattr['INNER-WIDTH'],$objattr['INNER-HEIGHT'],$objattr['link']); + if (isset($objattr['opacity'])) { $this->SetAlpha(1); } + if ((isset($objattr['border_top']) && $objattr['border_top']>0) || (isset($objattr['border_left']) && $objattr['border_left']>0) || (isset($objattr['border_right']) && $objattr['border_right']>0) || (isset($objattr['border_bottom']) && $objattr['border_bottom']>0)) { $this->PaintImgBorder($objattr,$is_table); } + if(isset($objattr['visibility']) && $objattr['visibility']!='visible' && $objattr['visibility']) { + $this->SetVisibility('visible'); + } + // mPDF 5.6.01 - LAYERS + if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->currentlayer==0) { + $this->EndLayer(); + } + + } + +/*-- BARCODES --*/ + // BARCODE + if ($objattr['type'] == 'barcode') { + $bgcol = $this->ConvertColor(255); + if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { + $bgcol = $objattr['bgcolor']; + } + $col = $this->ConvertColor(0); + if (isset($objattr['color']) && $objattr['color']) { + $col = $objattr['color']; + } + $this->SetFColor($bgcol); + $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); + $this->SetFColor($this->ConvertColor(255)); + if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr,$is_table); } + if ($objattr['btype'] == 'EAN13' || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN' || $objattr['btype'] == 'UPCA' || $objattr['btype'] == 'UPCE' || $objattr['btype'] == 'EAN8') { + $this->WriteBarcode($objattr['code'], $objattr['showtext'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], 0, 0, 0, 0, 0, $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['bsupp'], $objattr['bsupp_code'], $k); + } + // QR-code + else if ($objattr['btype']=='QR') { + if (!class_exists('QRcode', false)) { + include(_MPDF_PATH.'qrcode/qrcode.class.php'); + } + $this->qrcode = new QRcode($objattr['code'], $objattr['errorlevel']); + $this->qrcode->displayFPDF($this, $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize']*25, array(255,255,255), array(0,0,0)); + } + else { + $this->WriteBarcode2($objattr['code'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['pr_ratio'], $k); + } + } +/*-- END BARCODES --*/ + + // TEXT CIRCLE + if ($objattr['type'] == 'textcircle') { + $bgcol = ''; // mPDF 5.5.14 + if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { + $bgcol = $objattr['bgcolor']; + } + $col = $this->ConvertColor(0); + if (isset($objattr['color']) && $objattr['color']) { + $col = $objattr['color']; + } + $this->SetTColor($col); + $this->SetFColor($bgcol); + if ($bgcol) $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); // mPDF 5.5.14 + $this->SetFColor($this->ConvertColor(255)); + if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr,$is_table); } + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $save_lmfs = $this->linemaxfontsize; + $this->linemaxfontsize = 0; + if (isset($objattr['top-text'])) { + $this->directw->CircularText($objattr['INNER-X']+$objattr['INNER-WIDTH']/2, $objattr['INNER-Y']+$objattr['INNER-HEIGHT']/2, $objattr['r']/$k, $objattr['top-text'], 'top', $objattr['fontfamily'], $objattr['fontsize']/$k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], $objattr['divider']); // mPDF 5.5.23 + } + if (isset($objattr['bottom-text'])) { + $this->directw->CircularText($objattr['INNER-X']+$objattr['INNER-WIDTH']/2, $objattr['INNER-Y']+$objattr['INNER-HEIGHT']/2, $objattr['r']/$k, $objattr['bottom-text'], 'bottom', $objattr['fontfamily'], $objattr['fontsize']/$k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], $objattr['divider']); // mPDF 5.5.23 + } + $this->linemaxfontsize = $save_lmfs; + } + + $this->ResetSpacing(); + + // DOT-TAB + if ($objattr['type'] == 'dottab') { + // mPDF 5.6.19 + if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'],'',$objattr['fontsize'] ); } + $sp = $this->GetStringWidth(' '); + $nb=floor(($w-2*$sp)/$this->GetStringWidth('.')); + if ($nb>0) { $dots=' '.str_repeat('.',$nb).' '; } + else { $dots=' '; } + $col = $this->ConvertColor(0); + if (isset($objattr['colorarray']) && ($objattr['colorarray'])) { // mPDF 5.6.19 + $col = $objattr['colorarray']; + } + $this->SetTColor($col); + $save_dh = $this->divheight; // mPDF 5.6.19 + $save_sbd = $this->spanborddet; + $save_u = $this->U; + $save_s = $this->strike; + $this->spanborddet = ''; + $this->divheight = 0; // mPDF 5.6.19 + $this->U = false; + $this->strike = false; + $this->Cell($w,$h,$dots,0,0,'C'); + $this->spanborddet = $save_sbd; + $this->U = $save_u; + $this->strike = $save_s; + $this->divheight = $save_dh; // mPDF 5.6.19 + // mPDF 5.0 + $this->SetTColor($this->ConvertColor(0)); + } + +/*-- FORMS --*/ + // TEXT/PASSWORD INPUT + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD')) { + $this->form->print_ob_text($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // TEXTAREA + if ($objattr['type'] == 'textarea') { + $this->form->print_ob_textarea($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // SELECT + if ($objattr['type'] == 'select') { + $this->form->print_ob_select($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + + // INPUT/BUTTON as IMAGE + if ($objattr['type'] == 'input' && $objattr['subtype'] == 'IMAGE') { + $this->form->print_ob_imageinput($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // BUTTON + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'SUBMIT' || $objattr['subtype'] == 'RESET' || $objattr['subtype'] == 'BUTTON')) { + $this->form->print_ob_button($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // CHECKBOX + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'CHECKBOX')) { + $this->form->print_ob_checkbox($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y); + } + // RADIO + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'RADIO')) { + $this->form->print_ob_radio($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y); + } +/*-- END FORMS --*/ + } + $this->SetFont($save_currentfontfamily,$save_currentfontstyle,$save_currentfontsize); + $this->y = $save_y; + $this->x = $save_x; + unset($content); +} + + +function WriteFlowingBlock( $s) +{ + $currentx = $this->x; + $is_table = $this->flowingBlockAttr[ 'is_table' ]; + $is_list = $this->flowingBlockAttr[ 'is_list' ]; + // width of all the content so far in points + $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; + // cell width in points + $maxWidth =& $this->flowingBlockAttr[ 'width' ]; + $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; + // line height in user units + $lineHeight =& $this->flowingBlockAttr[ 'height' ]; + $align =& $this->flowingBlockAttr[ 'align' ]; + $content =& $this->flowingBlockAttr[ 'content' ]; + $contentB =& $this->flowingBlockAttr[ 'contentB' ]; + $font =& $this->flowingBlockAttr[ 'font' ]; + $valign =& $this->flowingBlockAttr[ 'valign' ]; + $blockstate = $this->flowingBlockAttr[ 'blockstate' ]; + + $newblock = $this->flowingBlockAttr[ 'newblock' ]; + $blockdir = $this->flowingBlockAttr['blockdir']; + // *********** BLOCK BACKGROUND COLOR ***************** // + if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { + $fill = 0; + } + else { + $this->SetFColor($this->ConvertColor(255)); + $fill = 0; + } + $font[] = $this->saveFont(); + $content[] = ''; + $contentB[] = ''; + $currContent =& $content[ count( $content ) - 1 ]; + // where the line should be cutoff if it is to be justified + $cutoffWidth = $contentWidth; + + $CJKoverflow = false; + $hanger = ''; // mPDF 5.6.40 + + // COLS + $oldcolumn = $this->CurrCol; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + +/*-- TABLES --*/ + if ($is_table) { + $ipaddingL = 0; + $ipaddingR = 0; + $paddingL = 0; + $paddingR = 0; + $cpaddingadjustL = 0; + $cpaddingadjustR = 0; + // Added mPDF 3.0 + $fpaddingR = 0; + $fpaddingL = 0; + } + else { +/*-- END TABLES --*/ + $ipaddingL = $this->blk[$this->blklvl]['padding_left']; + $ipaddingR = $this->blk[$this->blklvl]['padding_right']; + $paddingL = ($ipaddingL * _MPDFK); + $paddingR = ($ipaddingR * _MPDFK); + $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; + $cpaddingadjustL = -$this->cMarginL; + $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; + $cpaddingadjustR = -$this->cMarginR; + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + //OBJECTS - IMAGES & FORM Elements (NB has already skipped line/page if required - in printbuffer) + if (substr($s,0,3) == "\xbb\xa4\xac") { //identifier has been identified! + $objattr = $this->_getObjAttr($s); + $h_corr = 0; + if ($is_table) { // *TABLES* + $maximumW = ($maxWidth/_MPDFK) - ($this->cellPaddingL + $this->cMarginL + $this->cellPaddingR + $this->cMarginR); // *TABLES* + } // *TABLES* + else { // *TABLES* + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) && (!$is_table)) { $h_corr = $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } + $maximumW = ($maxWidth/_MPDFK) - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w'] + $fpaddingL + $fpaddingR ); + } // *TABLES* + $objattr = $this->inlineObject($objattr['type'],$this->lMargin + $fpaddingL + ($contentWidth/_MPDFK),($this->y + $h_corr), $objattr, $this->lMargin,($contentWidth/_MPDFK),$maximumW,$lineHeight,true,$is_table); + + // SET LINEHEIGHT for this line ================ RESET AT END + $lineHeight = MAX($lineHeight,$objattr['OUTER-HEIGHT']); + $this->objectbuffer[count($content)-1] = $objattr; + // if (isset($objattr['vertical-align'])) { $valign = $objattr['vertical-align']; } + // else { $valign = ''; } + $contentWidth += ($objattr['OUTER-WIDTH'] * _MPDFK); + return; + } + + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + if (isset($this->spanborddet['L'])) $lbw = $this->spanborddet['L']['w']; + if (isset($this->spanborddet['R'])) $rbw = $this->spanborddet['R']['w']; + } + + if ($this->usingCoreFont) { + $tmp = strlen( $s ); + } + else { + $tmp = mb_strlen( $s, $this->mb_enc ); + } + + // for every character in the string + for ( $i = 0; $i < $tmp; $i++ ) { + // extract the current character + // get the width of the character in points + if ($this->usingCoreFont) { + $c = $s[$i]; + // Soft Hyphens chr(173) + $cw = ($this->GetCharWidthCore($c) * _MPDFK); + if ($this->kerning && $this->useKerning && $i > 0) { + if (isset($this->CurrentFont['kerninfo'][$s[($i-1)]][$c])) { + $cw += ($this->CurrentFont['kerninfo'][$s[($i-1)]][$c] * $this->FontSizePt / 1000 ); + } + } + } + else { + $c = mb_substr($s,$i,1,$this->mb_enc ); + $cw = ($this->GetCharWidthNonCore($c, false) * _MPDFK); + if ($this->kerning && $this->useKerning && $i > 0) { + $lastc = mb_substr($s,($i-1),1,$this->mb_enc ); + $ulastc = $this->UTF8StringToArray($lastc, false); + $uc = $this->UTF8StringToArray($c, false); + if (isset($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]])) { + $cw += ($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]] * $this->FontSizePt / 1000 ); + } + } + } + + if ($i==0) { + $cw += $lbw*_MPDFK; + $contentB[(count($contentB)-1)] .= 'L'; + } + if ($i==($tmp-1)) { + $cw += $rbw*_MPDFK; + $contentB[(count($contentB)-1)] .= 'R'; + } + // mPDF 5.6.45 + if ($c==' ') { + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + continue; + } + + // ADDED for Paragraph_indent + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align != 'C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $WidthCorrection = ($ti*_MPDFK); + } + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } + +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + + + // try adding another char + if (( $contentWidth + $cw > $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) + 0.001)) {// 0.001 is to correct for deviations converting mm=>pts + // it won't fit, output what we already have + $lineCount++; + + // contains any content that didn't make it into this print + $savedContent = ''; + $savedContentB = ''; + $savedFont = array(); + $savedObj = array(); + // mPDF 5.6.20 + $savedPreContent = array(); + $savedPreContentB = array(); + $savedPreFont = array(); + + // cut off and save any partial words at the end of the string + $words = explode( ' ', $currContent ); + /////////////////// + // HYPHENATION + $currWord = $words[count($words)-1] ; + $success = false; + + // mPDF 5.6.21 Hard Hyphens - + $hardsuccess = false; + if ($this->textparam['hyphens'] != 2 && preg_match("/\-/",$currWord)) { + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($hardsuccess,$pre,$post,$prelength) = $this->hardHyphenate($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth("-", false)) ); + if ($hardsuccess) { + $already = array_pop( $words ); + $forward = mb_substr($already,$prelength+1,mb_strlen($already, $this->mb_enc), $this->mb_enc); + $words[] = $pre.'-'; + $words[] = $forward; + $currContent = mb_substr($currContent,0,mb_strlen($currContent, $this->mb_enc)+1-mb_strlen($post, $this->mb_enc), $this->mb_enc) . '-'; + } + } + +/*-- HYPHENATION --*/ + // Soft Hyphens chr(173) + else if ($this->textparam['hyphens'] != 2 && (!$this->usingCoreFont && preg_match("/\xc2\xad/",$currWord)) || ($this->usingCoreFont && preg_match("/".chr(173)."/",$currWord) && ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats')) ) { // mPDF 5.6.06 + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($success,$pre,$post,$prelength) = $this->softHyphenate($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth(" ", false)) ); + } + + if (!$success && !$hardsuccess && $this->textparam['hyphens'] == 1 ) { // mPDF 5.6.06 // mPDF 5.6.21 + // Look ahead to get current word + for($ac = $i; $ac<(mb_strlen($s)-1); $ac++) { + $addc = mb_substr($s,$ac,1,$this->mb_enc ); + if ($addc == ' ') { break; } + $currWord .= $addc; + } + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($success,$pre,$post,$prelength) = $this->hyphenateWord($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth(" ", false)) ); + } + if ($success) { + $already = array_pop( $words ); + $forward = mb_substr($already,$prelength,mb_strlen($already, $this->mb_enc), $this->mb_enc); + $words[] = $pre.'-'; + $words[] = $forward; + $currContent = mb_substr($currContent,0,mb_strlen($currContent, $this->mb_enc)+1-mb_strlen($post, $this->mb_enc), $this->mb_enc) . '-'; + } +/*-- END HYPHENATION --*/ + + // mPDF 5.6.13 Decimal alignment (cancel if wraps to > 1 line) + if ($is_table && substr($align,0,1)=='D' ) { $align=substr($align,2,1); } + +/*-- CJK-FONTS --*/ + // mPDF 5.6.42 + if ($this->checkCJK) { + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + } + // Next character is suitable to add as overhanging or squeezed punctuation + if ($this->checkCJK && preg_match("/[".$this->CJKoverflow."]/u", $c) && $this->allowCJKorphans && !$CJKoverflow) { + // add character onto this line + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + $CJKoverflow = true; + continue; + } + // Last character that fits is not allowed to end a line - move lastchar(s) to start of next line + else if ($this->checkCJK && preg_match("/[".$this->CJKleading."]/u", $lastchar)) { + //move lastchar(s) to next line + $m0 = $lastchar; + $m1 = $c; + while(preg_match("/[".$this->CJKleading."]/u", $m0) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $m1 = $lastchar; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // Next character is not allowed to start a new line + else if ($this->checkCJK && preg_match("/[".$this->CJKfollowing."]/u", $c)) { + // try squeezing another character(s) onto this line = Oikomi + if ($this->allowCJKorphans && !$CJKoverflow) { // mPDF 5.6.40 + $lookahead = mb_substr($s,$i+1,1,$this->mb_enc ); + //if lookahead is not another following char + if (!$lookahead || ($lookahead && !preg_match("/[".$this->CJKfollowing."]/u", $lookahead))) { + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + if ($this->allowCJKoverflow && preg_match("/[".$this->CJKoverflow."]/u", $c)) { $CJKoverflow = true; } + continue; + } + } + // or move lastchar(s) to next line to keep $c company = Oidashi + $m0 = $lastchar; + $m1 = $c; + while(preg_match("/[".$this->CJKfollowing."]/u", $m1) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $m1 = $lastchar; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // mPDF 5.6.42 + else if ($this->checkCJK && preg_match("/([".$this->pregCJKchars."]+[0-9\x{ff10}-\x{ff19}]+$)/u", $words[0])) { + $lookahead = mb_substr($s,$i,16,$this->mb_enc ); + //and if lookahead starts with a few numerals + if ($lookahead && (preg_match("/^([0-9\x{ff10}-\x{ff19}]+[".$this->pregCJKchars."]+)/u", $lookahead) || preg_match("/^([0-9\x{ff10}-\x{ff19}]+$)/u", $lookahead)) ) { + // or move lastchar(s) to next line to keep numerals together + $m0 = $lastchar; + while(preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $m0) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + else +/*-- END CJK-FONTS --*/ + // if it looks like we didn't finish any words for this chunk + if ( count( $words ) == 1 ) { + // TO correct for error when word too wide for page - but only when one long word from left to right margin + if (count($content) == 1 && $currContent != ' ') { + $lastchar = mb_substr($words[0],mb_strlen($words[0], $this->mb_enc)-1, 1, $this->mb_enc); + $lastContent = $words[0]; + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // mPDF 5.6.20 + else if ( count($content)>1 + && (!isset($this->objectbuffer[(count($content)-1)]) && !isset($this->objectbuffer[(count($content)-2)])) + && substr($content[count($content)-2],-1,1) != ' ' + && substr($currContent,0,1) != ' ' + ) { + // Go back to find a space in a previous chunk of content + $found = false; + for ($ix=count($content)-1;$ix>=0;$ix--) { + // mPDF 5.6.29 + if ($this->usingCoreFont && preg_match('/[ '.chr(173).']/',$content[$ix],$m)) { $match = $m[0]; $found = $ix; break; } + else if (!$this->usingCoreFont) { + if (preg_match('/[ ]/',$content[$ix])) { $match = ' '; $found = $ix; break; } + else if (preg_match('/[\x{00AD}]/u',$content[$ix])) { + // even though it is UTF-8 replace it temporarily with chr(173) + $content[$ix] = preg_replace('/[\x{00AD}]/u',chr(173),$content[$ix]); + $match = chr(173); $found = $ix; break; + } + } + } + if ($found !== false) { + $charpos = strrpos($content[$found],$match); // mPDF 5.6.29 + for ($ix=count($content)-1;$ix>$found;$ix--) { + // save and crop off any subsequent chunks + $savedPreContent[] = array_pop($content); + $savedPreContentB[] = array_pop($contentB); + $savedPreFont[] = array_pop($font); + } + if (substr($content[count($content)-1],$charpos+1,strlen($content[count($content)-1])-1) != '') { + $savedPreContent[] = substr($content[count($content)-1],$charpos+1,strlen($content[count($content)-1])-1); + $savedPreContentB[] = preg_replace('/L/','',$contentB[count($content)-1]); // ??? + $savedPreFont[] = $font[count($content)-1]; + } + $savedContent = ''; + $savedContentB = ''; + $savedFont = array(); + + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = substr($currContent,0,$charpos); + if ($match == chr(173)) { $currContent .= '-'; } // mPDF 5.6.29 + if (strpos($contentB[(count($contentB)-1)],'R')!==false) { // ??? + $contentB[count($content)-1] = preg_replace('/R/','',$contentB[count($content)-1]); // ??? + } + + $currContent = rtrim( $currContent ); + } + else { + $savedContent = array_pop( $content ); + $savedContentB = array_pop($contentB); + $savedFont = array_pop( $font ); + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = rtrim( $currContent ); + } + } + else { + // save and crop off the content currently on the stack + $savedContent = array_pop( $content ); + $savedContentB = array_pop($contentB); // mPDF 5.6.20 + $savedFont = array_pop( $font ); + // trim any trailing spaces off the last bit of content + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = rtrim( $currContent ); + } + } + else { // otherwise, we need to find which bit to cut off + $lastContent = ''; + for ( $w = 0; $w < count( $words ) - 1; $w++) { $lastContent .= $words[ $w ]." "; } + $savedContent = $words[ count( $words ) - 1 ]; + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // CJK - strip CJK space at end of line + //   = \xe3\x80\x80 = CJK space + if ($this->checkCJK) { $currContent = preg_replace("/\xe3\x80\x80$/",'',$currContent) ; } // *CJK-FONTS* + + + if (isset($this->objectbuffer[(count($content)-1)]) && $this->objectbuffer[(count($content)-1)]['type']=='dottab') { + $savedObj = array_pop( $this->objectbuffer ); + $contentWidth -= ($this->objectbuffer[(count($content)-1)]['OUTER-WIDTH'] * _MPDFK); + } + + // Set Current lineheight (correction factor) + $lhfixed = false; +/*-- LISTS --*/ + if ($is_list) { + if (preg_match('/([0-9.,]+)mm/',$this->list_lineheight[$this->listlvl][$this->listOcc],$am)) { + $lhfixed = true; + $def_fontsize = $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listOcc][$this->listnum]['size']; + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->list_lineheight[$this->listlvl][$this->listOcc]; + } + } + else +/*-- END LISTS --*/ +/*-- TABLES --*/ + if ($is_table) { + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight,$am)) { + $lhfixed = true; + $def_fontsize = $this->FontSize; // needs to be default font-size for block **** + $this->lineheight_correction = $lineHeight / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->table_lineheight; + } + } + else +/*-- END TABLES --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + if (preg_match('/([0-9.,]+)mm/',$this->blk[$this->blklvl]['line_height'],$am)) { + $lhfixed = true; + $def_fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; // needs to be default font-size for block **** + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->blk[$this->blklvl]['line_height']; + } + } + else { + $this->lineheight_correction = $this->normalLineheight; + } + // update $contentWidth and $cutoffWidth since they changed with cropping + // Also correct lineheight to maximum fontsize (not for tables) + $contentWidth = 0; + // correct lineheight to maximum fontsize + if ($lhfixed) { $maxlineHeight = $this->lineheight; } + else { $maxlineHeight = 0; } + $this->forceExactLineheight = true; + $maxfontsize = 0; + // While we're at it, check for cursive text + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } // *RTL* + foreach ( $content as $k => $chunk ) + { + $this->restoreFont( $font[ $k ]); + if (!isset($this->objectbuffer[$k])) { + // mPDF 5.6.40 + if ($this->checkCJK && $k == count($content)-1 && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $this->CJKforceend) { + // force-end overhang + $hanger = mb_substr($chunk,mb_strlen($chunk,$this->mb_enc)-1,1,$this->mb_enc ); + $content[$k] = $chunk = mb_substr($chunk,0,mb_strlen($chunk,$this->mb_enc)-1,$this->mb_enc ); + } + if (!$this->usingCoreFont) { + $content[$k] = $chunk = str_replace("\xc2\xad",'',$chunk ); + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + } + // Soft Hyphens chr(173) + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $content[$k] = $chunk = str_replace(chr(173),'',$chunk ); + } + $contentWidth += $this->GetStringWidth( $chunk ) * _MPDFK; + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false) $contentWidth += $this->spanborddet['L']['w'] * _MPDFK; + if (strpos($contentB[$k],'R')!==false) $contentWidth += $this->spanborddet['R']['w'] * _MPDFK; + } + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$this->FontSize * $this->lineheight_correction ); } + if ($lhfixed && ($this->FontSize > $def_fontsize || ($this->FontSize > ($lineHeight * $this->lineheight_correction) && $is_list))) { + $this->forceExactLineheight = false; + } + $maxfontsize = max($maxfontsize,$this->FontSize); + } + } + + $lastfontreqstyle = $font[count($font)-1]['ReqFontStyle']; + $lastfontstyle = $font[count($font)-1]['style']; + if ($blockdir == 'ltr' && strpos($lastfontreqstyle,"I") !== false && strpos($lastfontstyle,"I") === false) { // Artificial italic + $lastitalic = $this->FontSize*0.15*_MPDFK; + } + else { $lastitalic = 0; } + + +/*-- LISTS --*/ + if ($is_list && is_array($this->bulletarray) && $this->bulletarray) { + $actfs = $this->bulletarray['fontsize']; + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && $actfs > $def_fontsize) { $this->forceExactLineheight = false; } + $maxfontsize = max($maxfontsize,$actfs); + } +/*-- END LISTS --*/ + + // when every text item checked i.e. $maxfontsize is set properly + + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + + foreach ( $content as $k => $chunk ) { + if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { + $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * _MPDFK; + $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; + $va = $this->objectbuffer[$k]['vertical-align']; // = $objattr['vertical-align'] = set as M,T,B,S + if ($lhfixed && $oh > $def_fontsize) { $this->forceExactLineheight = false; } + + if ($va == 'BS') { // (BASELINE default) + $af = max($af, ($oh - ($maxfontsize * (0.5 + $this->baselineC)))); + } + else if ($va == 'M') { + $af = max($af, ($oh - $maxfontsize)/2); + $bf = max($bf, ($oh - $maxfontsize)/2); + } + else if ($va == 'TT') { + $bf = max($bf, ($oh - $maxfontsize)); + } + else if ($va == 'TB') { + $af = max($af, ($oh - $maxfontsize)); + } + else if ($va == 'T') { + $mta = max($mta, $oh); + } + else if ($va == 'B') { + $mba = max($mba, $oh); + } + } + } + if ((!$lhfixed || !$this->forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + + + $lineHeight = $maxlineHeight; + $cutoffWidth = $contentWidth; + // If NOT images, and maxfontsize NOT > lineHeight - this value determines text baseline positioning + if ($lhfixed && $af==0 && $bf==0 && $maxfontsize<=($def_fontsize * $this->lineheight_correction * 0.8 )) { + $this->linemaxfontsize = $def_fontsize; + } + else { $this->linemaxfontsize = $maxfontsize; } + + + $inclCursive=false; + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + if ($this->usingCoreFont) { + $content[$k] = str_replace(chr(160),chr(32),$chunk ); + } + else { + $content[$k] = str_replace(chr(194).chr(160),chr(32),$chunk ); + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $chunk)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $chunk)) { $inclCursive = true; } // *INDIC* + } + } + } + } + + // JUSTIFICATION J + $jcharspacing = 0; + $jws = 0; + $nb_carac = 0; + $nb_spaces = 0; + // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) + if ( ($align == 'J' && !$CJKoverflow) || (($cutoffWidth + $lastitalic > $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) + 0.001) && (!$CJKoverflow || ($CJKoverflow && !$this->allowCJKoverflow))) || $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { // 0.001 is to correct for deviations converting mm=>pts // mPDF 5.6.40 + // JUSTIFY J (Use character spacing) + // WORD SPACING + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + $nb_carac += mb_strlen( $chunk, $this->mb_enc ) ; + $nb_spaces += mb_substr_count( $chunk,' ', $this->mb_enc ) ; + } + } + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$cutoffWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } + + + // WORD SPACING + $empty = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + + $empty -= ($jcharspacing * $nb_carac); + $empty -= ($jws * $nb_spaces); + + $empty /= _MPDFK; + $b = ''; //do not use borders + // Get PAGEBREAK TO TEST for height including the top border/padding + $check_h = max($this->divheight,$lineHeight); + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($this->blklvl > 0) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); + } + + if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { + $this->SetCol($this->NbCol-1); + } + + // PAGEBREAK + // 'If' below used in order to fix "first-line of other page with justify on" bug + if(!$is_table && ($this->y+$check_h) > $this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { + $bak_x=$this->x;//Current X position + + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + + $this->x = $bak_x; + // Added to correct for OddEven Margins + $currentx += $this->MarginCorrection; + $this->x += $this->MarginCorrection; + + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + if ($this->keep_block_together && !$is_table && $this->kt_p00 < $this->page && ($this->y+$check_h) > $this->kt_y00) { + $this->printdivbuffer(); + $this->keep_block_together = 0; + } + + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $oldcolumn = $this->CurrCol; + } + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* +/*-- END COLUMNS --*/ + + // TOP MARGIN + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($this->blk[$this->blklvl]['margin_top']) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $this->DivLn($this->blk[$this->blklvl]['margin_top'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + + // Update y0 for top of block (used to paint border) + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $this->blk[$this->blklvl]['y0'] = $this->y; + $this->blk[$this->blklvl]['startpage'] = $this->page; + if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } // mPDF 5.6.63 + } + + // TOP PADDING and BORDER spacing/fill + if (($newblock) && ($blockstate==1 || $blockstate==3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'],-3,true,false,1); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + $arraysize = count($content); + + $margins = ($this->cMarginL+$this->cMarginR) + ($ipaddingL+$ipaddingR + $fpaddingR + $fpaddingR ); + + // PAINT BACKGROUND FOR THIS LINE + if (!$is_table) { $this->DivLn($lineHeight,$this->blklvl,false); } // false -> don't advance y + + $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL ; + if ($align == 'R') { $this->x += $empty; } + else if ($align == 'C') { $this->x += ($empty / 2); } + + // Paragraph INDENT + if (isset($this->blk[$this->blklvl]['text_indent']) && ($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 1) && (!$is_table) && ($blockdir !='rtl') && ($align !='C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $this->x += $ti; + } + + // DIRECTIONALITY RTL + $all_rtl = false; + $contains_rtl = false; +/*-- RTL --*/ + if ($blockdir == 'rtl' || $this->biDirectional) { + $all_rtl = true; + foreach ( $content as $k => $chunk ) { + $reversed = $this->magic_reverse_dir($chunk, false, $blockdir); + + if ($reversed > 0) { $contains_rtl = true; } + if ($reversed < 2) { $all_rtl = false; } + $content[$k] = $chunk; + } + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { + $content = array_reverse($content,false); + $contentB = array_reverse($contentB,false); + } + } +/*-- END RTL --*/ + + foreach ( $content as $k => $chunk ) { + + // FOR IMAGES - UPDATE POSITION + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { $dirk = $arraysize-1 - $k ; } else { $dirk = $k; } + + $va = 'M'; // default for text + if (isset($this->objectbuffer[$dirk]) && $this->objectbuffer[$dirk]) { + $xadj = $this->x - $this->objectbuffer[$dirk]['OUTER-X'] ; + $this->objectbuffer[$dirk]['OUTER-X'] += $xadj; + $this->objectbuffer[$dirk]['BORDER-X'] += $xadj; + $this->objectbuffer[$dirk]['INNER-X'] += $xadj; + $va = $this->objectbuffer[$dirk]['vertical-align']; + $yadj = $this->y - $this->objectbuffer[$dirk]['OUTER-Y']; + if ($va == 'BS') { + $yadj += $af + ($this->linemaxfontsize * (0.5 + $this->baselineC)) - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'M' || $va == '') { + $yadj += $af + ($this->linemaxfontsize /2) - ($this->objectbuffer[$dirk]['OUTER-HEIGHT']/2); + } + else if ($va == 'TB') { + $yadj += $af + $this->linemaxfontsize - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'TT') { + $yadj += $af; + } + else if ($va == 'B') { + $yadj += $af + $this->linemaxfontsize + $bf - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'T') { + $yadj += 0; + } + $this->objectbuffer[$dirk]['OUTER-Y'] += $yadj; + $this->objectbuffer[$dirk]['BORDER-Y'] += $yadj; + $this->objectbuffer[$dirk]['INNER-Y'] += $yadj; + } + + // DIRECTIONALITY RTL + if ((($blockdir == 'rtl') && ($contains_rtl )) || ($all_rtl )) { $this->restoreFont($font[$arraysize-1 - $k]); } + else { $this->restoreFont( $font[ $k ] ); } + + $this->SetSpacing(($this->fixedlSpacing*_MPDFK)+$jcharspacing,($this->fixedlSpacing+$this->minwSpacing)*_MPDFK+$jws); + // Now unset these values so they don't influence GetStringwidth below or in fn. Cell + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + // mPDF 5.6.26 + $save_vis = $this->visibility; + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { + $this->SetVisibility($this->textparam['visibility']); + } + // *********** SPAN BACKGROUND COLOR ***************** // + if ($this->spanbgcolor) { + $cor = $this->spanbgcolorarray; + $this->SetFColor($cor); + $save_fill = $fill; $spanfill = 1; $fill = 1; + } + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false) $this->x += $this->spanborddet['L']['w']; + if (strpos($contentB[$k],'L')===false) $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; + if (strpos($contentB[$k],'R')===false) $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; + } + + // WORD SPACING + $stringWidth = $this->GetStringWidth($chunk ); + $stringWidth += ( $this->charspacing * mb_strlen($chunk,$this->mb_enc ) / _MPDFK ); + $stringWidth += ( $this->ws * mb_substr_count($chunk,' ',$this->mb_enc ) / _MPDFK ); + if (isset($this->objectbuffer[$dirk])) { $stringWidth = $this->objectbuffer[$dirk]['OUTER-WIDTH']; } + + if ($stringWidth==0) { $stringWidth = 0.000001; } + if ($k == $arraysize-1) { + $stringWidth -= ( $this->charspacing / _MPDFK ); + // mPDF 5.6.40 + if ($this->checkCJK && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { + // force-end overhang + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + $this->Cell( $this->GetStringWidth($hanger), $lineHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + else { + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); //mono-style line or last part (skips line) + } + + } + else $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0,0,'M', $fill, $af, $bf, true );//first or middle part + + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'R')!==false && $k != $arraysize-1) $this->x += $this->spanborddet['R']['w']; + } + // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // + if (isset($spanfill) && $spanfill) { + $fill = $save_fill; $spanfill = 0; + if ($fill) { $this->SetFColor($bcor); } + } + // mPDF 5.6.26 + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { + $this->SetVisibility($save_vis); + } + + } + if (!$is_table) { + $this->maxPosR = max($this->maxPosR , ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'])); + $this->maxPosL = min($this->maxPosL , ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'])); + } + + // move on to the next line, reset variables, tack on saved content and current char + + $this->printobjectbuffer($is_table, $blockdir); + $this->objectbuffer = array(); + +/*-- LISTS --*/ + // LIST BULLETS/NUMBERS + if ($is_list && is_array($this->bulletarray) && ($lineCount == 1) ) { + + $this->ResetSpacing(); + + $bull = $this->bulletarray; + if (isset($bull['level']) && isset($bull['occur']) && isset($this->InlineProperties['LIST'][$bull['level']][$bull['occur']])) { + $this->restoreInlineProperties($this->InlineProperties['LIST'][$bull['level']][$bull['occur']]); + } + if (isset($bull['level']) && isset($bull['occur']) && isset($bull['num']) && isset($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) && $this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) { $this->restoreInlineProperties($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = true; + $this->SetFont('czapfdingbats','',$this->FontSizePt/2.5); + } + else { $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); } // force output + //Output bullet + $this->x = $currentx; + if (isset($bull['x'])) { $this->x += $bull['x']; } + $this->y -= $lineHeight; + if (isset($bull['col']) && $bull['col']) { $this->SetTColor($bull['col']); } // mPDF 5.6.67 + if (isset($bull['txt'])) { $this->Cell($bull['w'], $lineHeight,$bull['txt'],'','',$bull['align'],0,'',0,-$this->cMarginL, -$this->cMarginR ); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = false; + } + $this->x = $currentx; // Reset + $this->y += $lineHeight; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + $this->bulletarray = array(); // prevents repeat of bullet/number if
  • ....
    .....
  • + } +/*-- END LISTS --*/ + + +/*-- CSS-IMAGE-FLOAT --*/ + // Update values if set to skipline + if ($this->floatmargins) { $this->_advanceFloatMargins(); } +/*-- END CSS-IMAGE-FLOAT --*/ + + // Reset lineheight + $lineHeight = $this->divheight; + $valign = 'M'; + + $font = array(); + $content = array(); + $contentB = array(); + $contentWidth = 0; + if (!empty($savedObj)) { + $this->objectbuffer[] = $savedObj; + $font[] = $savedFont; + $content[] = ''; + $contentB[] = ''; + $contentWidth += $savedObj['OUTER-WIDTH'] * _MPDFK; + } + // mPDF 5.6.20 + if (count($savedPreContent) > 0) { + for($ix=count($savedPreContent)-1;$ix>=0;$ix--) { + $font[] = $savedPreFont[$ix]; + $content[] = $savedPreContent[$ix]; + $contentB[] = $savedPreContentB[$ix]; + $this->restoreFont( $savedPreFont[$ix] ); + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if ($ix>0) { + $contentWidth += $this->GetStringWidth( $savedPreContent[$ix] ) * _MPDFK; + if (strpos($savedPreContentB[$ix],'L')!==false) $contentWidth += $lbw; + if (strpos($savedPreContentB[$ix],'R')!==false) $contentWidth += $rbw; + } + } + $savedPreContent = array(); + $savedPreContentB = array(); + $savedPreFont = array(); + $content[ (count($content)-1) ] .= $c; + } + else { + $font[] = $savedFont; + $content[] = $savedContent . $c; + $contentB[] = $savedContentB ; + } + + $currContent =& $content[ (count($content)-1) ]; + + // CJK - strip CJK space at end of line + //   = \xe3\x80\x80 = CJK space + if ($this->checkCJK && $currContent == "\xe3\x80\x80") { $currContent = '' ; } // *CJK-FONTS* + + $this->restoreFont( $savedFont ); + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + $contentWidth += $this->GetStringWidth( $currContent ) * _MPDFK; + if (strpos($savedContentB,'L')!==false) $contentWidth += $lbw; + $cutoffWidth = $contentWidth; + $CJKoverflow = false; + $hanger = ''; // mPDF 5.6.40 + } + // another character will fit, so add it on + else { + $contentWidth += $cw; + $currContent .= $c; + } + } + unset($content); + unset($contentB); +} +//----------------------END OF FLOWING BLOCK------------------------------------// + + +/*-- CSS-IMAGE-FLOAT --*/ +// Update values if set to skipline +function _advanceFloatMargins() { + // Update floatmargins - L + if (isset($this->floatmargins['L']) && $this->floatmargins['L']['skipline'] && $this->floatmargins['L']['y0'] != $this->y) { + $yadj = $this->y - $this->floatmargins['L']['y0']; + $this->floatmargins['L']['y0'] = $this->y; + $this->floatmargins['L']['y1'] += $yadj; + + // Update objattr in floatbuffer + if ($this->floatbuffer[$this->floatmargins['L']['id']]['border_left']['w']) { + $this->floatbuffer[$this->floatmargins['L']['id']]['BORDER-Y'] += $yadj; + } + $this->floatbuffer[$this->floatmargins['L']['id']]['INNER-Y'] += $yadj; + $this->floatbuffer[$this->floatmargins['L']['id']]['OUTER-Y'] += $yadj; + + // Unset values + $this->floatbuffer[$this->floatmargins['L']['id']]['skipline'] = false; + $this->floatmargins['L']['skipline'] = false; + $this->floatmargins['L']['id'] = ''; + } + // Update floatmargins - R + if (isset($this->floatmargins['R']) && $this->floatmargins['R']['skipline'] && $this->floatmargins['R']['y0'] != $this->y) { + $yadj = $this->y - $this->floatmargins['R']['y0']; + $this->floatmargins['R']['y0'] = $this->y; + $this->floatmargins['R']['y1'] += $yadj; + + // Update objattr in floatbuffer + if ($this->floatbuffer[$this->floatmargins['R']['id']]['border_left']['w']) { + $this->floatbuffer[$this->floatmargins['R']['id']]['BORDER-Y'] += $yadj; + } + $this->floatbuffer[$this->floatmargins['R']['id']]['INNER-Y'] += $yadj; + $this->floatbuffer[$this->floatmargins['R']['id']]['OUTER-Y'] += $yadj; + + // Unset values + $this->floatbuffer[$this->floatmargins['R']['id']]['skipline'] = false; + $this->floatmargins['R']['skipline'] = false; + $this->floatmargins['R']['id'] = ''; + } +} +/*-- END CSS-IMAGE-FLOAT --*/ + + + +//////////////////////////////////////////////////////////////////////////////// +// ADDED forcewrap - to call from inline OBJECT functions to breakwords if necessary in cell +//////////////////////////////////////////////////////////////////////////////// +function WordWrap(&$text, $maxwidth, $forcewrap = 0) { + $biggestword=0; + $toonarrow=false; + + $text = trim($text); + + if ($text==='') return 0; + $space = $this->GetCharWidth(' ',false); + $lines = explode("\n", $text); + $text = ''; + $count = 0; + foreach ($lines as $line) { + $words = explode(' ', $line); + $width = 0; + foreach ($words as $word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + //Warn user that maxwidth is insufficient + if ($wordwidth > $maxwidth + 0.0001) { + if ($wordwidth > $biggestword) { $biggestword = $wordwidth; } + $toonarrow=true; + // ADDED + if ($forcewrap) { + while($wordwidth > $maxwidth) { + $chw = 0; // check width + for ( $i = 0; $i < mb_strlen($word, $this->mb_enc ); $i++ ) { + $chw = $this->GetStringWidth(mb_substr($word,0,$i+1,$this->mb_enc )); + if ($chw > $maxwidth ) { + if ($text) { + $text = rtrim($text)."\n".mb_substr($word,0,$i,$this->mb_enc ); + $count++; + } + else { + $text = mb_substr($word,0,$i,$this->mb_enc ); + } + $word = mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $wordwidth = $this->GetStringWidth($word); + $width = $maxwidth; + break; + } + } + } + } + } + + if ($width + $wordwidth < $maxwidth - 0.0001) { + $width += $wordwidth + $space; + $text .= $word.' '; + } + else { + $width = $wordwidth + $space; + $text = rtrim($text)."\n".$word.' '; + $count++; + } + } + $text .= "\n"; + $count++; + } + $text = rtrim($text); + + //Return -(wordsize) if word is bigger than maxwidth + + // ADDED + if ($forcewrap) { return $count; } + if (($toonarrow) && ($this->table_error_report)) { + $this->Error("Word is too long to fit in table - ".$this->table_error_report_param); + } + if ($toonarrow) return -$biggestword; + else return $count; +} + +/*-- END HTML-CSS --*/ + +function _SetTextRendering($mode) { + if (!(($mode == 0) || ($mode == 1) || ($mode == 2))) + $this->Error("Text rendering mode should be 0, 1 or 2 (value : $mode)"); + $tr = ($mode.' Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + +} + +function SetTextOutline($params=array()) { // mPDF 5.6.07 + if (isset($params['outline-s']) && $params['outline-s']) + { + $this->SetLineWidth($params['outline-WIDTH']); + $this->SetDColor($params['outline-COLOR']); + $tr = ('2 Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + } + else //Now resets all values + { + $this->SetLineWidth(0.2); + $this->SetDColor($this->ConvertColor(0)); + $this->_SetTextRendering(0); + $tr = ('0 Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + } +} + +function Image($file,$x,$y,$w=0,$h=0,$type='',$link='',$paint=true, $constrain=true, $watermark=false, $shownoimg=true, $allowvector=true) { + $orig_srcpath = $file; + $this->GetFullPath($file); + + $info=$this->_getImage($file, true, $allowvector, $orig_srcpath ); + if(!$info && $paint) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $file = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); // 14 x 16px + $h = ($info['h'] * (25.4/$this->dpi)); // 14 x 16px + } + } + if(!$info) return false; + //Automatic width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // returned SVG units are pts + // divide by k to get user units (mm) + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h']) /_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + } + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + +/*-- WATERMARK --*/ + if ($watermark) { + $maxw = $this->w; + $maxh = $this->h; + // Size = D PF or array + if (is_array($this->watermark_size)) { + $w = $this->watermark_size[0]; + $h = $this->watermark_size[1]; + } + else if (!is_string($this->watermark_size)) { + $maxw -= $this->watermark_size*2; + $maxh -= $this->watermark_size*2; + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + else if ($this->watermark_size == 'F') { + if ($this->ColActive) { $maxw = $this->w - ($this->DeflMargin + $this->DefrMargin); } + else { $maxw = $this->pgwidth; } + $maxh = $this->h - ($this->tMargin + $this->bMargin); + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + else if ($this->watermark_size == 'P') { // Default P + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + // Automatically resize to maximum dimensions of page if too large + if ($w > $maxw) { + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + } + if ($h > $maxh ) { + $h = $maxh ; + $w=abs($h*$info['w']/$info['h']); + } + // Position + if (is_array($this->watermark_pos)) { + $x = $this->watermark_pos[0]; + $y = $this->watermark_pos[1]; + } + else if ($this->watermark_pos == 'F') { // centred on printable area + if ($this->ColActive) { // *COLUMNS* + if (($this->mirrorMargins) && (($this->page)%2==0)) { $xadj = $this->DeflMargin-$this->DefrMargin; } // *COLUMNS* + else { $xadj = 0; } // *COLUMNS* + $x = ($this->DeflMargin - $xadj + ($this->w - ($this->DeflMargin + $this->DefrMargin))/2) - ($w/2); // *COLUMNS* + } // *COLUMNS* + else { // *COLUMNS* + $x = ($this->lMargin + ($this->pgwidth)/2) - ($w/2); + } // *COLUMNS* + $y = ($this->tMargin + ($this->h - ($this->tMargin + $this->bMargin))/2) - ($h/2); + } + else { // default P - centred on whole page + $x = ($this->w/2) - ($w/2); + $y = ($this->h/2) - ($h/2); + } +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else { + $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q",$w*_MPDFK,$h*_MPDFK,$x*_MPDFK,($this->h-($y+$h))*_MPDFK,$info['i']); + } + + if ($this->watermarkImgBehind) { + $outstring = $this->watermarkImgAlpha . "\n" . $outstring . "\n" . $this->SetAlpha(1, 'Normal', true) . "\n"; + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$outstring."\n".'\\1', $this->pages[$this->page]); + } + else { $this->_out($outstring); } + + return 0; + } // end of IF watermark +/*-- END WATERMARK --*/ + + if ($constrain) { + // Automatically resize to maximum dimensions of page if too large + if (isset($this->blk[$this->blklvl]['inner_width']) && $this->blk[$this->blklvl]['inner_width']) { $maxw = $this->blk[$this->blklvl]['inner_width']; } + else { $maxw = $this->pgwidth; } + if ($w > $maxw) { + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + } + if ($h > $this->h - ($this->tMargin + $this->bMargin + 1)) { // see below - +10 to avoid drawing too close to border of page + $h = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $h = $this->fullImageHeight; } + $w=abs($h*$info['w']/$info['h']); + } + + + //Avoid drawing out of the paper(exceeding width limits). + //if ( ($x + $w) > $this->fw ) { + if ( ($x + $w) > $this->w ) { + $x = $this->lMargin; + $y += 5; + } + + $changedpage = false; + $oldcolumn = $this->CurrCol; + //Avoid drawing out of the page. + if($y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { + $this->AddPage($this->CurOrientation); + // Added to correct for OddEven Margins + $x=$x +$this->MarginCorrection; + $y = $tMargin + $this->margin_header; + $changedpage = true; + } +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $y = $this->y0; + $x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } +/*-- END COLUMNS --*/ + } // end of IF constrain + +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else { + $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q",$w*_MPDFK,$h*_MPDFK,$x*_MPDFK,($this->h-($y+$h))*_MPDFK,$info['i']); + } + + if($paint) { + $this->_out($outstring); + if($link) $this->Link($x,$y,$w,$h,$link); + + // Avoid writing text on top of the image. // THIS WAS OUTSIDE THE if ($paint) bit!!!!!!!!!!!!!!!! + $this->y = $y + $h; + } + + //Return width-height array + $sizesarray['WIDTH'] = $w; + $sizesarray['HEIGHT'] = $h; + $sizesarray['X'] = $x; //Position before painting image + $sizesarray['Y'] = $y; //Position before painting image + $sizesarray['OUTPUT'] = $outstring; + + $sizesarray['IMAGE_ID'] = $info['i']; + $sizesarray['itype'] = $info['type']; + $sizesarray['set-dpi'] = $info['set-dpi']; + return $sizesarray; +} + + + +//============================================================= +//============================================================= +//============================================================= +//============================================================= +//============================================================= +/*-- HTML-CSS --*/ + +function _getObjAttr($t) { + $c = explode("\xbb\xa4\xac",$t,2); + $c = explode(",",$c[1],2); + foreach($c as $v) { + $v = explode("=",$v,2); + $sp[$v[0]] = $v[1]; + } + return (unserialize($sp['objattr'])); +} + + +function inlineObject($type,$x,$y,$objattr,$Lmargin,$widthUsed,$maxWidth,$lineHeight,$paint=false,$is_table=false) +{ + if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } + + // NB $x is only used when paint=true + // Lmargin not used + $w = 0; + if (isset($objattr['width'])) { $w = $objattr['width']/$k; } + $h = 0; + if (isset($objattr['height'])) { $h = abs($objattr['height']/$k); } + $widthLeft = $maxWidth - $widthUsed; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + // For Images + if (isset($objattr['border_left'])) { + $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left']+ $objattr['margin_right'])/$k; + $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top']+ $objattr['margin_bottom'])/$k; + + if ($type == 'image' || $type == 'barcode' || $type == 'textcircle') { + $extraWidth += ($objattr['padding_left'] + $objattr['padding_right'])/$k; + $extraHeight += ($objattr['padding_top'] + $objattr['padding_bottom'])/$k; + } + } + + if (!isset($objattr['vertical-align'])) { $objattr['vertical-align'] = 'M'; } + + if ($type == 'image' || (isset($objattr['subtype']) && $objattr['subtype'] == 'IMAGE')) { + if (isset($objattr['itype']) && ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg')) { + $file = $objattr['file']; + $info=$this->formobjects[$file]; + } + else if (isset($objattr['file'])) { + $file = $objattr['file']; + $info=$this->images[$file]; + } + } + if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { + $w = 0.00001; + $h = 0.00001; + } + + // TEST whether need to skipline + if (!$paint) { + if ($type == 'hr') { // always force new line + if (($y + $h + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return array(-2, $w ,$h ); } // New page + new line + else { return array(1, $w ,$h ); } // new line + } + else { + if ($widthUsed > 0 && $w > $widthLeft && (!$is_table || $type != 'image')) { // New line needed + if (($y + $h + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter) { return array(-2,$w ,$h ); } // New page + new line + return array(1,$w ,$h ); // new line + } + else if ($widthUsed > 0 && $w > $widthLeft && $is_table) { // New line needed in TABLE + return array(1,$w ,$h ); // new line + } + // Will fit on line but NEW PAGE REQUIRED + else if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return array(-1,$w ,$h ); } + else { return array(0,$w ,$h ); } + } + } + + if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { + $w = 0.00001; + $h = 0.00001; + $objattr['BORDER-WIDTH'] = 0; + $objattr['BORDER-HEIGHT'] = 0; + $objattr['BORDER-X'] = $x; + $objattr['BORDER-Y'] = $y; + $objattr['INNER-WIDTH'] = 0; + $objattr['INNER-HEIGHT'] = 0; + $objattr['INNER-X'] = $x; + $objattr['INNER-Y'] = $y; + } + + if ($type == 'image') { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft ; + $h=abs($w*$info['h']/$info['w']); + } + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + + $objattr['BORDER-WIDTH'] = $img_w + $objattr['padding_left']/$k + $objattr['padding_right']/$k + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + $objattr['padding_top']/$k + $objattr['padding_bottom']/$k + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $x + $objattr['padding_left']/$k + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['padding_top']/$k + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['ID'] = $info['i']; + } + + if ($type == 'input' && $objattr['subtype'] == 'IMAGE') { + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $x + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['ID'] = $info['i']; + } + + if ($type == 'barcode' || $type == 'textcircle') { + $b_w = $w - $extraWidth ; + $b_h = $h - $extraHeight ; + $objattr['BORDER-WIDTH'] = $b_w + $objattr['padding_left']/$k + $objattr['padding_right']/$k + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $b_h + $objattr['padding_top']/$k + $objattr['padding_bottom']/$k + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-X'] = $x + $objattr['padding_left']/$k + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['padding_top']/$k + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['INNER-WIDTH'] = $b_w; + $objattr['INNER-HEIGHT'] = $b_h; + } + + + if ($type == 'textarea') { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft ; + } + if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter) { + $h=$this->h - $y - $this->bMargin; + } + } + + if ($type == 'hr') { + if ($is_table) { + $objattr['INNER-WIDTH'] = $maxWidth * $objattr['W-PERCENT']/100; + $objattr['width'] = $objattr['INNER-WIDTH']; + $w = $maxWidth; + } + else { + if ($w>$maxWidth) { $w = $maxWidth; } + $objattr['INNER-WIDTH'] = $w; + $w = $maxWidth; + } + } + + + + if (($type == 'select') || ($type == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD'))) { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft; + } + } + + if ($type == 'textarea' || $type == 'select' || $type == 'input') { + if (isset($objattr['fontsize'])) $objattr['fontsize'] /= $k; + if (isset($objattr['linewidth'])) $objattr['linewidth'] /= $k; + } + + if (!isset($objattr['BORDER-Y'])) { $objattr['BORDER-Y'] = 0; } + if (!isset($objattr['BORDER-X'])) { $objattr['BORDER-X'] = 0; } + if (!isset($objattr['INNER-Y'])) { $objattr['INNER-Y'] = 0; } + if (!isset($objattr['INNER-X'])) { $objattr['INNER-X'] = 0; } + + //Return width-height array + $objattr['OUTER-WIDTH'] = $w; + $objattr['OUTER-HEIGHT'] = $h; + $objattr['OUTER-X'] = $x; + $objattr['OUTER-Y'] = $y; + return $objattr; +} + +/*-- END HTML-CSS --*/ + +//============================================================= +//============================================================= +//============================================================= +//============================================================= +//============================================================= + +function SetLineJoin($mode=0) +{ + $s=sprintf('%d j',$mode); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineJoin']) && $this->pageoutput[$this->page]['LineJoin'] != $s) || !isset($this->pageoutput[$this->page]['LineJoin']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['LineJoin'] = $s; + +} +function SetLineCap($mode=2) { + $s=sprintf('%d J',$mode); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineCap']) && $this->pageoutput[$this->page]['LineCap'] != $s) || !isset($this->pageoutput[$this->page]['LineCap']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['LineCap'] = $s; + +} + +function SetDash($black=false,$white=false) +{ + if($black and $white) $s=sprintf('[%.3F %.3F] 0 d',$black*_MPDFK,$white*_MPDFK); + else $s='[] 0 d'; + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Dash']) && $this->pageoutput[$this->page]['Dash'] != $s) || !isset($this->pageoutput[$this->page]['Dash']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['Dash'] = $s; + +} + +function SetDisplayPreferences($preferences) { + // String containing any or none of /HideMenubar/HideToolbar/HideWindowUI/DisplayDocTitle/CenterWindow/FitWindow + $this->DisplayPreferences .= $preferences; +} + + +function Ln($h='',$collapsible=0) +{ +// Added collapsible to allow collapsible top-margin on new page + //Line feed; default value is last cell height + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + if ($collapsible && ($this->y==$this->tMargin) && (!$this->ColActive)) { $h = 0; } + if(is_string($h)) $this->y+=$this->lasth; + else $this->y+=$h; +} + +/*-- HTML-CSS --*/ +// $state = 0 normal; 1 top; 2 bottom; 3 top and bottom +function DivLn($h,$level=-3,$move_y=true,$collapsible=false,$state=0) { + // this->x is returned as it was + // adds lines (y) where DIV bgcolors are filled in + // allows .00001 as nominal height used for bookmarks/annotations etc. + if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->tMargin)) && (!$this->ColActive)) { return; } + if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->y0)) && ($this->ColActive) && $this->CurrCol == 0) { return; } // *COLUMNS* + + // Still use this method if columns or page-break-inside: avoid, as it allows repositioning later + // otherwise, now uses PaintDivBB() + if (!$this->ColActive && !$this->keep_block_together && !$this->kwt) { + if ($move_y && !$this->ColActive) { $this->y += $h; } + return; + } + + if ($level == -3) { $level = $this->blklvl; } + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl > 0 && $this->blklvl >= $firstblockfill) { + $last_x = 0; + $last_w = 0; + $last_fc = $this->FillColor; + $bak_x = $this->x; + $bak_h = $this->divheight; + $this->divheight = 0; // Temporarily turn off divheight - as Cell() uses it to check for PageBreak + for ($blvl=$firstblockfill;$blvl<=$level;$blvl++) { + $this->SetBlockFill($blvl); + $this->x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; + if ($last_x != $this->lMargin + $this->blk[$blvl]['outer_left_margin'] || $last_w != $this->blk[$blvl]['width'] || $last_fc != $this->FillColor || $this->blk[$blvl]['border_top']['s'] || $this->blk[$blvl]['border_bottom']['s'] || $this->blk[$blvl]['border_left']['s'] || $this->blk[$blvl]['border_right']['s']) { // mPDF 5.6.55 + $x = $this->x; + $this->Cell( ($this->blk[$blvl]['width']), $h, '', '', 0, '', 1); + if (!$this->keep_block_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { + $this->x = $x; + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + if ($blvl == $this->blklvl) { $this->PaintDivLnBorder($state,$blvl,$h); } + else { $this->PaintDivLnBorder(0,$blvl,$h); } + } + } + $last_x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; + $last_w = $this->blk[$blvl]['width']; + $last_fc = $this->FillColor; + } + // Reset current block fill + if (isset($this->blk[$this->blklvl]['bgcolorarray'])) { + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + $this->SetFColor($bcor); + } + $this->x = $bak_x; + $this->divheight = $bak_h; + } + if ($move_y) { $this->y += $h; } +} +/*-- END HTML-CSS --*/ + + +function SetX($x) +{ + //Set x position + if($x >= 0) $this->x=$x; + else $this->x = $this->w + $x; +} + +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 + if ($this->showStats) { + echo '
    Generated in '.sprintf('%.2F',(microtime(true) - $this->time0)).' seconds
    '; + } + //Finish document if necessary + if ($this->progressBar) { $this->UpdateProgressBar(1,'100','Finished'); } // *PROGRESS-BAR* + if($this->state < 3) $this->Close(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'100','Finished'); } // *PROGRESS-BAR* + // fn. error_get_last is only in PHP>=5.2 + if ($this->debug && function_exists('error_get_last') && error_get_last()) { + $e = error_get_last(); + if (($e['type'] < 2048 && $e['type'] != 8) || (intval($e['type']) & intval(ini_get("error_reporting")))) { + echo "

    Error message detected - PDF file generation aborted.

    "; + echo $e['message'].'
    '; + echo 'File: '.$e['file'].'
    '; + echo 'Line: '.$e['line'].'
    '; + exit; + } + } + + + if (($this->PDFA || $this->PDFX) && $this->encrypted) { $this->Error("PDFA1-b or PDFX/1-a does not permit encryption of documents."); } + if (count($this->PDFAXwarnings) && (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto))) { + if ($this->PDFA) { + echo '
    WARNING - This file could not be generated as it stands as a PDFA1-b compliant file.
    '; + echo '
    These issues can be automatically fixed by mPDF using $mpdf->PDFAauto=true;
    '; + echo '
    Action that mPDF will take to automatically force PDFA1-b compliance are shown in brackets.
    '; + } + else { + echo '
    WARNING - This file could not be generated as it stands as a PDFX/1-a compliant file.
    '; + echo '
    These issues can be automatically fixed by mPDF using $mpdf->PDFXauto=true;
    '; + echo '
    Action that mPDF will take to automatically force PDFX/1-a compliance are shown in brackets.
    '; + } + echo '
    Warning(s) generated:
      '; + $this->PDFAXwarnings = array_unique($this->PDFAXwarnings); + foreach($this->PDFAXwarnings AS $w) { + echo '
    • '.$w.'
    • '; + } + echo '
    '; + exit; + } + + if ($this->showStats) { + echo '
    Compiled in '.sprintf('%.2F',(microtime(true) - $this->time0)).' seconds (total)
    '; + echo '
    Peak Memory usage '.number_format((memory_get_peak_usage(true)/(1024*1024)),2).' MB
    '; + echo '
    PDF file size '.number_format((strlen($this->buffer)/1024)).' kB
    '; + echo '
    Number of fonts '.count($this->fonts).'
    '; + exit; + } + + + if(is_bool($dest)) $dest=$dest ? 'D' : 'F'; + $dest=strtoupper($dest); + if($dest=='') { + if($name=='') { + $name='mpdf.pdf'; + $dest='I'; + } + else { $dest='F'; } + } + +/*-- PROGRESS-BAR --*/ + if ($this->progressBar && ($dest=='D' || $dest=='I')) { + if($name=='') { $name='mpdf.pdf'; } + $tempfile = '_tempPDF'.RAND(1,10000); + //Save to local file + $f=fopen(_MPDF_TEMP_PATH.$tempfile.'.pdf','wb'); + if(!$f) $this->Error('Unable to create temporary output file: '.$tempfile.'.pdf'); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + $this->UpdateProgressBar(3,'','Finished'); + + echo ' +
    + + '; + exit; + } + else { + if ($this->progressBar) { $this->UpdateProgressBar(3,'','Finished'); } +/*-- END PROGRESS-BAR --*/ + + switch($dest) { + case 'I': + if ($this->debug && !$this->allow_output_buffering && ob_get_contents()) { echo "

    Output has already been sent from the script - PDF file generation aborted.

    "; exit; } + //Send to standard output + if(PHP_SAPI!='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'); + if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { + // don't use length if server using compression + header('Content-Length: '.strlen($this->buffer)); + } + header('Content-disposition: inline; filename="'.$name.'"'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + } + echo $this->buffer; + break; + case 'D': + //Download file + header('Content-Description: File Transfer'); + if (headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + header('Content-Transfer-Encoding: binary'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + header('Content-Type: application/force-download'); + header('Content-Type: application/octet-stream', false); + header('Content-Type: application/download', false); + header('Content-Type: application/pdf', false); + if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { + // don't use length if server using compression + 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); + } + + } // *PROGRESS-BAR* + //====================================================================================================== + // DELETE OLD TMP FILES - Housekeeping + // Delete any files in tmp/ directory that are >1 hrs old + $interval = 3600; + if ($handle = opendir(preg_replace('/\/$/','',_MPDF_TEMP_PATH))) { + while (false !== ($file = readdir($handle))) { + if (!is_dir($file) && ((filemtime(_MPDF_TEMP_PATH.$file)+$interval) < time()) && ($file != "..") && ($file != ".")) { // mPDF 5.4.19 + unlink(_MPDF_TEMP_PATH.$file); + } + } + closedir($handle); + } + //============================================================================================================== + + return ''; +} + + +// ***************************************************************************** +// * +// Protected methods * +// * +// ***************************************************************************** +function _dochecks() +{ + //Check for locale-related bug + if(1.1==1) + $this->Error('Don\'t alter the locale before including mPDF'); + //Check for decimal separator + if(sprintf('%.1f',1.0)!='1.0') + setlocale(LC_NUMERIC,'C'); + // mPDF 5.4.11 + $mqr=ini_get("magic_quotes_runtime"); + if ($mqr) { $this->Error('mPDF requires magic_quotes_runtime to be turned off e.g. by using ini_set("magic_quotes_runtime", 0);'); } +} + +function _begindoc() +{ + //Start document + $this->state=1; + $this->_out('%PDF-'.$this->pdf_version); + $this->_out('%'.chr(226).chr(227).chr(207).chr(211)); // 4 chars > 128 to show binary file +} + + +/*-- HTMLHEADERS-FOOTERS --*/ +function _puthtmlheaders() { + $this->state=2; + $nb=$this->page; + for($n=1;$n<=$nb;$n++) { + if ($this->mirrorMargins && $n%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + $this->page = $n; + if (isset($this->saveHTMLHeader[$n][$OE])) { + $html = $this->saveHTMLHeader[$n][$OE]['html']; + $this->lMargin = $this->saveHTMLHeader[$n][$OE]['ml']; + $this->rMargin = $this->saveHTMLHeader[$n][$OE]['mr']; + $this->tMargin = $this->saveHTMLHeader[$n][$OE]['mh']; + $this->bMargin = $this->saveHTMLHeader[$n][$OE]['mf']; + $this->margin_header = $this->saveHTMLHeader[$n][$OE]['mh']; + $this->margin_footer = $this->saveHTMLHeader[$n][$OE]['mf']; + $this->w = $this->saveHTMLHeader[$n][$OE]['pw']; + $this->h = $this->saveHTMLHeader[$n][$OE]['ph']; + $rotate = (isset($this->saveHTMLHeader[$n][$OE]['rotate']) ? $this->saveHTMLHeader[$n][$OE]['rotate'] : null); + $this->Reset(); + $this->pageoutput[$n] = array(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->x = $this->lMargin; + $this->y = $this->margin_header; + // mPDF 5.6.47 + $pn = $this->docPageNum($n); + if ($pn) + $pnstr = $this->pagenumPrefix.$pn.$this->pagenumSuffix; + else { $pnstr = ''; } + $html = str_replace('{PAGENO}',$pnstr,$html); + $pnt = $this->docPageNumTotal($n); + if ($pnt) + $pntstr = $this->nbpgPrefix.$pnt.$this->nbpgSuffix; + else { $pntstr = ''; } + $html = str_replace($this->aliasNbPgGp,$pntstr,$html ); // {nbpg} + $html = str_replace($this->aliasNbPg,$nb,$html ); // {nb} + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + + $this->writingHTMLheader = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLheader = false; + $this->Reset(); + $this->pageoutput[$n] = array(); + + $s = $this->PrintPageBackgrounds(); + $this->headerbuffer = $s . $this->headerbuffer; + $os = ''; + if ($rotate) { + $os .= sprintf('q 0 -1 1 0 0 %.3F cm ',($this->w*_MPDFK)); + } + $os .= $this->headerbuffer ; + if ($rotate) { + $os .= ' Q' . "\n"; + } + + // Writes over the page background but behind any other output on page + $os = preg_replace('/\\\\/','\\\\\\\\',$os); + $this->pages[$n] = preg_replace('/(___HEADER___MARKER'.date('jY').')/', "\n".$os."\n".'\\1', $this->pages[$n]); + + $lks = $this->HTMLheaderPageLinks; + foreach($lks AS $lk) { + if ($rotate) { + $lw = $lk[2]; + $lh = $lk[3]; + $lk[2] = $lh; + $lk[3] = $lw; // swap width and height + $ax = $lk[0]/_MPDFK; + $ay = $lk[1]/_MPDFK; + $bx = $ay-($lh/_MPDFK); + $by = $this->w-$ax; + $lk[0] = $bx*_MPDFK; + $lk[1] = ($this->h-$by)*_MPDFK - $lw; + } + $this->PageLinks[$n][]=$lk; + } +/*-- FORMS --*/ + foreach($this->HTMLheaderPageForms AS $f) { + $this->form->forms[$f['n']] = $f; + } +/*-- END FORMS --*/ + + + } + if (isset($this->saveHTMLFooter[$n][$OE])) { + $html = $this->saveHTMLFooter[$this->page][$OE]['html']; + $this->lMargin = $this->saveHTMLFooter[$n][$OE]['ml']; + $this->rMargin = $this->saveHTMLFooter[$n][$OE]['mr']; + $this->tMargin = $this->saveHTMLFooter[$n][$OE]['mh']; + $this->bMargin = $this->saveHTMLFooter[$n][$OE]['mf']; + $this->margin_header = $this->saveHTMLFooter[$n][$OE]['mh']; + $this->margin_footer = $this->saveHTMLFooter[$n][$OE]['mf']; + $this->w = $this->saveHTMLFooter[$n][$OE]['pw']; + $this->h = $this->saveHTMLFooter[$n][$OE]['ph']; + $rotate = (isset($this->saveHTMLFooter[$n][$OE]['rotate']) ? $this->saveHTMLFooter[$n][$OE]['rotate'] : null); + $this->Reset(); + $this->pageoutput[$n] = array(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->x = $this->lMargin; + $top_y = $this->y = $this->h - $this->margin_footer; + + // if bottom-margin==0, corrects to avoid division by zero + if ($this->y == $this->h) { $top_y = $this->y = ($this->h - 0.1); } + // mPDF 5.6.47 + $pn = $this->docPageNum($n); + if ($pn) + $pnstr = $this->pagenumPrefix.$pn.$this->pagenumSuffix; + else { $pnstr = ''; } + $html = str_replace('{PAGENO}',$pnstr,$html); + $pnt = $this->docPageNumTotal($n); + if ($pnt) + $pntstr = $this->nbpgPrefix.$pnt.$this->nbpgSuffix; + else { $pntstr = ''; } + $html = str_replace($this->aliasNbPgGp,$pntstr,$html ); // {nbpg} + $html = str_replace($this->aliasNbPg,$nb,$html ); // {nb} + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + + + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + + $this->writingHTMLfooter = true; + $this->InFooter = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLfooter = false; + $this->InFooter = false; + $this->Reset(); + $this->pageoutput[$n] = array(); + + $fheight = $this->y - $top_y; + $adj = -$fheight; + + $s = $this->PrintPageBackgrounds(-$adj); + $this->headerbuffer = $s . $this->headerbuffer; + + $os = ''; + $os .= $this->StartTransform(true)."\n"; + if ($rotate) { + $os .= sprintf('q 0 -1 1 0 0 %.3F cm ',($this->w*_MPDFK)); + } + $os .= $this->transformTranslate(0, $adj, true)."\n"; + $os .= $this->headerbuffer ; + if ($rotate) { + $os .= ' Q' . "\n"; + } + $os .= $this->StopTransform(true)."\n"; + // Writes over the page background but behind any other output on page + $os = preg_replace('/\\\\/','\\\\\\\\',$os); + $this->pages[$n] = preg_replace('/(___HEADER___MARKER'.date('jY').')/', "\n".$os."\n".'\\1', $this->pages[$n]); + + $lks = $this->HTMLheaderPageLinks; + foreach($lks AS $lk) { + $lk[1] -= $adj*_MPDFK; + if ($rotate) { + $lw = $lk[2]; + $lh = $lk[3]; + $lk[2] = $lh; + $lk[3] = $lw; // swap width and height + + $ax = $lk[0]/_MPDFK; + $ay = $lk[1]/_MPDFK; + $bx = $ay-($lh/_MPDFK); + $by = $this->w-$ax; + $lk[0] = $bx*_MPDFK; + $lk[1] = ($this->h-$by)*_MPDFK - $lw; + } + $this->PageLinks[$n][]=$lk; + } +/*-- FORMS --*/ + foreach($this->HTMLheaderPageForms AS $f) { + $f['y'] += $adj; + $this->form->forms[$f['n']] = $f; + } +/*-- END FORMS --*/ + } + } + $this->page=$nb; + $this->state=1; +} +/*-- END HTMLHEADERS-FOOTERS --*/ + + +function _putpages() +{ + $nb=$this->page; + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + + if($this->DefOrientation=='P') { + $defwPt=$this->fwPt; + $defhPt=$this->fhPt; + } + else { + $defwPt=$this->fhPt; + $defhPt=$this->fwPt; + } + $annotid=(3+2*$nb); + + // Active Forms + $totaladdnum = 0; + for($n=1;$n<=$nb;$n++) { + if (isset($this->PageLinks[$n])) { $totaladdnum += count($this->PageLinks[$n]); } +/*-- ANNOTATIONS --*/ + if (isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $k => $pl) { + if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { $totaladdnum += 2 ; } + else { $totaladdnum++; } + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + if ( count($this->form->forms) > 0 ) { + $this->form->countPageForms($n, $totaladdnum); + } +/*-- END FORMS --*/ + } +/*-- FORMS --*/ + // Make a note in the radio button group of the obj_id it will have + $ctr = 0; + if (count($this->form->form_radio_groups)) { + foreach($this->form->form_radio_groups AS $name=>$frg) { + $this->form->form_radio_groups[$name]['obj_id'] = $annotid + $totaladdnum + $ctr; + $ctr++; + } + } +/*-- END FORMS --*/ + + // Select unused fonts (usually default font) + $unused = array(); + foreach($this->fonts as $fk=>$font) { + if (!$font['used'] && ($font['type']=='TTF')) { + $unused[] = $fk; + } + } + + + for($n=1;$n<=$nb;$n++) + { + $thispage = $this->pages[$n]; +// unset($this->pages[$n]); // mPDF 5.6.47 + if(isset($this->OrientationChanges[$n])) { + $hPt=$this->pageDim[$n]['w']*_MPDFK; + $wPt=$this->pageDim[$n]['h']*_MPDFK; + $owidthPt_LR = $this->pageDim[$n]['outer_width_TB']*_MPDFK; + $owidthPt_TB = $this->pageDim[$n]['outer_width_LR']*_MPDFK; + } + else { + $wPt=$this->pageDim[$n]['w']*_MPDFK; + $hPt=$this->pageDim[$n]['h']*_MPDFK; + $owidthPt_LR = $this->pageDim[$n]['outer_width_LR']*_MPDFK; + $owidthPt_TB = $this->pageDim[$n]['outer_width_TB']*_MPDFK; + } + // Remove references to unused fonts (usually default font) + foreach($unused as $fk) { + if ($this->fonts[$fk]['sip'] || $this->fonts[$fk]['smp']) { + foreach($this->fonts[$fk]['subsetfontids'] AS $k => $fid) { + $thispage = preg_replace('/\s\/F'.$fid.' \d[\d.]* Tf\s/is',' ',$thispage); + } + } + else { + $thispage = preg_replace('/\s\/F'.$this->fonts[$fk]['i'].' \d[\d.]* Tf\s/is',' ',$thispage); + } + } + //Replace number of pages + if(!empty($this->aliasNbPg)) { + if (!$this->onlyCoreFonts) { $s1 = $this->UTF8ToUTF16BE($this->aliasNbPg, false); } + $s2 = $this->aliasNbPg; + if (!$this->onlyCoreFonts) { $r1 = $this->UTF8ToUTF16BE($nb, false); } + $r2 = $nb; + if (preg_match_all('/{mpdfheadernbpg (C|R) ff=(\S*) fs=(\S*) fz=(.*?)}/',$thispage,$m)) { + for($hi=0;$hiSetFont($hff,$hfst,$hfsz, false); + $x1 = $this->GetStringWidth($this->aliasNbPg); + $x2 = $this->GetStringWidth($nb); + $xadj = $x1 - $x2; + if ($pos=='C') { $xadj /= 2; } + $rep = sprintf(' q 1 0 0 1 %.3F 0 cm ', $xadj*_MPDFK); + $thispage = str_replace($m[0][$hi], $rep, $thispage); + } + } + if (!$this->onlyCoreFonts) { $thispage=str_replace($s1,$r1,$thispage); } + $thispage=str_replace($s2,$r2,$thispage); + + // And now for any SMP/SIP fonts subset using format + $r = ''; + $nstr = "$nb"; + for($i=0;$ialiasNbPgHex,$r,$thispage); + + } + //Replace number of pages in group + if(!empty($this->aliasNbPgGp)) { + if (!$this->onlyCoreFonts) { $s1 = $this->UTF8ToUTF16BE($this->aliasNbPgGp, false); } + $s2 = $this->aliasNbPgGp; + $nbt = $this->docPageNumTotal($n); + if (!$this->onlyCoreFonts) { $r1 = $this->UTF8ToUTF16BE($nbt, false); } + $r2 = $nbt; + if (preg_match_all('/{mpdfheadernbpggp (C|R) ff=(\S*) fs=(\S*) fz=(.*?)}/',$thispage,$m)) { + for($hi=0;$hiSetFont($hff,$hfst,$hfsz, false); + $x1 = $this->GetStringWidth($this->aliasNbPgGp); + $x2 = $this->GetStringWidth($nbt); + $xadj = $x1 - $x2; + if ($pos=='C') { $xadj /= 2; } + $rep = sprintf(' q 1 0 0 1 %.3F 0 cm ', $xadj*_MPDFK); + $thispage = str_replace($m[0][$hi], $rep, $thispage); + } + } + if (!$this->onlyCoreFonts) { $thispage=str_replace($s1,$r1,$thispage); } + $thispage=str_replace($s2,$r2,$thispage); + + // And now for any SMP/SIP fonts subset using format + $r = ''; + $nstr = "$nbt"; + for($i=0;$ialiasNbPgGpHex,$r,$thispage); + + } + $thispage = preg_replace('/(\s*___BACKGROUND___PATTERNS'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___HEADER___MARKER'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___PAGE___START'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___TABLE___BACKGROUNDS'.date('jY').'\s*)/', " ", $thispage); + + //Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if(isset($this->OrientationChanges[$n])) { + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$hPt,$wPt)); + //If BleedBox is defined, it must be larger than the TrimBox, but smaller than the MediaBox + $bleedMargin = $this->pageDim[$n]['bleedMargin']*_MPDFK; + if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { + $x0 = $owidthPt_TB-$bleedMargin; + $y0 = $owidthPt_LR-$bleedMargin; + $x1 = $hPt-$owidthPt_TB+$bleedMargin; + $y1 = $wPt-$owidthPt_LR+$bleedMargin; + $this->_out(sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); + } + $this->_out(sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_TB, $owidthPt_LR, ($hPt-$owidthPt_TB), ($wPt-$owidthPt_LR))); + if (isset($this->OrientationChanges[$n]) && $this->displayDefaultOrientation) { + if ($this->DefOrientation=='P') { $this->_out('/Rotate 270'); } + else { $this->_out('/Rotate 90'); } + } + } + //else if($wPt != $defwPt || $hPt != $defhPt) { + else { + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$wPt,$hPt)); + $bleedMargin = $this->pageDim[$n]['bleedMargin']*_MPDFK; + if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { + $x0 = $owidthPt_LR-$bleedMargin; + $y0 = $owidthPt_TB-$bleedMargin; + $x1 = $wPt-$owidthPt_LR+$bleedMargin; + $y1 = $hPt-$owidthPt_TB+$bleedMargin; + $this->_out(sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); + } + $this->_out(sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_LR, $owidthPt_TB, ($wPt-$owidthPt_LR), ($hPt-$owidthPt_TB))); + } + $this->_out('/Resources 2 0 R'); + + // Important to keep in RGB colorSpace when using transparency + if (!$this->PDFA && !$this->PDFX) { + if ($this->restrictColorSpace == 3) + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceCMYK >> '); + else if ($this->restrictColorSpace == 1) + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceGray >> '); + else + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceRGB >> '); + } + + $annotsnum = 0; + if (isset($this->PageLinks[$n])) { $annotsnum += count($this->PageLinks[$n]); } +/*-- ANNOTATIONS --*/ + if (isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $k => $pl) { + if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { $annotsnum += 2 ; } + else { $annotsnum++; } + $this->PageAnnots[$n][$k]['pageobj'] = $this->n; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + // Active Forms + $formsnum = 0; + if ( count($this->form->forms) > 0 ) { + foreach( $this->form->forms as $val ) { + if ( $val['page'] == $n ) + $formsnum++; + } + } +/*-- END FORMS --*/ + if ($annotsnum || $formsnum) { + $s = '/Annots [ '; + for($i=0;$i<$annotsnum;$i++) { + $s .= ($annotid + $i) . ' 0 R '; + } + $annotid += $annotsnum; +/*-- FORMS --*/ + if ( count($this->form->forms) > 0 ) { + $this->form->addFormIds($n, $s, $annotid); + } +/*-- END FORMS --*/ + $s .= '] '; + $this->_out($s); + } + + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + + //Page content + $this->_newobj(); + $p=($this->compress) ? gzcompress($thispage) : $thispage; + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + $this->_putannots($n); + + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$defwPt,$defhPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + + +function _putannots($n) { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + $nb=$this->page; + for($n=1;$n<=$nb;$n++) + { + $annotobjs = array(); + if(isset($this->PageLinks[$n]) || isset($this->PageAnnots[$n]) || count($this->form->forms) > 0 ) { + $wPt=$this->pageDim[$n]['w']*_MPDFK; + $hPt=$this->pageDim[$n]['h']*_MPDFK; + + //Links + if(isset($this->PageLinks[$n])) { + foreach($this->PageLinks[$n] as $key => $pl) { + $this->_newobj(); + $annot=''; + $rect=sprintf('%.3F %.3F %.3F %.3F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annot .= '<_UTF16BEtextstring($pl[4]); + $annot .= ' /NM '.$this->_textstring(sprintf('%04u-%04u', $n, $key)); + $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /Border [0 0 0]'; + // Use this (instead of /Border) to specify border around link + // $annot .= ' /BS <PDFA || $this->PDFX) { $annot .= ' /F 28'; } + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + // $h=isset($this->OrientationChanges[$p]) ? $wPt : $hPt; + $htarg=$this->pageDim[$p]['h']*_MPDFK; + $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>',1+2*$p,$htarg); + } + else if(is_string($pl[4])) { + $annot .= ' /A <_textstring($pl[4]).'>> >>'; + } + else { + $l=$this->links[$pl[4]]; + // may not be set if #link points to non-existent target + if (isset($this->pageDim[$l[0]]['h'])) { $htarg=$this->pageDim[$l[0]]['h']*_MPDFK; } + else { $htarg=$this->h*_MPDFK; } // doesn't really matter + $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>',1+2*$l[0],$htarg-$l[1]*_MPDFK); + } + $this->_out($annot); + $this->_out('endobj'); + } + } + + +/*-- ANNOTATIONS --*/ + if(isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $key => $pl) { + if ($pl['opt']['file']) { $FileAttachment=true; } + else { $FileAttachment=false; } + $this->_newobj(); + $annot=''; + $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); + $x = $pl['x']; + if ($this->annotMargin <> 0 || $x==0 || $x<0) { // Odd page + $x = ($wPt/_MPDFK) - $this->annotMargin; + } + $w = $h = 0; + $a = $x * _MPDFK; + $b = $hPt - ($pl['y'] * _MPDFK); + $annot .= '<n+1).' 0 R>>'; + $annot .= '>>'; + } + else { + $annot .= '/Subtype /Text'; + } + $rect = sprintf('%.3F %.3F %.3F %.3F', $a, $b-$h, $a+$w, $b); + $annot .= '/Rect ['.$rect.']'; + + // contents = description of file in free text + $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl['txt']); + $annot .= ' /NM '.$this->_textstring(sprintf('%04u-%04u', $n, (2000 + $key))); + $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /CreationDate '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /Border [0 0 0]'; + if ($this->PDFA || $this->PDFX) { + $annot .= ' /F 28'; + $annot .= ' /CA 1'; + } + else if ($pl['opt']['ca']>0) { $annot .= ' /CA '.$pl['opt']['ca']; } + + $annotcolor = ' /C ['; + if (isset($pl['opt']['c']) AND $pl['opt']['c']) { + $col = $pl['opt']['c']; + if ($col{0}==3 || $col{0}==5) { $annotcolor .= sprintf("%.3F %.3F %.3F", ord($col{1})/255,ord($col{2})/255,ord($col{3})/255); } + else if ($col{0}==1) { $annotcolor .= sprintf("%.3F", ord($col{1})/255); } + else if ($col{0}==4 || $col{0}==6) { $annotcolor .= sprintf("%.3F %.3F %.3F %.3F", ord($col{1})/100,ord($col{2})/100,ord($col{3})/100,ord($col{4})/100); } + else { $annotcolor .= '1 1 0'; } + } + else { $annotcolor .= '1 1 0'; } + $annotcolor .= ']'; + $annot .= $annotcolor; + // Usually Author + // Use as Title for fileattachment + if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { + $annot .= ' /T '.$this->_UTF16BEtextstring($pl['opt']['t']); + } + if ($FileAttachment) { + $iconsapp = array('Paperclip', 'Graph', 'PushPin', 'Tag'); + } + else { $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); } + if (isset($pl['opt']['icon']) AND in_array($pl['opt']['icon'], $iconsapp)) { + $annot .= ' /Name /'.$pl['opt']['icon']; + } + else if ($FileAttachment) { $annot .= ' /Name /PushPin'; } + else { $annot .= ' /Name /Note'; } + if (!$FileAttachment) { + // /Subj is PDF 1.5 spec. + if (isset($pl['opt']['subj']) && !$this->PDFA && !$this->PDFX) { + $annot .= ' /Subj '.$this->_UTF16BEtextstring($pl['opt']['subj']); + } + if (!empty($pl['opt']['popup'])) { + $annot .= ' /Open true'; + $annot .= ' /Popup '.($this->n+1).' 0 R'; + } + else { $annot .= ' /Open false'; } + } + $annot .= ' /P '.$pl['pageobj'].' 0 R'; + $annot .= '>>'; + $this->_out($annot); + $this->_out('endobj'); + + if ($FileAttachment) { + $file = @file_get_contents($pl['opt']['file']) or die('mPDF Error: Cannot access file attachment - '.$pl['opt']['file']); + $filestream = gzcompress($file); + $this->_newobj(); + $this->_out('<_out('/Length '.strlen($filestream)); + $this->_out('/Filter /FlateDecode'); + $this->_out('>>'); + $this->_putstream($filestream); + $this->_out('endobj'); + } + else if (!empty($pl['opt']['popup'])) { + $this->_newobj(); + $annot=''; + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { $x = $pl['opt']['popup'][0] * _MPDFK; } + else { $x = $pl['x'] * _MPDFK; } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { $y = $hPt - ($pl['opt']['popup'][1] * _MPDFK); } + else { $y = $hPt - ($pl['y'] * _MPDFK); } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { $w = $pl['opt']['popup'][2] * _MPDFK; } + else { $w = 180; } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { $h = $pl['opt']['popup'][3] * _MPDFK; } + else { $h = 120; } + $rect = sprintf('%.3F %.3F %.3F %.3F', $x, $y-$h, $x+$w, $y); + $annot .= '<_textstring('D:'.date('YmdHis')); + if ($this->PDFA || $this->PDFX) { $annot .= ' /F 28'; } + $annot .= ' /Parent '.($this->n-1).' 0 R'; + $annot .= '>>'; + $this->_out($annot); + $this->_out('endobj'); + } + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + // Active Forms + if ( count($this->form->forms) > 0 ) { + $this->form->_putFormItems($n, $hPt); + } +/*-- END FORMS --*/ + } + } +/*-- FORMS --*/ + // Active Forms - Radio Button Group entries + // Output Radio Button Group form entries (radio_on_obj_id already determined) + if (count($this->form->form_radio_groups)) { + $this->form->_putRadioItems($n); + } +/*-- END FORMS --*/ +} + + +/*-- ANNOTATIONS --*/ +function Annotation($text, $x=0, $y=0, $icon='Note', $author='', $subject='', $opacity=0, $colarray=false, $popup='', $file='') { + if (is_array($colarray) && count($colarray)==3) { $colarray = $this->ConvertColor('rgb('.$colarray[0].','.$colarray[1].','.$colarray[2].')'); } + if ($colarray === false) { $colarray = $this->ConvertColor('yellow'); } + if ($x==0) { $x = $this->x; } + if ($y==0) { $y = $this->y; } + $page = $this->page; + if ($page < 1) { // Document has not been started - assume it's for first page + $page = 1; + if ($x==0) { $x = $this->lMargin; } + if ($y==0) { $y = $this->tMargin; } + } + + if ($this->PDFA || $this->PDFX) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Annotation markers cannot be semi-transparent in PDFA1-b or PDFX/1-a, so they may make underlying text unreadable. (Annotation markers moved to right margin)"; } + $x = ($this->w) - $this->rMargin*0.66; + } + if (!$this->annotMargin) { $y -= $this->FontSize / 2; } + + if (!$opacity && $this->annotMargin) { $opacity = 1; } + else if (!$opacity) { $opacity = $this->annotOpacity; } + + $an = array('txt' => $text, 'x' => $x, 'y' => $y, 'opt' => array('Icon'=>$icon, 'T'=>$author, 'Subj'=>$subject, 'C'=>$colarray, 'CA'=>$opacity, 'popup'=>$popup, 'file'=>$file)); + + if ($this->keep_block_together) { // Save to array - don't write yet + $this->ktAnnots[$this->page][]= $an; + return; + } + else if ($this->table_rotate) { + $this->tbrot_Annots[$this->page][]= $an; + return; + } + else if ($this->kwt) { + $this->kwt_Annots[$this->page][]= $an; + return; + } + // mPDF 5.0 + if ($this->writingHTMLheader || $this->writingHTMLfooter) { + $this->HTMLheaderPageAnnots[]= $an; + return; + } + //Put an Annotation on the page + $this->PageAnnots[$page][] = $an; +/*-- COLUMNS --*/ + // Save cross-reference to Column buffer + $ref = count($this->PageAnnots[$this->page])-1; + $this->columnAnnots[$this->CurrCol][INTVAL($this->x)][INTVAL($this->y)] = $ref; +/*-- END COLUMNS --*/ +} +/*-- END ANNOTATIONS --*/ + + +function _putfonts() { + $nf=$this->n; + foreach($this->FontFiles as $fontkey=>$info) { + // TrueType embedded + if (isset($info['type']) && $info['type']=='TTF' && !$info['sip'] && !$info['smp']) { + $used = true; + $asSubset = false; + foreach($this->fonts AS $k=>$f) { + if ($f['fontkey'] == $fontkey && $f['type']=='TTF') { + $used = $f['used']; + if ($used) { + $nChars = (ord($f['cw'][0]) << 8) + ord($f['cw'][1]); + $usage = intval(count($f['subset'])*100 / $nChars); + $fsize = $info['length1']; + // Always subset the very large TTF files + if ($fsize > ($this->maxTTFFilesize *1024)) { $asSubset = true; } + else if ($usage < $this->percentSubset) { $asSubset = true; } + } + if ($f['unAGlyphs']) $aaSubset = true; // mPDF 5.4.05 + if ($this->PDFA || $this->PDFX) $asSubset = false; + $this->fonts[$k]['asSubset'] = $asSubset; + break; + } + } + if ($used && !$asSubset) { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$fontkey]['n']=$this->n; + $font=''; + $originalsize = $info['length1']; + if ($this->repackageTTF || $this->fonts[$fontkey]['TTCfontID']>0) { + // First see if there is a cached compressed file + if (file_exists(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z','rb'); + if(!$f) { $this->Error('Font file .ps.z not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + include(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.php'); // sets $originalsize (of repackaged font) + } + else { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $font = $ttf->repackageTTF($this->FontFiles[$fontkey]['ttffile'], $this->fonts[$fontkey]['TTCfontID'], $this->debugfonts, $this->fonts[$fontkey]['unAGlyphs']); // mPDF 5.4.05 + + $originalsize = strlen($font); + $font = gzcompress($font); + unset($ttf); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z',"wb"); + fwrite($fh,$font,strlen($font)); + fclose($fh); + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.php',"wb"); + $len = ""; + fwrite($fh,$len,strlen($len)); + fclose($fh); + } + } + } + else { + // First see if there is a cached compressed file + if (file_exists(_MPDF_TTFONTDATAPATH.$fontkey.'.z')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.z','rb'); + if(!$f) { $this->Error('Font file not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + } + else { + $f=fopen($this->FontFiles[$fontkey]['ttffile'],'rb'); + if(!$f) { $this->Error('Font file not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + $font = gzcompress($font); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.z',"wb"); + fwrite($fh,$font,strlen($font)); + fclose($fh); + } + } + } + + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$originalsize); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + } + } + + $nfonts = count($this->fonts); + $fctr = 1; + foreach($this->fonts as $k=>$font) { + //Font objects + $type=$font['type']; + $name=$font['name']; + if ((!isset($font['used']) || !$font['used']) && $type=='TTF') { continue; } + if ($this->progressBar) { $this->UpdateProgressBar(2,intval($fctr*100/$nfonts),'Writing Fonts'); $fctr++; } // *PROGRESS-BAR* + if (isset($font['asSubset'])) { $asSubset = $font['asSubset']; } + else { $asSubset = ''; } +/*-- CJK-FONTS --*/ + if($type=='Type0') { // = Adobe CJK Fonts + $this->fonts[$k]['n']=$this->n+1; + $this->_newobj(); + $this->_out('<_putType0($font); + } + else +/*-- END CJK-FONTS --*/ + if($type=='core') { + //Standard font + $this->fonts[$k]['n']=$this->n+1; + if ($this->PDFA || $this->PDFX) { $this->Error('Core fonts are not allowed in PDF/A1-b or PDFX/1-a files (Times, Helvetica, Courier etc.)'); } + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') { + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + } + // TrueType embedded SUBSETS for SIP (CJK extB containing Supplementary Ideographic Plane 2) + // Or Unicode Plane 1 - Supplementary Multilingual Plane + else if ($type=='TTF' && ($font['sip'] || $font['smp'])) { + if (!$font['used']) { continue; } + $ssfaid="AA"; + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + for($sfid=0;$sfidfonts[$k]['n'][$sfid]=$this->n+1; // NB an array for subset + $subsetname = 'MPDF'.$ssfaid.'+'.$font['name']; + $ssfaid++; + $subset = $font['subsets'][$sfid]; + unset($subset[0]); + $ttfontstream = $ttf->makeSubsetSIP($font['ttffile'], $subset, $font['TTCfontID'], $this->debugfonts); + $ttfontsize = strlen($ttfontstream); + $fontstream = gzcompress($ttfontstream); + $widthstring = ''; + $toUnistring = ''; + foreach($font['subsets'][$sfid] AS $cp=>$u) { + $w = $this->_getCharWidth($font['cw'], $u); + if ($w !== false) { + $widthstring .= $w.' '; + } + else { + $widthstring .= round($ttf->defaultWidth).' '; + } + if ($u > 65535) { + $utf8 = chr(($u>>18)+240).chr((($u>>12)&63)+128).chr((($u>>6)&63)+128) .chr(($u&63)+128); + $utf16 = mb_convert_encoding($utf8, 'UTF-16BE', 'UTF-8'); + $l1 = ord($utf16[0]); + $h1 = ord($utf16[1]); + $l2 = ord($utf16[2]); + $h2 = ord($utf16[3]); + $toUnistring .= sprintf("<%02s> <%02s%02s%02s%02s>\n", strtoupper(dechex($cp)), strtoupper(dechex($l1)), strtoupper(dechex($h1)), strtoupper(dechex($l2)), strtoupper(dechex($h2))); + } + else { + $toUnistring .= sprintf("<%02s> <%04s>\n", strtoupper(dechex($cp)), strtoupper(dechex($u))); + } + } + + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$subsetname); + $this->_out('/Subtype /TrueType'); + $this->_out('/FirstChar 0 /LastChar '.(count($font['subsets'][$sfid])-1)); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + $this->_out('/ToUnicode '.($this->n + 3).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + //Widths + $this->_newobj(); + $this->_out('['.$widthstring.']'); + $this->_out('endobj'); + + //Descriptor + $this->_newobj(); + $s='<$v) { + if ($kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag + $s.=' /'.$kd.' '.$v."\n"; + } + $s.='/FontFile2 '.($this->n + 2).' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + + // ToUnicode + $this->_newobj(); + $toUni = "/CIDInit /ProcSet findresource begin\n"; + $toUni .= "12 dict begin\n"; + $toUni .= "begincmap\n"; + $toUni .= "/CIDSystemInfo\n"; + $toUni .= "<_out('<>'); + $this->_putstream($toUni); + $this->_out('endobj'); + + //Font file + $this->_newobj(); + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$ttfontsize); + $this->_out('>>'); + $this->_putstream($fontstream); + $this->_out('endobj'); + } // foreach subset + unset($ttf); + } + // TrueType embedded SUBSETS or FULL + else if ($type=='TTF') { + $this->fonts[$k]['n']=$this->n+1; + if ($asSubset ) { + $ssfaid="A"; + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $fontname = 'MPDFA'.$ssfaid.'+'.$font['name']; + $subset = $font['subset']; + unset($subset[0]); + $ttfontstream = $ttf->makeSubset($font['ttffile'], $subset, $font['TTCfontID'], $this->debugfonts, $font['unAGlyphs']); // mPDF 5.4.05 + $ttfontsize = strlen($ttfontstream); + $fontstream = gzcompress($ttfontstream); + $codeToGlyph = $ttf->codeToGlyph; + unset($codeToGlyph[0]); + } + else { $fontname = $font['name']; } + // Type0 Font + // A composite font - a font composed of other fonts, organized hierarchically + $this->_newobj(); + $this->_out('<_out('/Subtype /Type0'); + $this->_out('/BaseFont /'.$fontname.''); + $this->_out('/Encoding /Identity-H'); + $this->_out('/DescendantFonts ['.($this->n + 1).' 0 R]'); + $this->_out('/ToUnicode '.($this->n + 2).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + // CIDFontType2 + // A CIDFont whose glyph descriptions are based on TrueType font technology + $this->_newobj(); + $this->_out('<_out('/Subtype /CIDFontType2'); + $this->_out('/BaseFont /'.$fontname.''); + $this->_out('/CIDSystemInfo '.($this->n + 2).' 0 R'); + $this->_out('/FontDescriptor '.($this->n + 3).' 0 R'); + if (isset($font['desc']['MissingWidth'])){ + $this->_out('/DW '.$font['desc']['MissingWidth'].''); + } + + if (!$asSubset && file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw')) { + $w = ''; + $w=file_get_contents(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw'); + $this->_out($w); + } + else { + $this->_putTTfontwidths($font, $asSubset, $ttf->maxUni); + } + + $this->_out('/CIDToGIDMap '.($this->n + 4).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + // ToUnicode + $this->_newobj(); + $toUni = "/CIDInit /ProcSet findresource begin\n"; + $toUni .= "12 dict begin\n"; + $toUni .= "begincmap\n"; + $toUni .= "/CIDSystemInfo\n"; + $toUni .= "<_out('<>'); + $this->_putstream($toUni); + $this->_out('endobj'); + + + // CIDSystemInfo dictionary + $this->_newobj(); + $this->_out('<_out('/Ordering (UCS)'); + $this->_out('/Supplement 0'); + $this->_out('>>'); + $this->_out('endobj'); + + // Font descriptor + $this->_newobj(); + $this->_out('<_out('/FontName /'.$fontname); + foreach($font['desc'] as $kd=>$v) { + if ($asSubset && $kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag + $this->_out(' /'.$kd.' '.$v); + } + if ($font['panose']) { + $this->_out(' /Style << /Panose <'.$font['panose'].'> >>'); + } + if ($asSubset ) { + $this->_out('/FontFile2 '.($this->n + 2).' 0 R'); + } + else if ($font['fontkey']) { + // obj ID of a stream containing a TrueType font program + $this->_out('/FontFile2 '.$this->FontFiles[$font['fontkey']]['n'].' 0 R'); + } + $this->_out('>>'); + $this->_out('endobj'); + + // Embed CIDToGIDMap + // A specification of the mapping from CIDs to glyph indices + if ($asSubset ) { + $cidtogidmap = ''; + $cidtogidmap = str_pad('', 256*256*2, "\x00"); + foreach($codeToGlyph as $cc=>$glyph) { + $cidtogidmap[$cc*2] = chr($glyph >> 8); + $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF); + } + $cidtogidmap = gzcompress($cidtogidmap); + } + else { + // First see if there is a cached CIDToGIDMapfile + $cidtogidmap = ''; + if (file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm','rb'); + while(!feof($f)) { $cidtogidmap .= fread($f, 2048); } + fclose($f); + } + else { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $charToGlyph = $ttf->getCTG($font['ttffile'], $font['TTCfontID'], $this->debugfonts, $font['unAGlyphs']); // mPDF 5.4.05 + $cidtogidmap = str_pad('', 256*256*2, "\x00"); + foreach($charToGlyph as $cc=>$glyph) { + $cidtogidmap[$cc*2] = chr($glyph >> 8); + $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF); + } + unset($ttf); + $cidtogidmap = gzcompress($cidtogidmap); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm',"wb"); + fwrite($fh,$cidtogidmap,strlen($cidtogidmap)); + fclose($fh); + } + } + } + $this->_newobj(); + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('>>'); + $this->_putstream($cidtogidmap); + $this->_out('endobj'); + + //Font file + if ($asSubset ) { + $this->_newobj(); + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$ttfontsize); + $this->_out('>>'); + $this->_putstream($fontstream); + $this->_out('endobj'); + unset($ttf); + } + } + else { $this->Error('Unsupported font type: '.$type.' ('.$name.')'); } + } +} + + + +function _putTTfontwidths(&$font, $asSubset, $maxUni) { + if ($asSubset && file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php')) { + include(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php') ; + $startcid = 128; + } + else { + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevwidth = -1; + $interval = false; + $startcid = 1; + } + if ($asSubset) { $cwlen = $maxUni + 1; } + else { $cwlen = (strlen($font['cw'])/2); } + + // for each character + for ($cid=$startcid; $cid<$cwlen; $cid++) { + if ($cid==128 && $asSubset && (!file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php'))) { + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php',"wb"); + $cw127='"; + fwrite($fh,$cw127,strlen($cw127)); + fclose($fh); + } + } + if ($font['cw'][$cid*2] == "\00" && $font['cw'][$cid*2+1] == "\00") { continue; } + $width = (ord($font['cw'][$cid*2]) << 8) + ord($font['cw'][$cid*2+1]); + if ($width == 65535) { $width = 0; } + if ($asSubset && $cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) { + continue; + } + if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) { + if ($cid == ($prevcid + 1)) { + // consecutive CID + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = array(); + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + } else { + $range[$rangeid][] = $width; + } + $interval = false; + } + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + $w = $this->_putfontranges($range); + $this->_out($w); + if (!$asSubset) { + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw',"wb"); + fwrite($fh,$w,strlen($w)); + fclose($fh); + } + } +} + +function _putfontranges(&$range) { + // optimize ranges + $prevk = -1; + $nextk = -1; + $prevint = false; + foreach ($range as $k => $ws) { + $cws = count($ws); + if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) { + if (isset($range[$k]['interval'])) { + unset($range[$k]['interval']); + } + $range[$prevk] = array_merge($range[$prevk], $range[$k]); + unset($range[$k]); + } else { + $prevk = $k; + } + $nextk = $k + $cws; + if (isset($ws['interval'])) { + if ($cws > 3) { + $prevint = true; + } else { + $prevint = false; + } + unset($range[$k]['interval']); + --$nextk; + } else { + $prevint = false; + } + } + // output data + $w = ''; + foreach ($range as $k => $ws) { + if (count(array_count_values($ws)) == 1) { + // interval mode is more compact + $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; + } else { + // range mode + $w .= ' '.$k.' [ '.implode(' ', $ws).' ]' . "\n"; + } + } + return '/W ['.$w.' ]'; +} + + +function _putfontwidths(&$font, $cidoffset=0) { + ksort($font['cw']); + unset($font['cw'][65535]); + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevwidth = -1; + $interval = false; + // for each character + foreach ($font['cw'] as $cid => $width) { + $cid -= $cidoffset; + if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) { + if ($cid == ($prevcid + 1)) { + // consecutive CID + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = array(); + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + } else { + $range[$rangeid][] = $width; + } + $interval = false; + } + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + $this->_out($this->_putfontranges($range)); +} + + +/*-- CJK-FONTS --*/ + +// from class PDF_Chinese CJK EXTENSIONS +function _putType0(&$font) +{ + //Type0 + $this->_out('/Subtype /Type0'); + $this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']); + $this->_out('/Encoding /'.$font['CMap']); + $this->_out('/DescendantFonts ['.($this->n+1).' 0 R]'); + $this->_out('>>'); + $this->_out('endobj'); + //CIDFont + $this->_newobj(); + $this->_out('<_out('/Subtype /CIDFontType0'); + $this->_out('/BaseFont /'.$font['name']); + + $cidinfo = '/Registry '.$this->_textstring('Adobe'); + $cidinfo .= ' /Ordering '.$this->_textstring($font['registry']['ordering']); + $cidinfo .= ' /Supplement '.$font['registry']['supplement']; + $this->_out('/CIDSystemInfo <<'.$cidinfo.'>>'); + + $this->_out('/FontDescriptor '.($this->n+1).' 0 R'); + if (isset($font['MissingWidth'])){ + $this->_out('/DW '.$font['MissingWidth'].''); + } + $this->_putfontwidths($font, 31); + $this->_out('>>'); + $this->_out('endobj'); + + //Font descriptor + $this->_newobj(); + $s = '< $v) { + if ($k != 'Style') { + $s .= ' /'.$k.' '.$v.''; + } + } + $this->_out($s.'>>'); + $this->_out('endobj'); +} +/*-- END CJK-FONTS --*/ + + + +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('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if (isset($info['masked'])) { + $this->_out('/SMask '.($this->n - 1).' 0 R'); + } + if($info['cs']=='Indexed') { + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { $this->Error("PDFA1-b and PDFX/1-a files do not permit using mixed colour space (".$file.")."); } + $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') { + if ($this->PDFA && $this->restrictColorSpace!=3) { $this->Error("PDFA1-b does not permit Images using mixed colour space (".$file.")."); } + if($info['type']=='jpg') { $this->_out('/Decode [1 0 1 0 1 0 1 0]'); } + } + else if ($info['cs']=='DeviceRGB' && ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3))) { $this->Error("PDFA1-b and PDFX/1-a files do not permit using mixed colour space (".$file.")."); } + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if (isset($info['f']) && $info['f']) { $this->_out('/Filter /'.$info['f']); } + if(isset($info['parms'])) { $this->_out($info['parms']); } + if(isset($info['trns']) and is_array($info['trns'])) { + $trns=''; + for($i=0;$i_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 _putinfo() +{ + $this->_out('/Producer '.$this->_UTF16BEtextstring('mPDF '.mPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_UTF16BEtextstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_UTF16BEtextstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_UTF16BEtextstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_UTF16BEtextstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_UTF16BEtextstring($this->creator)); + + $z = date('O'); // +0200 + $offset = substr($z,0,3)."'".substr($z,3,2)."'"; + $this->_out('/CreationDate '.$this->_textstring(date('YmdHis').$offset)); + $this->_out('/ModDate '.$this->_textstring(date('YmdHis').$offset)); + if ($this->PDFX) { + $this->_out('/Trapped/False'); + $this->_out('/GTS_PDFXVersion(PDF/X-1a:2003)'); + } +} + +function _putmetadata() { + $this->_newobj(); + $this->MetadataRoot = $this->n; + $Producer = 'mPDF '.mPDF_VERSION; + $z = date('O'); // +0200 + $offset = substr($z,0,3).':'.substr($z,3,2); + $CreationDate = date('Y-m-d\TH:i:s').$offset; // 2006-03-10T10:47:26-05:00 2006-06-19T09:05:17Z + $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), + mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); + + + $m = ''."\n"; // begin = FEFF BOM + $m .= ' '."\n"; + $m .= ' '."\n"; + $m .= ' '."\n"; + $m .= ' '.$Producer.''."\n"; + if(!empty($this->keywords)) { $m .= ' '.$this->keywords.''."\n"; } + $m .= ' '."\n"; + + $m .= ' '."\n"; + $m .= ' '.$CreationDate.''."\n"; + $m .= ' '.$CreationDate.''."\n"; + $m .= ' '.$CreationDate.''."\n"; + if(!empty($this->creator)) { $m .= ' '.$this->creator.''."\n"; } + $m .= ' '."\n"; + + // DC elements + $m .= ' '."\n"; + $m .= ' application/pdf'."\n"; + if(!empty($this->title)) { + $m .= ' + + '.$this->title.' + + '."\n"; + } + if(!empty($this->keywords)) { + $m .= ' + + '.$this->keywords.' + + '."\n"; + } + if(!empty($this->subject)) { + $m .= ' + + '.$this->subject.' + + '."\n"; + } + if(!empty($this->author)) { + $m .= ' + + '.$this->author.' + + '."\n"; + } + $m .= ' '."\n"; + + + // This bit is specific to PDFX-1a + if ($this->PDFX) { + $m .= ' '."\n"; + } + + // This bit is specific to PDFA-1b + else if ($this->PDFA) { + $m .= ' '."\n"; + $m .= ' 1'."\n"; + $m .= ' B'."\n"; + $m .= ' 2005'."\n"; + $m .= ' '."\n"; + } + + $m .= ' '."\n"; + $m .= ' uuid:'.$uuid.''."\n"; + $m .= ' '."\n"; + $m .= ' '."\n"; + $m .= ' '."\n"; + $m .= str_repeat(str_repeat(' ',100)."\n",20); // 2-4kB whitespace padding required + $m .= ''; // "r" read only + $this->_out('<>'); + $this->_putstream($m); + $this->_out('endobj'); +} + +function _putoutputintent() { + $this->_newobj(); + $this->OutputIntentRoot = $this->n; + $this->_out('<PDFA) { + $this->_out('/S /GTS_PDFA1'); + if ($this->ICCProfile) { + $this->_out('/Info ('.preg_replace('/_/',' ',$this->ICCProfile).')'); + $this->_out('/OutputConditionIdentifier (Custom)'); + $this->_out('/OutputCondition ()'); + } + else { + $this->_out('/Info (sRGB IEC61966-2.1)'); + $this->_out('/OutputConditionIdentifier (sRGB IEC61966-2.1)'); + $this->_out('/OutputCondition ()'); + } + $this->_out('/DestOutputProfile '.($this->n+1).' 0 R'); + } + else if ($this->PDFX) { // always a CMYK profile + $this->_out('/S /GTS_PDFX'); + if ($this->ICCProfile) { + $this->_out('/Info ('.preg_replace('/_/',' ',$this->ICCProfile).')'); + $this->_out('/OutputConditionIdentifier (Custom)'); + $this->_out('/OutputCondition ()'); + $this->_out('/DestOutputProfile '.($this->n+1).' 0 R'); + } + else { + $this->_out('/Info (CGATS TR 001)'); + $this->_out('/OutputConditionIdentifier (CGATS TR 001)'); + $this->_out('/OutputCondition (CGATS TR 001 (SWOP))'); + $this->_out('/RegistryName (http://www.color.org)'); + } + } + $this->_out('>>'); + $this->_out('endobj'); + + if ($this->PDFX && !$this->ICCProfile) { return; } // no ICCProfile embedded + + $this->_newobj(); + if ($this->ICCProfile) + $s = file_get_contents(_MPDF_PATH.'iccprofiles/'.$this->ICCProfile.'.icc'); + else + $s = file_get_contents(_MPDF_PATH.'iccprofiles/sRGB_IEC61966-2-1.icc'); + if ($this->compress) { $s = gzcompress($s); } + $this->_out('<<'); + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace == 3)) { $this->_out('/N 4'); } + else { $this->_out('/N 3'); } + if ($this->compress) + $this->_out('/Filter /FlateDecode '); + $this->_out('/Length '.strlen($s).'>>'); + $this->_putstream($s); + $this->_out('endobj'); +} + + +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).']'); + else $this->_out('/OpenAction [3 0 R /XYZ null null null]'); + if($this->LayoutMode=='single') $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='twoleft') $this->_out('/PageLayout /TwoColumnLeft'); + elseif($this->LayoutMode=='tworight') $this->_out('/PageLayout /TwoColumnRight'); + elseif($this->LayoutMode=='two') { + if ($this->mirrorMargins) { $this->_out('/PageLayout /TwoColumnRight'); } + else { $this->_out('/PageLayout /TwoColumnLeft'); } + } + +/*-- BOOKMARKS --*/ + if(count($this->BMoutlines)>0) { + $this->_out('/Outlines '.$this->OutlineRoot.' 0 R'); + $this->_out('/PageMode /UseOutlines'); + } +/*-- END BOOKMARKS --*/ + if(is_int(strpos($this->DisplayPreferences,'FullScreen'))) $this->_out('/PageMode /FullScreen'); + + // Metadata + if ($this->PDFA || $this->PDFX) { + $this->_out('/Metadata '.$this->MetadataRoot.' 0 R'); + } + // OutputIntents + if ($this->PDFA || $this->PDFX || $this->ICCProfile) { + $this->_out('/OutputIntents ['.$this->OutputIntentRoot.' 0 R]'); + } + +/*-- FORMS --*/ + if (count($this->form->forms)>0) { + $this->form->_putFormsCatalog(); + } +/*-- END FORMS --*/ + if ( isset($this->js) ) { + $this->_out('/Names << /JavaScript '.($this->n_js).' 0 R >> '); + } + + if($this->DisplayPreferences || $this->directionality == 'rtl' || $this->mirrorMargins) { + $this->_out('/ViewerPreferences<<'); + if(is_int(strpos($this->DisplayPreferences,'HideMenubar'))) $this->_out('/HideMenubar true'); + if(is_int(strpos($this->DisplayPreferences,'HideToolbar'))) $this->_out('/HideToolbar true'); + if(is_int(strpos($this->DisplayPreferences,'HideWindowUI'))) $this->_out('/HideWindowUI true'); + if(is_int(strpos($this->DisplayPreferences,'DisplayDocTitle'))) $this->_out('/DisplayDocTitle true'); + if(is_int(strpos($this->DisplayPreferences,'CenterWindow'))) $this->_out('/CenterWindow true'); + if(is_int(strpos($this->DisplayPreferences,'FitWindow'))) $this->_out('/FitWindow true'); + // /PrintScaling is PDF 1.6 spec. + if(is_int(strpos($this->DisplayPreferences,'NoPrintScaling')) && !$this->PDFA && !$this->PDFX) + $this->_out('/PrintScaling /None'); + if($this->directionality == 'rtl') $this->_out('/Direction /R2L'); + // /Duplex is PDF 1.7 spec. + if($this->mirrorMargins && !$this->PDFA && !$this->PDFX) { + // if ($this->DefOrientation=='P') $this->_out('/Duplex /DuplexFlipShortEdge'); + $this->_out('/Duplex /DuplexFlipLongEdge'); // PDF v1.7+ + } + $this->_out('>>'); + } + // mPDF 5.6.01 + if($this->open_layer_pane && ($this->hasOC || count($this->layers))) + $this->_out('/PageMode /UseOC'); + + // mPDF 5.6.01 + if ($this->hasOC || count($this->layers)) { + $p = $v = $h = $l = $loff = $lall = $as = ''; // mPDF 5.6.28 + if ($this->hasOC) { + if (($this->hasOC & 1) == 1) $p=$this->n_ocg_print.' 0 R'; + if (($this->hasOC & 2) == 2) $v=$this->n_ocg_view.' 0 R'; + if (($this->hasOC & 4) == 4) $h=$this->n_ocg_hidden.' 0 R'; + $as="<> <>"; + } + + if(count($this->layers)) { + foreach($this->layers as $k=>$layer) { // mPDF 5.6.28 + if (strtolower($this->layerDetails[$k]['state'])=='hidden') { $loff .= $layer['n'].' 0 R '; } + else { $l .= $layer['n'].' 0 R '; } + $lall .= $layer['n'].' 0 R '; + } + } + $this->_out("/OCProperties <_out("/Order [$v $p $h $lall] "); // mPDF 5.6.28 + if ($as) $this->_out("/AS [$as] "); + $this->_out(">>>>"); + + } + +} + +// Inactive function left for backwards compatability +function SetUserRights($enable=true, $annots="", $form="", $signature="") { + // Does nothing +} + +function _enddoc() { + if ($this->progressBar) { $this->UpdateProgressBar(2,'10','Writing Headers & Footers'); } // *PROGRESS-BAR* + $this->_puthtmlheaders(); // *HTMLHEADERS-FOOTERS* + if ($this->progressBar) { $this->UpdateProgressBar(2,'20','Writing Pages'); } // *PROGRESS-BAR* + // Remove references to unused fonts (usually default font) + foreach($this->fonts as $fk=>$font) { + if (!$font['used'] && ($font['type']=='TTF')) { + if ($font['sip'] || $font['smp']) { + foreach($font['subsetfontids'] AS $k => $fid) { + foreach($this->pages AS $pn=>$page) { + $this->pages[$pn] = preg_replace('/\s\/F'.$fid.' \d[\d.]* Tf\s/is',' ',$this->pages[$pn]); + } + } + } + else { + foreach($this->pages AS $pn=>$page) { + $this->pages[$pn] = preg_replace('/\s\/F'.$font['i'].' \d[\d.]* Tf\s/is',' ',$this->pages[$pn]); + } + } + } + } + + // mPDF 5.6.01 - LAYERS + if (count($this->layers)) { + foreach($this->pages AS $pn=>$page) { + preg_match_all('/\/OCZ-index \/ZI(\d+) BDC(.*?)(EMCZ)-index/is',$this->pages[$pn],$m1); + preg_match_all('/\/OCBZ-index \/ZI(\d+) BDC(.*?)(EMCBZ)-index/is',$this->pages[$pn],$m2); + preg_match_all('/\/OCGZ-index \/ZI(\d+) BDC(.*?)(EMCGZ)-index/is',$this->pages[$pn],$m3); + $m = array(); + for ($i=0;$i<4;$i++) { + $m[$i] = array_merge($m1[$i],$m2[$i],$m3[$i]); + } + if (count($m[0])) { + $sortarr = array(); + for($i=0;$i$k) { + $this->pages[$pn] = str_replace($m[0][$i],'',$this->pages[$pn] ); + $this->pages[$pn] .= "\n".$m[0][$i]."\n"; + } + $this->pages[$pn] = preg_replace('/\/OC[BG]{0,1}Z-index \/ZI(\d+) BDC/is','/OC /ZI\\1 BDC ',$this->pages[$pn]); + $this->pages[$pn] = preg_replace('/EMC[BG]{0,1}Z-index/is','EMC',$this->pages[$pn]); + } + } + } + + $this->_putpages(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'30','Writing document resources'); } // *PROGRESS-BAR* + + $this->_putresources(); + //Info + $this->_newobj(); + $this->InfoRoot = $this->n; + $this->_out('<<'); + if ($this->progressBar) { $this->UpdateProgressBar(2,'80','Writing document info'); } // *PROGRESS-BAR* + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + + // METADATA + if ($this->PDFA || $this->PDFX) { $this->_putmetadata(); } + // OUTPUTINTENT + if ($this->PDFA || $this->PDFX || $this->ICCProfile) { $this->_putoutputintent(); } + + //Catalog + $this->_newobj(); + $this->_out('<<'); + if ($this->progressBar) { $this->UpdateProgressBar(2,'90','Writing document catalog'); } // *PROGRESS-BAR* + $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->buffer .= '%%EOF'; + $this->state=3; +/*-- IMPORTS --*/ + + if ($this->enableImports && count($this->parsers) > 0) { + foreach ($this->parsers as $k => $_){ + $this->parsers[$k]->closeFile(); + $this->parsers[$k] = null; + unset($this->parsers[$k]); + } + } +/*-- END IMPORTS --*/ +} + +function _beginpage($orientation,$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') { + if (!($pagesel && $this->page==1 && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->tMargin)))) { + $this->page++; + $this->pages[$this->page]=''; + } + $this->state=2; + $resetHTMLHeadersrequired = false; + + if ($newformat) { $this->_setPageSize($newformat, $orientation); } +/*-- CSS-PAGE --*/ + // Paged media (page-box) + + if ($pagesel || (isset($this->page_box['using']) && $this->page_box['using'])) { + if ($pagesel || $this->page==1) { $first = true; } + else { $first = false; } + if ($this->mirrorMargins && ($this->page % 2==0)) { $oddEven = 'E'; } + else { $oddEven = 'O'; } + if ($pagesel) { $psel = $pagesel; } + else if ($this->page_box['current']) { $psel = $this->page_box['current']; } + else { $psel = ''; } + list($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS($psel, $first, $oddEven); + if ($this->mirrorMargins && ($this->page % 2==0)) { + if ($hname) { $ehvalue = 1; $ehname = $hname; } else { $ehvalue = -1; } + if ($fname) { $efvalue = 1; $efname = $fname; } else { $efvalue = -1; } + } + else { + if ($hname) { $ohvalue = 1; $ohname = $hname; } else { $ohvalue = -1; } + if ($fname) { $ofvalue = 1; $ofname = $fname; } else { $ofvalue = -1; } + } + if ($resetpagenum || $pagenumstyle || $suppress) { + $this->PageNumSubstitutions[] = array('from'=>($this->page), 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress); + } + // PAGED MEDIA - CROP / CROSS MARKS from @PAGE + $this->show_marks = $marks; + + // Background color + if (isset($bg['BACKGROUND-COLOR'])) { + $cor = $this->ConvertColor($bg['BACKGROUND-COLOR']); + if ($cor) { + $this->bodyBackgroundColor = $cor; + } + } + else { $this->bodyBackgroundColor = false; } + +/*-- BACKGROUNDS --*/ + if (isset($bg['BACKGROUND-GRADIENT'])) { + $this->bodyBackgroundGradient = $bg['BACKGROUND-GRADIENT']; + } + else { $this->bodyBackgroundGradient = false; } + + // Tiling Patterns + if (isset($bg['BACKGROUND-IMAGE']) && $bg['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($bg, $this->pgwidth); + if ($ret) { $this->bodyBackgroundImage = $ret; } + } + else { $this->bodyBackgroundImage = false; } +/*-- END BACKGROUNDS --*/ + + $this->page_box['current'] = $psel; + $this->page_box['using'] = true; + } +/*-- END CSS-PAGE --*/ + + //Page orientation + if(!$orientation) + $orientation=$this->DefOrientation; + else { + $orientation=strtoupper(substr($orientation,0,1)); + if($orientation!=$this->DefOrientation) + $this->OrientationChanges[$this->page]=true; + } + if($orientation!=$this->CurOrientation || $newformat) { + + //Change orientation + if($orientation=='P') { + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + $this->w=$this->fw; + $this->h=$this->fh; + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P') { + $this->tMargin = $this->orig_tMargin; + $this->bMargin = $this->orig_bMargin; + $this->DeflMargin = $this->orig_lMargin; + $this->DefrMargin = $this->orig_rMargin; + $this->margin_header = $this->orig_hMargin; + $this->margin_footer = $this->orig_fMargin; + } + else { $resetHTMLHeadersrequired = true; } // *HTMLHEADERS-FOOTERS* + } + else { + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + $this->w=$this->fh; + $this->h=$this->fw; + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P') { + $this->tMargin = $this->orig_lMargin; + $this->bMargin = $this->orig_rMargin; + $this->DeflMargin = $this->orig_bMargin; + $this->DefrMargin = $this->orig_tMargin; + $this->margin_header = $this->orig_hMargin; + $this->margin_footer = $this->orig_fMargin; + } + else { $resetHTMLHeadersrequired = true; } // *HTMLHEADERS-FOOTERS* + + } + $this->CurOrientation=$orientation; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin; + } + + $this->pageDim[$this->page]['w']=$this->w ; + $this->pageDim[$this->page]['h']=$this->h ; + + $this->pageDim[$this->page]['outer_width_LR'] = isset($this->page_box['outer_width_LR']) ? $this->page_box['outer_width_LR'] : 0; + $this->pageDim[$this->page]['outer_width_TB'] = isset($this->page_box['outer_width_TB']) ? $this->page_box['outer_width_TB'] : 0; + if (!isset($this->page_box['outer_width_LR']) && !isset($this->page_box['outer_width_TB'])) { + $this->pageDim[$this->page]['bleedMargin'] = 0; + } + else if ($this->bleedMargin <= $this->page_box['outer_width_LR'] && $this->bleedMargin <= $this->page_box['outer_width_TB']) { + $this->pageDim[$this->page]['bleedMargin'] = $this->bleedMargin; + } + else { + $this->pageDim[$this->page]['bleedMargin'] = min($this->page_box['outer_width_LR'], $this->page_box['outer_width_TB'])-0.01; + } + + // If Page Margins are re-defined + // strlen()>0 is used to pick up (integer) 0, (string) '0', or set value + if ((strlen($mgl)>0 && $this->DeflMargin != $mgl) || (strlen($mgr)>0 && $this->DefrMargin != $mgr) || (strlen($mgt)>0 && $this->tMargin != $mgt) || (strlen($mgb)>0 && $this->bMargin != $mgb) || (strlen($mgh)>0 && $this->margin_header!=$mgh) || (strlen($mgf)>0 && $this->margin_footer!=$mgf)) { + if (strlen($mgl)>0) $this->DeflMargin = $mgl; + if (strlen($mgr)>0) $this->DefrMargin = $mgr; + if (strlen($mgt)>0) $this->tMargin = $mgt; + if (strlen($mgb)>0) $this->bMargin = $mgb; + if (strlen($mgh)>0) $this->margin_header=$mgh; + if (strlen($mgf)>0) $this->margin_footer=$mgf; + $this->ResetMargins(); + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + + // Reset column top margin + $this->y0 = $this->tMargin; + + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + + // HEADERS AND FOOTERS + if ($ohvalue<0 || strtoupper($ohvalue)=='OFF') { + $this->HTMLHeader = ''; + $this->headerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ohname && $ohvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ohname,$n)) { + if (isset($this->pageHTMLheaders[$n[1]])) { $this->HTMLHeader = $this->pageHTMLheaders[$n[1]]; } + else { $this->HTMLHeader = ''; } + $this->headerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pageheaders[$ohname])) { $this->headerDetails['odd'] = $this->pageheaders[$ohname]; } + else if ($ohname!='_default') { $this->headerDetails['odd'] = array(); } + $this->HTMLHeader = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = false; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($ehvalue<0 || strtoupper($ehvalue)=='OFF') { + $this->HTMLHeaderE = ''; + $this->headerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ehname && $ehvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ehname,$n)) { + if (isset($this->pageHTMLheaders[$n[1]])) { $this->HTMLHeaderE = $this->pageHTMLheaders[$n[1]]; } + else { $this->HTMLHeaderE = ''; } + $this->headerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pageheaders[$ehname])) { $this->headerDetails['even'] = $this->pageheaders[$ehname]; } + else if ($ehname!='_default') { $this->headerDetails['even'] = array(); } + $this->HTMLHeaderE = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = false; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($ofvalue<0 || strtoupper($ofvalue)=='OFF') { + $this->HTMLFooter = ''; + $this->footerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ofname && $ofvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ofname,$n)) { + if (isset($this->pageHTMLfooters[$n[1]])) { $this->HTMLFooter = $this->pageHTMLfooters[$n[1]]; } + else { $this->HTMLFooter = ''; } + $this->footerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pagefooters[$ofname])) { $this->footerDetails['odd'] = $this->pagefooters[$ofname]; } + else if ($ofname!='_default') { $this->footerDetails['odd'] = array(); } + $this->HTMLFooter = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = true; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($efvalue<0 || strtoupper($efvalue)=='OFF') { + $this->HTMLFooterE = ''; + $this->footerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($efname && $efvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$efname,$n)) { + if (isset($this->pageHTMLfooters[$n[1]])) { $this->HTMLFooterE = $this->pageHTMLfooters[$n[1]]; } + else { $this->HTMLFooterE = ''; } + $this->footerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pagefooters[$efname])) { $this->footerDetails['even'] = $this->pagefooters[$efname]; } + else if ($efname!='_default') { $this->footerDetails['even'] = array(); } + $this->HTMLFooterE = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = true; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } +/*-- HTMLHEADERS-FOOTERS --*/ + if ($resetHTMLHeadersrequired) { + $this->SetHTMLHeader($this->HTMLHeader ); + $this->SetHTMLHeader($this->HTMLHeaderE ,'E'); + $this->SetHTMLFooter($this->HTMLFooter ); + $this->SetHTMLFooter($this->HTMLFooterE ,'E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->_setAutoHeaderHeight($this->headerDetails['even'], $this->HTMLHeaderE); + $this->_setAutoFooterHeight($this->footerDetails['even'], $this->HTMLFooterE); + } + else { // ODD or DEFAULT + $this->_setAutoHeaderHeight($this->headerDetails['odd'], $this->HTMLHeader); + $this->_setAutoFooterHeight($this->footerDetails['odd'], $this->HTMLFooter); + } + // Reset column top margin + $this->y0 = $this->tMargin; + + $this->x=$this->lMargin; + $this->y=$this->tMargin; +} + + + +function _setAutoHeaderHeight(&$det, &$htmlh) { + if ($this->setAutoTopMargin=='pad') { + if ($htmlh['h']) { $h = $htmlh['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'H'); } + else { $h = 0; } + $this->tMargin = $this->margin_header + $h + $this->orig_tMargin; + } + else if ($this->setAutoTopMargin=='stretch') { + if ($htmlh['h']) { $h = $htmlh['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'H'); } + else { $h = 0; } + $this->tMargin = max($this->orig_tMargin, $this->margin_header + $h + $this->autoMarginPadding); + } +} + + +function _setAutoFooterHeight(&$det, &$htmlf) { + if ($this->setAutoBottomMargin=='pad') { + if ($htmlf['h']) { $h = $htmlf['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'F'); } + else { $h = 0; } + $this->bMargin = $this->margin_footer + $h + $this->orig_bMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin ; + } + else if ($this->setAutoBottomMargin=='stretch') { + if ($htmlf['h']) { $h = $htmlf['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'F'); } + else { $h = 0; } + $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $h + $this->autoMarginPadding); + $this->PageBreakTrigger=$this->h-$this->bMargin ; + } +} + +function _getHFHeight(&$det,$end) { + $h = 0; + if(count($det)) { + foreach(array('L','C','R') AS $pos) { + if (isset($det[$pos]['content']) && $det[$pos]['content']) { + if (isset($det[$pos]['font-size']) && $det[$pos]['font-size']) { $hfsz = $det[$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $h = max($h,$hfsz/_MPDFK); + } + } + if ($det['line'] && $end=='H') { $h += $h/_MPDFK*$this->header_line_spacing; } + else if ($det['line'] && $end=='F') { $h += $h/_MPDFK*$this->footer_line_spacing; } + } + return $h; +} + + +function _endpage() { +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + $this->EndLayer(); // mPDF 5.6.01 + //End of page contents + $this->state=1; +} + +function _newobj($obj_id=false,$onlynewobj=false) { + if (!$obj_id) { + $obj_id = ++$this->n; + } + //Begin a new object + if (!$onlynewobj) { + $this->offsets[$obj_id] = strlen($this->buffer); + $this->_out($obj_id.' 0 obj'); + $this->_current_obj_id = $obj_id; // for later use with encryption + } +} + +function _dounderline($x,$y,$txt) { + // Now print line exactly where $y secifies - called from Text() and Cell() - adjust position there + // WORD SPACING + $w =($this->GetStringWidth($txt)*_MPDFK) + ($this->charspacing * mb_strlen( $txt, $this->mb_enc )) + + ( $this->ws * mb_substr_count( $txt, ' ', $this->mb_enc )); + //Draw a line + return sprintf('%.3F %.3F m %.3F %.3F l S',$x*_MPDFK,($this->h-$y)*_MPDFK,($x*_MPDFK)+$w,($this->h-$y)*_MPDFK); +} + + +function _imageError($file, $firsttime, $msg) { + // Save re-trying image URL's which have already failed + $this->failedimages[$file] = true; + if ($firsttime && ($this->showImageErrors || $this->debug)) { + $this->Error("IMAGE Error (".$file."): ".$msg); + } + return false; +} + + +function _getImage(&$file, $firsttime=true, $allowvector=true, $orig_srcpath=false) { + // firsttime i.e. whether to add to this->images - use false when calling iteratively + // Image Data passed directly as var:varname + if (preg_match('/var:\s*(.*)/',$file, $v)) { + $data = $this->$v[1]; + $file = md5($data); + } + // mPDF 5.5.13 + if (preg_match('/data:image\/(gif|jpeg|png);base64,(.*)/',$file, $v)) { + $type = $v[1]; + $data = base64_decode($v[2]); + $file = md5($data); + } + + // mPDF 5.6.02 + if ($firsttime && $file && substr($file,0,5)!='data:') { $file = urlencode_part($file); } + if ($firsttime && $orig_srcpath && substr($orig_srcpath,0,5)!='data:') { $orig_srcpath = urlencode_part($orig_srcpath); } + + $ppUx = 0; + if ($orig_srcpath && isset($this->images[$orig_srcpath])) { $file=$orig_srcpath; return $this->images[$orig_srcpath]; } + if (isset($this->images[$file])) { return $this->images[$file]; } + else if ($orig_srcpath && isset($this->formobjects[$orig_srcpath])) { $file=$orig_srcpath; return $this->formobjects[$file]; } + else if (isset($this->formobjects[$file])) { return $this->formobjects[$file]; } + // Save re-trying image URL's which have already failed + else if ($firsttime && isset($this->failedimages[$file])) { return $this->_imageError($file, $firsttime, ''); } + if (empty($data)) { + $type = ''; + $data = ''; + + if ($orig_srcpath && $this->basepathIsLocal && $check = @fopen($orig_srcpath,"rb")) { + fclose($check); + $file=$orig_srcpath; + $data = file_get_contents($file); + $type = $this->_imageTypeFromString($data); + } + if (!$data && $check = @fopen($file,"rb")) { + fclose($check); + $data = file_get_contents($file); + $type = $this->_imageTypeFromString($data); + } + if ((!$data || !$type) && !ini_get('allow_url_fopen') ) { // only worth trying if remote file and !ini_get('allow_url_fopen') + $this->file_get_contents_by_socket($file, $data); // needs full url?? even on local (never needed for local) + if ($data) { $type = $this->_imageTypeFromString($data); } + } + if ((!$data || !$type) && !ini_get('allow_url_fopen') && function_exists("curl_init")) { + $this->file_get_contents_by_curl($file, $data); // needs full url?? even on local (never needed for local) + if ($data) { $type = $this->_imageTypeFromString($data); } + } + + } + if (!$data) { return $this->_imageError($file, $firsttime, 'Could not find image file'); } + if (empty($type)) { $type = $this->_imageTypeFromString($data); } + if (($type == 'wmf' || $type == 'svg') && !$allowvector) { return $this->_imageError($file, $firsttime, 'WMF or SVG image file not supported in this context'); } + + // SVG + if ($type == 'svg') { + if (!class_exists('SVG', false)) { include(_MPDF_PATH .'classes/svg.php'); } + $svg = new SVG($this); + $family=$this->FontFamily; + $style=$this->FontStyle; + $size=$this->FontSizePt; + $info = $svg->ImageSVG($data); + //Restore font + if($family) $this->SetFont($family,$style,$size,false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing SVG file'); } + $info['type']='svg'; + $info['i']=count($this->formobjects)+1; + $this->formobjects[$file]=$info; + return $info; + } + + // JPEG + if ($type == 'jpeg' || $type == 'jpg') { + $hdr = $this->_jpgHeaderFromString($data); + if (!$hdr) { return $this->_imageError($file, $firsttime, 'Error parsing JPG header'); } + $a = $this->_jpgDataFromHeader($hdr); + $j = strpos($data,'JFIF'); + if ($j) { + //Read resolution + $unitSp=ord(substr($data,($j+7),1)); + if ($unitSp > 0) { + $ppUx=$this->_twobytes2int(substr($data,($j+8),2)); // horizontal pixels per meter, usually set to zero + if ($unitSp == 2) { // = dots per cm (if == 1 set as dpi) + $ppUx=round($ppUx/10 *25.4); + } + } + } + if ($a[2] == 'DeviceCMYK' && (($this->PDFA && $this->restrictColorSpace!=3) || $this->restrictColorSpace==2)) { + // convert to RGB image + if (!function_exists("gd_info")) { $this->Error("JPG image may not use CMYK color space (".$file.")."); } + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "JPG image may not use CMYK color space - ".$file." - (Image converted to RGB. NB This will alter the colour profile of the image.)"; } + $im = @imagecreatefromstring($data); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imageinterlace($im, false); + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse JPG(CMYK) image'); } + $info = $this->_getImage($tempfile, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse JPG(CMYK) image'); } + imagedestroy($im); + unlink($tempfile); + $info['type']='jpg'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { return $this->_imageError($file, $firsttime, 'Error creating GD image file from JPG(CMYK) image'); } + } + else if ($a[2] == 'DeviceRGB' && ($this->PDFX || $this->restrictColorSpace==3)) { + // Convert to CMYK image stream - nominally returned as type='png' + $info = $this->_convImage($data, $a[2], 'DeviceCMYK', $a[0], $a[1], $ppUx, false); + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "JPG image may not use RGB color space - ".$file." - (Image converted to CMYK. NB This will alter the colour profile of the image.)"; } + } + else if (($a[2] == 'DeviceRGB' || $a[2] == 'DeviceCMYK') && $this->restrictColorSpace==1) { + // Convert to Grayscale image stream - nominally returned as type='png' + $info = $this->_convImage($data, $a[2], 'DeviceGray', $a[0], $a[1], $ppUx, false); + } + else { + $info = array('w'=>$a[0],'h'=>$a[1],'cs'=>$a[2],'bpc'=>$a[3],'f'=>'DCTDecode','data'=>$data, 'type'=>'jpg'); + if ($ppUx) { $info['set-dpi'] = $ppUx; } + } + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing or converting JPG image'); } + + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + + // PNG + else if ($type == 'png') { + //Check signature + if(substr($data,0,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { + return $this->_imageError($file, $firsttime, 'Error parsing PNG identifier'); + } + //Read header chunk + if(substr($data,12,4)!='IHDR') { + return $this->_imageError($file, $firsttime, 'Incorrect PNG file (no IHDR block found)'); + } + + $w=$this->_fourbytes2int(substr($data,16,4)); + $h=$this->_fourbytes2int(substr($data,20,4)); + $bpc=ord(substr($data,24,1)); + $errpng = false; + $pngalpha = false; + if($bpc>8) { $errpng = 'not 8-bit depth'; } + $ct=ord(substr($data,25,1)); + if($ct==0) { $colspace='DeviceGray'; } + elseif($ct==2) { $colspace='DeviceRGB'; } + elseif($ct==3) { $colspace='Indexed'; } + elseif($ct==4) { $colspace='DeviceGray'; $errpng = 'alpha channel'; $pngalpha = true; } + else { $colspace='DeviceRGB'; $errpng = 'alpha channel'; $pngalpha = true; } + if(ord(substr($data,26,1))!=0) { $errpng = 'compression method'; } + if(ord(substr($data,27,1))!=0) { $errpng = 'filter method'; } + if(ord(substr($data,28,1))!=0) { $errpng = 'interlaced file'; } + $j = strpos($data,'pHYs'); + if ($j) { + //Read resolution + $unitSp=ord(substr($data,($j+12),1)); + if ($unitSp == 1) { + $ppUx=$this->_fourbytes2int(substr($data,($j+4),4)); // horizontal pixels per meter, usually set to zero + $ppUx=round($ppUx/1000 *25.4); + } + } + if (($colspace == 'DeviceRGB' || $colspace == 'Indexed') && ($this->PDFX || $this->restrictColorSpace==3)) { + // Convert to CMYK image stream - nominally returned as type='png' + $info = $this->_convImage($data, $colspace, 'DeviceCMYK', $w, $h, $ppUx, $pngalpha); + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "PNG image may not use RGB color space - ".$file." - (Image converted to CMYK. NB This will alter the colour profile of the image.)"; } + } + else if (($colspace == 'DeviceRGB' || $colspace == 'Indexed') && $this->restrictColorSpace==1) { + // Convert to Grayscale image stream - nominally returned as type='png' + $info = $this->_convImage($data, $colspace, 'DeviceGray', $w, $h, $ppUx, $pngalpha); + } + else if (($this->PDFA || $this->PDFX) && $pngalpha) { + // Remove alpha channel + if ($this->restrictColorSpace==1) { // Grayscale + $info = $this->_convImage($data, $colspace, 'DeviceGray', $w, $h, $ppUx, $pngalpha); + } + else if ($this->restrictColorSpace==3) { // CMYK + $info = $this->_convImage($data, $colspace, 'DeviceCMYK', $w, $h, $ppUx, $pngalpha); + } + else if ($this->PDFA ) { // RGB + $info = $this->_convImage($data, $colspace, 'DeviceRGB', $w, $h, $ppUx, $pngalpha); + } + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Transparency (alpha channel) not permitted in PDFA or PDFX files - ".$file." - (Image converted to one without transparency.)"; } + } + else if ($errpng || $pngalpha) { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (!isset($gd['PNG Support'])) { return $this->_imageError($file, $firsttime, 'GD library required for PNG image ('.$errpng.')'); } + $im = imagecreatefromstring($data); + if (!$im) { return $this->_imageError($file, $firsttime, 'Error creating GD image from PNG file ('.$errpng.')'); } + $w = imagesx($im); + $h = imagesy($im); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + // Alpha channel set + if ($pngalpha) { + if ($this->PDFA) { $this->Error("PDFA1-b does not permit images with alpha channel transparency (".$file.")."); } + $imgalpha = imagecreate($w, $h); + // generate gray scale pallete + for ($c = 0; $c < 256; ++$c) { ImageColorAllocate($imgalpha, $c, $c, $c); } + // extract alpha channel + $gammacorr = 2.2; // gamma correction + for ($xpx = 0; $xpx < $w; ++$xpx) { + for ($ypx = 0; $ypx < $h; ++$ypx) { + //$colorindex = imagecolorat($im, $xpx, $ypx); + //$col = imagecolorsforindex($im, $colorindex); + //$gamma2 = (pow((((127 - $col['alpha']) * 255 / 127) / 255), $gammacorr) * 255); + $alpha = (imagecolorat($im, $xpx, $ypx) & 0x7F000000) >> 24; + if ($alpha < 127) { + if ($alpha==0) { $gamma = 255; } + else + $gamma = (pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255); + imagesetpixel($imgalpha, $xpx, $ypx, $gamma); + } + } + } + // create temp alpha file + $tempfile_alpha = _MPDF_TEMP_PATH.'_tempMskPNG'.RAND(1,10000).'.png'; + if (!is_writable($tempfile_alpha)) { + ob_start(); + $check = @imagepng($imgalpha); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + imagedestroy($imgalpha); + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + // extract image without alpha channel + $imgplain = imagecreatetruecolor($w, $h); + imagecopy($imgplain, $im, 0, 0, 0, 0, $w, $h); + // create temp image file + $minfo = $this->_getImage($this->_tempimglnk, false); + if (!$minfo) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + ob_start(); + $check = @imagepng($imgplain); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + imagedestroy($imgplain); + $imgmask = count($this->images)+1; + $minfo['cs'] = 'DeviceGray'; + $minfo['i']=$imgmask ; + $this->images[$tempfile_alpha] = $minfo; + + } + else { + $check = @imagepng($imgalpha, $tempfile_alpha); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile_alpha.') parsing PNG image with alpha channel ('.$errpng.')'); } + imagedestroy($imgalpha); + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($w, $h); + imagecopy($imgplain, $im, 0, 0, 0, 0, $w, $h); + + // create temp image file + $check = @imagepng($imgplain, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile.') parsing PNG image with alpha channel ('.$errpng.')'); } + imagedestroy($imgplain); + // embed mask image + $minfo = $this->_getImage($tempfile_alpha, false); + unlink($tempfile_alpha); + if (!$minfo) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile_alpha.') created with GD library to parse PNG image'); } + $imgmask = count($this->images)+1; + $minfo['cs'] = 'DeviceGray'; + $minfo['i']=$imgmask ; + $this->images[$tempfile_alpha] = $minfo; + // embed image, masked with previously embedded mask + $info = $this->_getImage($tempfile, false); + unlink($tempfile); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse PNG image'); } + + } + $info['masked'] = $imgmask; + if ($ppUx) { $info['set-dpi'] = $ppUx; } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { // No alpha/transparency set + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + if (!is_writable($tempfile)) { + ob_start(); + $check = @imagepng($im); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + imagedestroy($im); + } + else { + $check = @imagepng($im, $tempfile ); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile.') parsing PNG image ('.$errpng.')'); } + imagedestroy($im); + $info = $this->_getImage($tempfile, false) ; + unlink($tempfile ); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse PNG image'); } + } + if ($ppUx) { $info['set-dpi'] = $ppUx; } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + } + } + + else { + $parms='/DecodeParms <>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $pngdata=''; + $p = 33; + do { + $n=$this->_fourbytes2int(substr($data,$p,4)); $p += 4; + $type=substr($data,$p,4); $p += 4; + if($type=='PLTE') { + //Read palette + $pal=substr($data,$p,$n); $p += $n; + $p += 4; + } + elseif($type=='tRNS') { + //Read transparency info + $t=substr($data,$p,$n); $p += $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(is_int($pos)) $trns=array($pos); + } + $p += 4; + } + elseif($type=='IDAT') { + $pngdata.=substr($data,$p,$n); $p += $n; + $p += 4; + } + elseif($type=='IEND') { break; } + else if (preg_match('/[a-zA-Z]{4}/',$type)) { $p += $n+4; } + else { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data'); } + } + while($n); + if (!$pngdata) { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data - no IDAT data found'); } + if($colspace=='Indexed' and empty($pal)) { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data - missing colour palette'); } + $info = array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$pngdata); + $info['type']='png'; + if ($ppUx) { $info['set-dpi'] = $ppUx; } + } + + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing or converting PNG image'); } + + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + + // GIF + else if ($type == 'gif') { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (isset($gd['GIF Read Support']) && $gd['GIF Read Support']) { + $im = @imagecreatefromstring($data); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + if (!is_writable($tempfile)) { + ob_start(); + $check = @imagepng($im); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse GIF image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse GIF image'); } + imagedestroy($im); + } + else { + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse GIF image'); } + $info = $this->_getImage($tempfile, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse GIF image'); } + imagedestroy($im); + unlink($tempfile); + } + $info['type']='gif'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { return $this->_imageError($file, $firsttime, 'Error creating GD image file from GIF image'); } + } + + if (!class_exists('gif', false)) { + include_once(_MPDF_PATH.'classes/gif.php'); + } + $gif=new CGIF(); + + $h=0; + $w=0; + $gif->loadFile($data, 0); + + if(isset($gif->m_img->m_gih->m_bLocalClr) && $gif->m_img->m_gih->m_bLocalClr) { + $nColors = $gif->m_img->m_gih->m_nTableSize; + $pal = $gif->m_img->m_gih->m_colorTable->toString(); + if($bgColor != -1) { + $bgColor = $gif->m_img->m_gih->m_colorTable->colorIndex($bgColor); + } + $colspace='Indexed'; + } elseif(isset($gif->m_gfh->m_bGlobalClr) && $gif->m_gfh->m_bGlobalClr) { + $nColors = $gif->m_gfh->m_nTableSize; + $pal = $gif->m_gfh->m_colorTable->toString(); + if((isset($bgColor)) and $bgColor != -1) { + $bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor); + } + $colspace='Indexed'; + } else { + $nColors = 0; + $bgColor = -1; + $colspace='DeviceGray'; + $pal=''; + } + + $trns=''; + if(isset($gif->m_img->m_bTrans) && $gif->m_img->m_bTrans && ($nColors > 0)) { + $trns=array($gif->m_img->m_nTrans); + } + $gifdata=$gif->m_img->m_data; + $w=$gif->m_gfh->m_nWidth; + $h=$gif->m_gfh->m_nHeight; + $gif->ClearData(); + + if($colspace=='Indexed' and empty($pal)) { + return $this->_imageError($file, $firsttime, 'Error parsing GIF image - missing colour palette'); + } + if ($this->compress) { + $gifdata=gzcompress($gifdata); + $info = array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'f'=>'FlateDecode', 'pal'=>$pal, 'trns'=>$trns, 'data'=>$gifdata); + } + else { + $info = array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$gifdata); + } + $info['type']='gif'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + +/*-- IMAGES-BMP --*/ + // BMP (Windows Bitmap) + else if ($type == 'bmp') { + if (!class_exists('bmp', false)) { include(_MPDF_PATH.'classes/bmp.php'); } + if (empty($this->bmp)) { $this->bmp = new bmp($this); } + $info = $this->bmp->_getBMPimage($data, $file); + if (isset($info['error'])) { + return $this->_imageError($file, $firsttime, $info['error']); + } + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } +/*-- END IMAGES-BMP --*/ +/*-- IMAGES-WMF --*/ + // WMF + else if ($type == 'wmf') { + if (!class_exists('wmf', false)) { include(_MPDF_PATH.'classes/wmf.php'); } + if (empty($this->wmf)) { $this->wmf = new wmf($this); } + $wmfres = $this->wmf->_getWMFimage($data); + if ($wmfres[0]==0) { + if ($wmfres[1]) { return $this->_imageError($file, $firsttime, $wmfres[1]); } + return $this->_imageError($file, $firsttime, 'Error parsing WMF image'); + } + $info = array('x'=>$wmfres[2][0],'y'=>$wmfres[2][1],'w'=>$wmfres[3][0],'h'=>$wmfres[3][1],'data'=>$wmfres[1]); + $info['i']=count($this->formobjects)+1; + $info['type']='wmf'; + $this->formobjects[$file]=$info; + return $info; + } +/*-- END IMAGES-WMF --*/ + + // UNKNOWN TYPE - try GD imagecreatefromstring + else { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (isset($gd['PNG Support']) && $gd['PNG Support']) { + $im = @imagecreatefromstring($data); + if (!$im) { return $this->_imageError($file, $firsttime, 'Error parsing image file - image type not recognised, and not supported by GD imagecreate'); } + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse unknown image type'); } + $info = $this->_getImage($tempfile, false); + imagedestroy($im); + unlink($tempfile); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse unknown image type'); } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + } + + return $this->_imageError($file, $firsttime, 'Error parsing image file - image type not recognised'); +} +//============================================================== +function _convImage(&$data, $colspace, $targetcs, $w, $h, $dpi, $mask) { + if ($this->PDFA || $this->PDFX) { $mask=false; } + $im = @imagecreatefromstring($data); + $info = array(); + if ($im) { + $imgdata = ''; + $mimgdata = ''; + $minfo = array(); + //Read transparency info + $trns=array(); + $trnsrgb = false; + if (!$this->PDFA && !$this->PDFX) { + $p = strpos($data,'tRNS'); + if ($p) { + $n=$this->_fourbytes2int(substr($data,($p-4),4)); + $t = substr($data,($p+4),$n); + if ($colspace=='DeviceGray') { + $trns=array(ord(substr($t,1,1))); + $trnsrgb = array($trns[0],$trns[0],$trns[0]); + } + else if ($colspace=='DeviceRGB') { + $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); + $trnsrgb = $trns; + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$trns[0],$trns[1],$trns[2])); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + $trns = array($c1,$c2,$c3,$c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($trns[0] * .21) + ($trns[1] * .71) + ($trns[2] * .07)); + $trns = array($c); + } + } + else { // Indexed + $pos = strpos($t,chr(0)); + if (is_int($pos)) { + $pal = imagecolorsforindex($im, $pos); + $r = $pal['red']; + $g = $pal['green']; + $b = $pal['blue']; + $trns=array($r,$g,$b); // **** + $trnsrgb = $trns; + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$r,$g,$b)); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + $trns = array($c1,$c2,$c3,$c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($r * .21) + ($g * .71) + ($b * .07)); + $trns = array($c); + } + } + } + } + } + for ($i = 0; $i < $h; $i++) { + for ($j = 0; $j < $w; $j++) { + $rgb = imagecolorat($im, $j, $i); + $r = ($rgb >> 16) & 0xFF; + $g = ($rgb >> 8) & 0xFF; + $b = $rgb & 0xFF; + if ($colspace=='Indexed') { + $pal = imagecolorsforindex($im, $rgb); + $r = $pal['red']; + $g = $pal['green']; + $b = $pal['blue']; + } + + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$r,$g,$b)); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + if ($trnsrgb) { + // original pixel was not set as transparent but processed color does match + if ($trnsrgb!=array($r,$g,$b) && $trns==array($c1,$c2,$c3,$c4)) { + if ($c4==0) { $c4=1; } else { $c4--; } + } + } + $imgdata .= chr($c1).chr($c2).chr($c3).chr($c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($r * .21) + ($g * .71) + ($b * .07)); + if ($trnsrgb) { + // original pixel was not set as transparent but processed color does match + if ($trnsrgb!=array($r,$g,$b) && $trns==array($c)) { + if ($c==0) { $c=1; } else { $c--; } + } + } + $imgdata .= chr($c); + } + else if ($targetcs=='DeviceRGB') { + $imgdata .= chr($r).chr($g).chr($b); + } + if ($mask) { + $col = imagecolorsforindex($im, $rgb); + $gammacorr = 2.2; // gamma correction + $gamma = intval((pow((((127 - $col['alpha']) * 255 / 127) / 255), $gammacorr) * 255)); + $mimgdata .= chr($gamma); + } + } + } + + if ($targetcs=='DeviceGray') { $ncols = 1; } + else if ($targetcs=='DeviceRGB') { $ncols = 3; } + else if ($targetcs=='DeviceCMYK') { $ncols = 4; } + + $imgdata = gzcompress($imgdata); + $info = array('w'=>$w,'h'=>$h,'cs'=>$targetcs,'bpc'=>8,'f'=>'FlateDecode','data'=>$imgdata, 'type'=>'png', + 'parms'=>'/DecodeParms <>'); + if ($dpi) { $info['set-dpi'] = $dpi; } + if ($mask) { + $mimgdata = gzcompress($mimgdata); + $minfo = array('w'=>$w,'h'=>$h,'cs'=>'DeviceGray','bpc'=>8,'f'=>'FlateDecode','data'=>$mimgdata, 'type'=>'png', + 'parms'=>'/DecodeParms <>'); + if ($dpi) { $minfo['set-dpi'] = $dpi; } + $tempfile = '_tempImgPNG'.RAND(1,10000).'.png'; + $imgmask = count($this->images)+1; + $minfo['i']=$imgmask ; + $this->images[$tempfile] = $minfo; + $info['masked'] = $imgmask; + } + else if ($trns) { $info['trns'] = $trns; } + imagedestroy($im); + } + return $info; +} + + + + +function _fourbytes2int($s) { + //Read a 4-byte integer from string + return (ord($s[0])<<24) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); +} + +function _twobytes2int($s) { + //Read a 2-byte integer from string + return (ord(substr($s, 0, 1))<<8) + ord(substr($s, 1, 1)); +} + +function _jpgHeaderFromString(&$data) { + $p = 4; + $p += $this->_twobytes2int(substr($data, $p, 2)); // Length of initial marker block + $marker = substr($data, $p, 2); + while($marker != chr(255).chr(192) && $marker != chr(255).chr(194) && $p_twobytes2int(substr($data, $p+2, 2))) + 2; // Length of marker block + $marker = substr($data, $p, 2); + } + if ($marker != chr(255).chr(192) && $marker != chr(255).chr(194)) { return false; } + return substr($data, $p+2, 10); +} + +function _jpgDataFromHeader($hdr) { + $bpc = ord(substr($hdr, 2, 1)); + if (!$bpc) { $bpc = 8; } + $h = $this->_twobytes2int(substr($hdr, 3, 2)); + $w = $this->_twobytes2int(substr($hdr, 5, 2)); + $channels = ord(substr($hdr, 7, 1)); + if ($channels==3) { $colspace='DeviceRGB'; } + elseif($channels==4) { $colspace='DeviceCMYK'; } + else { $colspace='DeviceGray'; } + return array($w, $h, $colspace, $bpc); +} + +function file_get_contents_by_curl($url, &$data) { + $timeout = 5; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_NOBODY, 0); + curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ); + curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $timeout ); + $data = curl_exec($ch); + curl_close($ch); +} + + +function file_get_contents_by_socket($url, &$data) { + $timeout = 1; + $p = parse_url($url); + $file = $p['path']; + if ($p['query']) { $file .= '?'.$p['query']; } + if(!($fh = @fsockopen($p['host'], 80, $errno, $errstr, $timeout))) { return false; } + $getstring = + "GET ".$file." HTTP/1.0 \r\n" . + "Host: ".$p['host']." \r\n" . + "Connection: close\r\n\r\n"; + fwrite($fh, $getstring); + // Get rid of HTTP header + $s = fgets($fh, 1024); + if (!$s) { return false; } + $httpheader .= $s; + while (!feof($fh)) { + $s = fgets($fh, 1024); + if ( $s == "\r\n" ) { break; } + } + $data = ''; + while (!feof($fh)) { + $data .= fgets($fh, 1024); + } + fclose($fh); +} + +//============================================================== + +function _imageTypeFromString(&$data) { + $type = ''; + if (substr($data, 6, 4)== 'JFIF' || substr($data, 6, 4)== 'Exif') { + $type = 'jpeg'; + } + else if (substr($data, 0, 6)== "GIF87a" || substr($data, 0, 6)== "GIF89a") { + $type = 'gif'; + } + else if (substr($data, 0, 8)== chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { + $type = 'png'; + } +/*-- IMAGES-WMF --*/ + else if (substr($data, 0, 4)== chr(215).chr(205).chr(198).chr(154)) { + $type = 'wmf'; + } +/*-- END IMAGES-WMF --*/ + else if (preg_match('//is',$data)) { + $type = 'svg'; + } + // BMP images + else if (substr($data, 0, 2)== "BM") { + $type = 'bmp'; + } + return $type; +} +//============================================================== + +// Moved outside WMF as also needed for SVG +function _putformobjects() { + reset($this->formobjects); + while(list($file,$info)=each($this->formobjects)) { + $this->_newobj(); + $this->formobjects[$file]['n']=$this->n; + $this->_out('<_out('/Subtype /Form'); + $this->_out('/Group '.($this->n+1).' 0 R'); + $this->_out('/BBox ['.$info['x'].' '.$info['y'].' '.($info['w']+$info['x']).' '.($info['h']+$info['y']).']'); + if ($this->compress) + $this->_out('/Filter /FlateDecode'); + $data=($this->compress) ? gzcompress($info['data']) : $info['data']; + $this->_out('/Length '.strlen($data).'>>'); + $this->_putstream($data); + unset($this->formobjects[$file]['data']); + $this->_out('endobj'); + // Required for SVG transparency (opacity) to work + $this->_newobj(); + $this->_out('<_out('/S /Transparency'); + $this->_out('>>'); + $this->_out('endobj'); + } +} + +function _freadint($f) +{ + //Read a 4-byte integer from file + $i=ord(fread($f,1))<<24; + $i+=ord(fread($f,1))<<16; + $i+=ord(fread($f,1))<<8; + $i+=ord(fread($f,1)); + return $i; +} + +function _UTF16BEtextstring($s) { + $s = $this->UTF8ToUTF16BE($s, true); +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + return '('. $this->_escape($s).')'; +} + +function _textstring($s) { +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + return '('. $this->_escape($s).')'; +} + + +function _escape($s) +{ + // the chr(13) substitution fixes the Bugs item #1421290. + return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); +} + +function _putstream($s) { +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + + +function _out($s,$ln=true) { + if($this->state==2) { + if ($this->bufferoutput) { + $this->headerbuffer.= $s."\n"; + } +/*-- COLUMNS --*/ + else if (($this->ColActive) && !$this->processingHeader && !$this->processingFooter) { + // Captures everything in buffer for columns; Almost everything is sent from fn. Cell() except: + // Images sent from Image() or + // later sent as _out($textto) in printbuffer + // Line() + if (preg_match('/q \d+\.\d\d+ 0 0 (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ cm \/(I|FO)\d+ Do Q/',$s,$m)) { // Image data + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for a column + $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$h; + } +/*-- TABLES --*/ + else if (preg_match('/\d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ ([\-]{0,1}\d+\.\d\d+) re/',$s,$m) && $this->tableLevel>0) { // Rect in table + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for a column + $this->ColDetails[$this->CurrCol]['bottom_margin'] = max($this->ColDetails[$this->CurrCol]['bottom_margin'],($this->y+$h)); + } +/*-- END TABLES --*/ + else { // Td Text Set in Cell() + if (isset($this->ColDetails[$this->CurrCol]['bottom_margin'])) { $h = $this->ColDetails[$this->CurrCol]['bottom_margin'] - $this->y; } + else { $h = 0; } + } + if ($h < 0) { $h = -$h; } + $this->columnbuffer[] = array( + 's' => $s, // Text string to output + 'col' => $this->CurrCol, // Column when printed + 'x' => $this->x, // x when printed + 'y' => $this->y, // this->y when printed (after column break) + 'h' => $h // actual y at bottom when printed = y+h + ); + } +/*-- END COLUMNS --*/ +/*-- TABLES --*/ + else if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { + // Captures eveything in buffer for rotated tables; + $this->tablebuffer .= $s . "\n"; + } +/*-- END TABLES --*/ + else if ($this->kwt && !$this->processingHeader && !$this->processingFooter) { + // Captures eveything in buffer for keep-with-table (h1-6); + $this->kwt_buffer[] = array( + 's' => $s, // Text string to output + 'x' => $this->x, // x when printed + 'y' => $this->y, // y when printed + ); + } + else if (($this->keep_block_together) && !$this->processingHeader && !$this->processingFooter) { + if (!isset($this->ktBlock[$this->page]['bottom_margin'])) { + $this->ktBlock[$this->page]['bottom_margin'] = $this->y; + } + + // Captures eveything in buffer; + if (preg_match('/q \d+\.\d\d+ 0 0 (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ cm \/(I|FO)\d+ Do Q/',$s,$m)) { // Image data + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for Keep together block + $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$h; + } + else { // Td Text Set in Cell() + if (isset($this->ktBlock[$this->page]['bottom_margin'])) { $h = $this->ktBlock[$this->page]['bottom_margin'] - $this->y; } + else { $h = 0; } + } + if ($h < 0) { $h = -$h; } + $this->divbuffer[] = array( + 'page' => $this->page, + 's' => $s, // Text string to output + 'x' => $this->x, // x when printed + 'y' => $this->y, // y when printed (after column break) + 'h' => $h // actual y at bottom when printed = y+h + ); + } + else { + $this->pages[$this->page] .= $s.($ln == true ? "\n" : ''); + } + + } + else { + $this->buffer .= $s.($ln == true ? "\n" : ''); + } +} + +/*-- WATERMARK --*/ +// add a watermark +function watermark( $texte, $angle=45, $fontsize=96, $alpha=0.2 ) { + if ($this->PDFA || $this->PDFX) { $this->Error('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } + if (!$this->watermark_font) { $this->watermark_font = $this->default_font; } + $this->SetFont( $this->watermark_font, "B", $fontsize, false ); // Don't output + $texte= $this->purify_utf8_text($texte); + if ($this->text_input_as_HTML) { + $texte= $this->all_entities_to_utf8($texte); + } + if ($this->usingCoreFont) { $texte = mb_convert_encoding($texte,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + $this->magic_reverse_dir($texte, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($texte); // *INDIC* + + $this->SetAlpha($alpha); + + $this->SetTColor($this->ConvertColor(0)); + $szfont = $fontsize; + $loop = 0; + $maxlen = (min($this->w,$this->h) ); // sets max length of text as 7/8 width/height of page + while ( $loop == 0 ) + { + $this->SetFont( $this->watermark_font, "B", $szfont, false ); // Don't output + $offset = ((sin(deg2rad($angle))) * ($szfont/_MPDFK)); + + $strlen = $this->GetStringWidth($texte); + if ( $strlen > $maxlen - $offset ) + $szfont --; + else + $loop ++; + } + + $this->SetFont( $this->watermark_font, "B", $szfont-0.1, true, true); // Output The -0.1 is because SetFont above is not written to PDF + // Repeating it will not output anything as mPDF thinks it is set + $adj = ((cos(deg2rad($angle))) * ($strlen/2)); + $opp = ((sin(deg2rad($angle))) * ($strlen/2)); + $wx = ($this->w/2) - $adj + $offset/3; + $wy = ($this->h/2) + $opp; + $this->Rotate($angle,$wx,$wy); + $this->Text($wx,$wy,$texte); + $this->Rotate(0); + $this->SetTColor($this->ConvertColor(0)); + + $this->SetAlpha(1); + +} + +function watermarkImg( $src, $alpha=0.2 ) { + if ($this->PDFA || $this->PDFX) { $this->Error('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } + if ($this->watermarkImgBehind) { $this->watermarkImgAlpha = $this->SetAlpha($alpha, 'Normal', true); } + else { $this->SetAlpha($alpha, $this->watermarkImgAlphaBlend); } + $this->Image($src,0,0,0,0,'','', true, true, true); + if (!$this->watermarkImgBehind) { $this->SetAlpha(1); } +} +/*-- END WATERMARK --*/ + + +function Rotate($angle,$x=-1,$y=-1) +{ + if($x==-1) + $x=$this->x; + if($y==-1) + $y=$this->y; + if($this->angle!=0) + $this->_out('Q'); + $this->angle=$angle; + if($angle!=0) + { + $angle*=M_PI/180; + $c=cos($angle); + $s=sin($angle); + $cx=$x*_MPDFK; + $cy=($this->h-$y)*_MPDFK; + $this->_out(sprintf('q %.5F %.5F %.5F %.5F %.3F %.3F cm 1 0 0 1 %.3F %.3F cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy)); + } +} + + + +function CircularText($x, $y, $r, $text, $align='top', $fontfamily='', $fontsize=0, $fontstyle='', $kerning=120, $fontwidth=100, $divider) { // mPDF 5.5.23 + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->CircularText($x, $y, $r, $text, $align, $fontfamily, $fontsize, $fontstyle, $kerning, $fontwidth, $divider); // mPDF 5.5.23 +} + + +// From Invoice +function RoundedRect($x, $y, $w, $h, $r, $style = '') +{ + $hp = $this->h; + if($style=='F') + $op='f'; + elseif($style=='FD' or $style=='DF') + $op='B'; + else + $op='S'; + $MyArc = 4/3 * (sqrt(2) - 1); + $this->_out(sprintf('%.3F %.3F m',($x+$r)*_MPDFK,($hp-$y)*_MPDFK )); + $xc = $x+$w-$r ; + $yc = $y+$r; + $this->_out(sprintf('%.3F %.3F l', $xc*_MPDFK,($hp-$y)*_MPDFK )); + + $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc); + $xc = $x+$w-$r ; + $yc = $y+$h-$r; + $this->_out(sprintf('%.3F %.3F l',($x+$w)*_MPDFK,($hp-$yc)*_MPDFK)); + $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r); + $xc = $x+$r ; + $yc = $y+$h-$r; + $this->_out(sprintf('%.3F %.3F l',$xc*_MPDFK,($hp-($y+$h))*_MPDFK)); + $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc); + $xc = $x+$r ; + $yc = $y+$r; + $this->_out(sprintf('%.3F %.3F l',($x)*_MPDFK,($hp-$yc)*_MPDFK )); + $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r); + $this->_out($op); +} + +function _Arc($x1, $y1, $x2, $y2, $x3, $y3) +{ + $h = $this->h; + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x1*_MPDFK, ($h-$y1)*_MPDFK, + $x2*_MPDFK, ($h-$y2)*_MPDFK, $x3*_MPDFK, ($h-$y3)*_MPDFK)); +} + + + + +//==================================================== + + + +/*-- DIRECTW --*/ +function Shaded_box( $text,$font='',$fontstyle='B',$szfont='',$width='70%',$style='DF',$radius=2.5,$fill='#FFFFFF',$color='#000000',$pad=2 ) { + // F (shading - no line),S (line, no shading),DF (both) + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->Shaded_box( $text,$font,$fontstyle,$szfont,$width,$style,$radius,$fill,$color,$pad); +} +/*-- END DIRECTW --*/ + + +function UTF8StringToArray($str, $addSubset=true) { + $out = array(); + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $uni = -1; + $h = ord($str[$i]); + if ( $h <= 0x7F ) + $uni = $h; + elseif ( $h >= 0xC2 ) { + if ( ($h <= 0xDF) && ($i < $len -1) ) + $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xEF) && ($i < $len -2) ) + $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xF4) && ($i < $len -3) ) + $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + } + if ($uni >= 0) { + $out[] = $uni; + if ($addSubset && isset($this->CurrentFont['subset'])) { + $this->CurrentFont['subset'][$uni] = $uni; + } + } + } + return $out; +} + + +//Convert utf-8 string to for Font Subsets +function UTF8toSubset($str) { + $ret = '<'; + $str = preg_replace('/'.preg_quote($this->aliasNbPg,'/').'/', chr(7), $str ); + $str = preg_replace('/'.preg_quote($this->aliasNbPgGp,'/').'/', chr(8), $str ); + $unicode = $this->UTF8StringToArray($str); + $orig_fid = $this->CurrentFont['subsetfontids'][0]; + $last_fid = $this->CurrentFont['subsetfontids'][0]; + foreach($unicode as $c) { + if ($c == 7 || $c == 8) { + if ($orig_fid != $last_fid) { + $ret .= '> Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <'; + $last_fid = $orig_fid; + } + if ($c == 7) { $ret .= $this->aliasNbPgHex; } + else { $ret .= $this->aliasNbPgGpHex; } + continue; + } + for ($i=0; $i<99; $i++) { + // return c as decimal char + $init = array_search($c, $this->CurrentFont['subsets'][$i]); + if ($init!==false) { + if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { + $ret .= '> Tj /F'.$this->CurrentFont['subsetfontids'][$i].' '.$this->FontSizePt.' Tf <'; + $last_fid = $this->CurrentFont['subsetfontids'][$i]; + } + $ret .= sprintf("%02s", strtoupper(dechex($init))); + break; + } + // TrueType embedded SUBSETS + else if (count($this->CurrentFont['subsets'][$i]) < 255) { + $n = count($this->CurrentFont['subsets'][$i]); + $this->CurrentFont['subsets'][$i][$n] = $c; + if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { + $ret .= '> Tj /F'.$this->CurrentFont['subsetfontids'][$i].' '.$this->FontSizePt.' Tf <'; + $last_fid = $this->CurrentFont['subsetfontids'][$i]; + } + $ret .= sprintf("%02s", strtoupper(dechex($n))); + break; + } + else if (!isset($this->CurrentFont['subsets'][($i+1)])) { + // TrueType embedded SUBSETS + $this->CurrentFont['subsets'][($i+1)] = array(0=>0); + $new_fid = count($this->fonts)+$this->extraFontSubsets+1; + $this->CurrentFont['subsetfontids'][($i+1)] = $new_fid; + $this->extraFontSubsets++; + } + } + } + $ret .= '>'; + if ($last_fid != $orig_fid) { + $ret .= ' Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <> '; + } + return $ret; +} + + +// Converts UTF-8 strings to UTF16-BE. +function UTF8ToUTF16BE($str, $setbom=true) { + if ($this->checkSIP && preg_match("/([\x{20000}-\x{2FFFF}])/u", $str)) { + if (!in_array($this->currentfontfamily, array('gb','big5','sjis','uhc','gbB','big5B','sjisB','uhcB','gbI','big5I','sjisI','uhcI', + 'gbBI','big5BI','sjisBI','uhcBI'))) { + $str = preg_replace("/[\x{20000}-\x{2FFFF}]/u", chr(0), $str); + } + } + if ($this->checkSMP && preg_match("/([\x{10000}-\x{1FFFF}])/u", $str )) { + $str = preg_replace("/[\x{10000}-\x{1FFFF}]/u", chr(0), $str ); + } + $outstr = ""; // string to be returned + if ($setbom) { + $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) + } + $outstr .= mb_convert_encoding($str, 'UTF-16BE', 'UTF-8'); + return $outstr; +} + + + + + +// ==================================================== +// ==================================================== +/*-- CJK-FONTS --*/ + +// from class PDF_Chinese CJK EXTENSIONS +function AddCIDFont($family,$style,$name,&$cw,$CMap,$registry,$desc) +{ + $fontkey=strtolower($family).strtoupper($style); + if(isset($this->fonts[$fontkey])) + $this->Error("Font already added: $family $style"); + $i=count($this->fonts)+$this->extraFontSubsets+1; + $name=str_replace(' ','',$name); + if ($family == 'sjis') { $up = -120; } else { $up = -130; } + // ? 'up' and 'ut' do not seem to be referenced anywhere + $this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>$up,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry,'MissingWidth'=>1000,'desc'=>$desc); +} + +function AddCJKFont($family) { + + if ($this->PDFA || $this->PDFX) { + $this->Error("Adobe CJK fonts cannot be embedded in mPDF (required for PDFA1-b and PDFX/1-a)."); + } + if ($family == 'big5') { $this->AddBig5Font(); } + else if ($family == 'gb') { $this->AddGBFont(); } + else if ($family == 'sjis') { $this->AddSJISFont(); } + else if ($family == 'uhc') { $this->AddUHCFont(); } +} + +function AddBig5Font() +{ + //Add Big5 font with proportional Latin + $family='big5'; + $name='MSungStd-Light-Acro'; + $cw=$this->Big5_widths; + $CMap='UniCNS-UTF16-H'; + $registry=array('ordering'=>'CNS1','supplement'=>4); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 880, + 'Flags' => 6, + 'FontBBox' => '[-160 -249 1015 1071]', + 'ItalicAngle' => 0, + 'StemV' => 93, + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + + +function AddGBFont() +{ + //Add GB font with proportional Latin + $family='gb'; + $name='STSongStd-Light-Acro'; + $cw=$this->GB_widths; + $CMap='UniGB-UTF16-H'; + $registry=array('ordering'=>'GB1','supplement'=>4); + $desc = array( + 'Ascent' => 752, + 'Descent' => -271, + 'CapHeight' => 737, + 'Flags' => 6, + 'FontBBox' => '[-25 -254 1000 880]', + 'ItalicAngle' => 0, + 'StemV' => 58, + 'Style' => '<< /Panose <000000000400000000000000> >>', + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + + +function AddSJISFont() +{ + //Add SJIS font with proportional Latin + $family='sjis'; + $name='KozMinPro-Regular-Acro'; + $cw=$this->SJIS_widths; + $CMap='UniJIS-UTF16-H'; + $registry=array('ordering'=>'Japan1','supplement'=>5); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 740, + 'Flags' => 6, + 'FontBBox' => '[-195 -272 1110 1075]', + 'ItalicAngle' => 0, + 'StemV' => 86, + 'XHeight' => 502, + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + +function AddUHCFont() +{ + //Add UHC font with proportional Latin + $family='uhc'; + $name='HYSMyeongJoStd-Medium-Acro'; + $cw=$this->UHC_widths; + $CMap='UniKS-UTF16-H'; + $registry=array('ordering'=>'Korea1','supplement'=>2); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 720, + 'Flags' => 6, + 'FontBBox' => '[-28 -148 1001 880]', + 'ItalicAngle' => 0, + 'StemV' => 60, + 'Style' => '<< /Panose <000000000600000000000000> >>', + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + +/*-- END CJK-FONTS --*/ + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +function SetAutoFont($af = AUTOFONT_ALL) { + if ($this->onlyCoreFonts) { return false; } + if (!$af && $af !== 0) { $af = AUTOFONT_ALL; } + $this->autoFontGroups = $af; + if ($this->autoFontGroups ) { + $this->useLang = true; + } +} + + +function SetDefaultFont($font) { + // Disallow embedded fonts to be used as defaults in PDFA + if ($this->PDFA || $this->PDFX) { + if (strtolower($font) == 'ctimes') { $font = 'serif'; } + if (strtolower($font) == 'ccourier') { $font = 'monospace'; } + if (strtolower($font) == 'chelvetica') { $font = 'sans-serif'; } + } + $font = $this->SetFont($font); // returns substituted font if necessary + $this->default_font = $font; + $this->original_default_font = $font; + if (!$this->watermark_font ) { $this->watermark_font = $font; } // *WATERMARK* + $this->defaultCSS['BODY']['FONT-FAMILY'] = $font; + $this->cssmgr->CSS['BODY']['FONT-FAMILY'] = $font; +} + +function SetDefaultFontSize($fontsize) { + $this->default_font_size = $fontsize; + $this->original_default_font_size = $fontsize; + $this->SetFontSize($fontsize); + $this->defaultCSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; + $this->cssmgr->CSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; +} + +function SetDefaultBodyCSS($prop, $val) { + if ($prop) { + $this->defaultCSS['BODY'][strtoupper($prop)] = $val; + $this->cssmgr->CSS['BODY'][strtoupper($prop)] = $val; + } +} + + +function SetDirectionality($dir='ltr') { +/*-- RTL --*/ + if (strtolower($dir) == 'rtl') { + if ($this->directionality != 'rtl') { + // Swop L/R Margins so page 1 RTL is an 'even' page + $tmp = $this->DeflMargin; + $this->DeflMargin = $this->DefrMargin; + $this->DefrMargin = $tmp; + $this->orig_lMargin = $this->DeflMargin; + $this->orig_rMargin = $this->DefrMargin; + + $this->SetMargins($this->DeflMargin,$this->DefrMargin,$this->tMargin); + } + $this->directionality = 'rtl'; + $this->defaultAlign = 'R'; + $this->defaultTableAlign = 'R'; + } + else { +/*-- END RTL --*/ + $this->directionality = 'ltr'; + $this->defaultAlign = 'L'; + $this->defaultTableAlign = 'L'; + } // *RTL* + $this->cssmgr->CSS['BODY']['DIRECTION'] = $this->directionality; +} + + + +// Added to set line-height-correction +function SetLineHeightCorrection($val) { + if ($val > 0) { $this->default_lineheight_correction = $val; } + else { $this->default_lineheight_correction = 1.2; } +} + +// Set a (fixed) lineheight to an actual value - either to named fontsize(pts) or default +function SetLineHeight($FontPt='',$spacing = '') { + if ($this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + if ($spacing > 0) { + if (preg_match('/mm/',$spacing)) { + $this->lineheight = ($spacing + 0.0) / $k; // convert to number + } + else { + if ($FontPt) { $this->lineheight = (($FontPt/_MPDFK) *$spacing); } + else { $this->lineheight = (($this->FontSizePt/_MPDFK) *$spacing); } + } + } + else { + if ($FontPt) { $this->lineheight = (($FontPt/_MPDFK) *$this->normalLineheight); } + else { $this->lineheight = (($this->FontSizePt/_MPDFK) *$this->normalLineheight); } + } +} + +function _computeLineheight($lh, $fs='') { + if ($this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + if (!$fs) { $fs = $this->FontSize; } + if (preg_match('/mm/',$lh)) { + return (($lh + 0.0) / $k); // convert to number + } + else if ($lh > 0) { + return ($fs * $lh); + } + else if (isset($this->normalLineheight)) { return ($fs * $this->normalLineheight); } + else return ($fs * $this->default_lineheight_correction); +} + + +function SetBasePath($str='') { + if ( isset($_SERVER['HTTP_HOST']) ) { $host = $_SERVER['HTTP_HOST']; } + else if ( isset($_SERVER['SERVER_NAME']) ) { $host = $_SERVER['SERVER_NAME']; } + else { $host = ''; } + if (!$str) { + if ($_SERVER['SCRIPT_NAME']) { $currentPath = dirname($_SERVER['SCRIPT_NAME']); } + else { $currentPath = dirname($_SERVER['PHP_SELF']); } + $currentPath = str_replace("\\","/",$currentPath); + if ($currentPath == '/') { $currentPath = ''; } + if ($host) { $currpath = 'http://' . $host . $currentPath .'/'; } + else { $currpath = ''; } + $this->basepath = $currpath; + $this->basepathIsLocal = true; + return; + } + $str = preg_replace('/\?.*/','',$str); + if (!preg_match('/(http|https|ftp):\/\/.*\//i',$str)) { $str .= '/'; } + $str .= 'xxx'; // in case $str ends in / e.g. http://www.bbc.co.uk/ + $this->basepath = dirname($str) . "/"; // returns e.g. e.g. http://www.google.com/dir1/dir2/dir3/ + $this->basepath = str_replace("\\","/",$this->basepath); //If on Windows + $tr = parse_url($this->basepath); + if (isset($tr['host']) && ($tr['host'] == $host)) { $this->basepathIsLocal = true; } + else { $this->basepathIsLocal = false; } +} + + +function GetFullPath(&$path,$basepath='') { + // When parsing CSS need to pass temporary basepath - so links are relative to current stylesheet + if (!$basepath) { $basepath = $this->basepath; } + //Fix path value + $path = str_replace("\\","/",$path); //If on Windows + $path = preg_replace('/^\/\//','http://',$path); // mPDF 5.6.27 + $regexp = '|^./|'; // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" + $path = preg_replace($regexp,'',$path); + + + if(substr($path,0,1) == '#') { return; } + if (stristr($path,"mailto:") !== false) { return; } + if (strpos($path,"../") !== false ) { //It is a Relative Link + $backtrackamount = substr_count($path,"../"); + $maxbacktrack = substr_count($basepath,"/") - 3; // mPDF 5.6.18 + $filepath = str_replace("../",'',$path); + $path = $basepath; + //If it is an invalid relative link, then make it go to directory root + if ($backtrackamount > $maxbacktrack) $backtrackamount = $maxbacktrack; + //Backtrack some directories + for( $i = 0 ; $i < $backtrackamount + 1 ; $i++ ) $path = substr( $path, 0 , strrpos($path,"/") ); + $path = $path . "/" . $filepath; //Make it an absolute path + } + else if( strpos($path,":/") === false || strpos($path,":/") > 10) { //It is a Local Link + if (substr($path,0,1) == "/") { + $tr = parse_url($basepath); + $root = $tr['scheme'].'://'.$tr['host']; + $path = $root . $path; + } + else { $path = $basepath . $path; } + } + //Do nothing if it is an Absolute Link +} + + +// Used for external CSS files +function _get_file($path) { + // If local file try using local path (? quicker, but also allowed even if allow_url_fopen false) + $contents = ''; + $contents = @file_get_contents($path); + if ($contents) { return $contents; } + if ($this->basepathIsLocal) { + $tr = parse_url($path); + $lp=getenv("SCRIPT_NAME"); + $ap=realpath($lp); + $ap=str_replace("\\","/",$ap); + $docroot=substr($ap,0,strpos($ap,$lp)); + // WriteHTML parses all paths to full URLs; may be local file name + if ($tr['scheme'] && $tr['host'] && $_SERVER["DOCUMENT_ROOT"] ) { + $localpath = $_SERVER["DOCUMENT_ROOT"] . $tr['path']; + } + // DOCUMENT_ROOT is not returned on IIS + else if ($docroot) { + $localpath = $docroot . $tr['path']; + } + else { $localpath = $path; } + $contents = @file_get_contents($localpath); + } + // if not use full URL + else if (!$contents && !ini_get('allow_url_fopen') && function_exists("curl_init")) { + $ch = curl_init($path); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ); + $contents = curl_exec($ch); + curl_close($ch); + } + return $contents; +} + + +function docPageNum($num = 0, $extras = false) { + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgno = $num; + $suppress = 0; + $offset = 0; + $lastreset = 0; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgno = $num - $psarr['from'] + 1 + $offset; + $lastreset = $psarr['from']; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + } + if ($suppress) { return ''; } + + foreach($this->pgsIns AS $k=>$v) { + if ($k>$lastreset && $k<$num) { + $ppgno -= $v; + } + } + if ($type=='A') { $ppgno = $this->dec2alpha($ppgno,true); } + else if ($type=='a') { $ppgno = $this->dec2alpha($ppgno,false);} + else if ($type=='I') { $ppgno = $this->dec2roman($ppgno,true); } + else if ($type=='i') { $ppgno = $this->dec2roman($ppgno,false); } + if ($extras) { $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; } + return $ppgno; +} + + +function docPageSettings($num = 0) { + // Returns current type (numberstyle), suppression state for this page number; + // reset is only returned if set for this page number + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgno = $num; + $suppress = 0; + $offset = 0; + $reset = ''; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgno = $num - $psarr['from'] + 1 + $offset; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + if ($num == $psarr['from']) { $reset = $psarr['reset']; } + } + if ($suppress) { $suppress = 'on'; } + else { $suppress = 'off'; } + return array($type, $suppress, $reset); +} + +function docPageNumTotal($num = 0, $extras = false) { + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgstart = 1; + $ppgend = count($this->pages)+1; + $suppress = 0; + $offset = 0; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgstart = $psarr['from'] + $offset; + $ppgend = count($this->pages)+1 + $offset; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + if ($num < $psarr['from']) { + if ($psarr['reset']) { + $ppgend = $psarr['from'] + $offset; + break; + } + } + } + if ($suppress) { return ''; } + $ppgno = $ppgend-$ppgstart+$offset; + + // mPDF 5.6.47 + foreach($this->pgsIns AS $k => $v) { + if ($k>$ppgstart && $k<$ppgend) { + $ppgno -= $v; + } + } + + if ($extras) { $ppgno = $this->nbpgPrefix . $ppgno . $this->nbpgSuffix; } + return $ppgno; +} + +function RestartDocTemplate() { + $this->docTemplateStart = $this->page; +} + + + +//Page header +function Header($content='') { + + $this->cMarginL = 0; + $this->cMarginR = 0; + + +/*-- HTMLHEADERS-FOOTERS --*/ + if (($this->mirrorMargins && ($this->page%2==0) && $this->HTMLHeaderE) || ($this->mirrorMargins && ($this->page%2==1) && $this->HTMLHeader) || (!$this->mirrorMargins && $this->HTMLHeader)) { + $this->writeHTMLHeaders(); + return; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + $this->processingHeader=true; + $h = $this->headerDetails; + if(count($h)) { + + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out(sprintf('q 0 -1 1 0 0 %.3F cm ',($this->h*_MPDFK))); + $yadj = $this->w - $this->h; + $headerpgwidth = $this->h - $this->orig_lMargin - $this->orig_rMargin; + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $headerlmargin = $this->orig_rMargin; + } + else { + $headerlmargin = $this->orig_lMargin; + } + } + else { + $yadj = 0; + $headerpgwidth = $this->pgwidth; + $headerlmargin = $this->lMargin; + } + + $this->y = $this->margin_header - $yadj ; + $this->SetTColor($this->ConvertColor(0)); + $this->SUP = false; + $this->SUB = false; + $this->bullet = false; + + // only show pagenumber if numbering on + $pgno = $this->docPageNum($this->page, true); + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $side = 'even'; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS = DEFAULT + $side = 'odd'; + } + $maxfontheight = 0; + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + } + } + // LEFT-CENTER-RIGHT + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + $hd = str_replace('{PAGENO}',$pgno,$h[$side][$pos]['content']); + $hd = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->aliasNbPgGp.$this->nbpgSuffix,$hd); + $hd = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$hd); + if (isset($h[$side][$pos]['font-family']) && $h[$side][$pos]['font-family']) { $hff = $h[$side][$pos]['font-family']; } + else { $hff = $this->original_default_font; } + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->original_default_font_size; } // pts + $maxfontheight = max($maxfontheight,$hfsz); + $hfst = ''; + if (isset($h[$side][$pos]['font-style']) && $h[$side][$pos]['font-style']) { + $hfst = $h[$side][$pos]['font-style']; + } + if (isset($h[$side][$pos]['color']) && $h[$side][$pos]['color']) { + $hfcol = $h[$side][$pos]['color']; + $cor = $this->ConvertColor($hfcol); + if ($cor) { $this->SetTColor($cor); } + } + else { $hfcol = ''; } + $this->SetFont($hff,$hfst,$hfsz,true,true); + $this->x = $headerlmargin ; + $this->y = $this->margin_header - $yadj ; + + $hd = $this->purify_utf8_text($hd); + if ($this->text_input_as_HTML) { + $hd = $this->all_entities_to_utf8($hd); + } + // CONVERT CODEPAGE + if ($this->usingCoreFont) { $hd = mb_convert_encoding($hd,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY RTL + $this->magic_reverse_dir($hd, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($hd); // *INDIC* + $align = $pos; +/*-- RTL --*/ + if ($this->directionality == 'rtl') { + if ($pos == 'L') { $align = 'R'; } + else if ($pos == 'R') { $align = 'L'; } + } +/*-- END RTL --*/ + if ($pos!='L' && (strpos($hd,$this->aliasNbPg)!==false || strpos($hd,$this->aliasNbPgGp)!==false)) { + if (strpos($hd,$this->aliasNbPgGp)!==false) { $type= 'nbpggp'; } else { $type= 'nbpg'; } + $this->_out('{mpdfheader'.$type.' '.$pos.' ff='.$hff.' fs='.$hfst.' fz='.$hfsz.'}'); + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + $this->_out('Q'); + } + else { + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + } + if ($hfcol) { $this->SetTColor($this->ConvertColor(0)); } + } + } + //Return Font to normal + $this->SetFont($this->default_font,'',$this->original_default_font_size); + // LINE + if (isset($h[$side]['line']) && $h[$side]['line']) { + $this->SetLineWidth(0.1); + $this->SetDColor($this->ConvertColor(0)); + $this->Line($headerlmargin , $this->margin_header + ($maxfontheight*(1+$this->header_line_spacing)/_MPDFK) - $yadj , $headerlmargin + $headerpgwidth, $this->margin_header + ($maxfontheight*(1+$this->header_line_spacing)/_MPDFK) - $yadj ); + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out('Q'); + } + } + $this->SetY($this->tMargin); + if ($this->ColActive) { $this->pgwidth = $this->ColWidth; } // *COLUMNS* + + $this->processingHeader=false; +} + + + +/*-- TABLES --*/ +function TableHeaderFooter($content='',$tablestartpage='',$tablestartcolumn ='',$horf = 'H',$level, $firstSpread=true, $finalSpread=true) { + if(($horf=='H' || $horf=='F') && !empty($content) && !empty($content[0])) { // mPDF 5.6.61 + $table = &$this->table[1][1]; + // Advance down page by half width of top border + + if ($horf=='H') { // Only if header + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2 + $table['border_details']['T']['w'] + $table['padding']['T']; } + else { $adv = $table['max_cell_border_width']['T'] /2 ; } + if ($adv) { + if ($this->table_rotate) { + $this->y += ($adv); + } + else { + $this->DivLn($adv,$this->blklvl,true); + } + } + } + + if ($horf=='F') { // Table Footer + $firstrow = count($table['cells']) - $table['footernrows']; + $lastrow = count($table['cells']) - 1; + } + else { // Table Header + $firstrow = 0; + $lastrow = $table['headernrows'] - 1; + } + + $topy = $content[$firstrow][0]['y']-$this->y; + + for ($i=$firstrow ; $i<=$lastrow; $i++) { + + $y = $this->y; + +/*-- COLUMNS --*/ + // If outside columns, this is done in PaintDivBB + if ($this->ColActive) { + //OUTER FILL BGCOLOR of DIVS + if ($this->blklvl > 0) { + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl >= $firstblockfill) { + $divh = $content[$i][0]['h']; + $bak_x = $this->x; + $this->DivLn($divh,-3,false); + // Reset current block fill + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + $this->SetFColor($bcor); + $this->x = $bak_x; + } + } + } +/*-- END COLUMNS --*/ + + $colctr = 0; + foreach($content[$i] as $tablehf) { + $colctr++; + $y = $tablehf['y'] - $topy; + $this->y = $y; + //Set some cell values + $x = $tablehf['x']; + if (($this->mirrorMargins) && ($tablestartpage == 'ODD') && (($this->page)%2==0)) { // EVEN + $x = $x +$this->MarginCorrection; + } + else if (($this->mirrorMargins) && ($tablestartpage == 'EVEN') && (($this->page)%2==1)) { // ODD + $x = $x +$this->MarginCorrection; + } +/*-- COLUMNS --*/ + // Added to correct for Columns + if ($this->ColActive) { + if ($this->directionality == 'rtl') { // *RTL* + $x -= ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $x += ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + } +/*-- END COLUMNS --*/ + + if ($colctr==1) { $x0 = $x; } + + // mPDF ITERATION + if ($this->iterationCounter) { + foreach($tablehf['textbuffer'] AS $k=>$t) { + if (!is_array($t[0]) && preg_match('/{iteration ([a-zA-Z0-9_]+)}/',$t[0], $m)) { // mPDF 5.5.06 + $vname = '__'.$m[1].'_'; + if (!isset($this->$vname)) { $this->$vname = 1; } + else { $this->$vname++; } + $tablehf['textbuffer'][$k][0] = preg_replace('/{iteration '.$m[1].'}/', $this->$vname, $tablehf['textbuffer'][$k][0]); + } + } + } + + + $w = $tablehf['w']; + $h = $tablehf['h']; + $va = $tablehf['va']; + $R = $tablehf['R']; + $mih = $tablehf['mih']; + $border = $tablehf['border']; + $border_details = $tablehf['border_details']; + $padding = $tablehf['padding']; + $this->tabletheadjustfinished = true; + + $textbuffer = $tablehf['textbuffer']; + + $align = $tablehf['a']; + //Align + $this->divalign=$align; + $this->x = $x; + + if ($this->ColActive) { + if ($table['borders_separate']) { + $tablefill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; + if ($tablefill) { + $color = $this->ConvertColor($tablefill); + if ($color) { + $xadj = ($table['border_spacing_H']/2); + $yadj = ($table['border_spacing_V']/2); + $wadj = $table['border_spacing_H']; + $hadj = $table['border_spacing_V']; + if ($i == $firstrow && $horf=='H') { // Top + $yadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + $hadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + } + if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i+$tablehf['rowspan']) == ($lastrow+1)) || (!isset($tablehf['rowspan']) && ($i+1) == ($lastrow+1))) && $horf=='F') { // Bottom + $hadj += $table['padding']['B'] + $table['border_details']['B']['w'] ; + } + if ($colctr == 1) { // Left + $xadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + $wadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + } + if ($colctr == count($content[$i]) ) { // Right + $wadj += $table['padding']['R'] + $table['border_details']['R']['w'] ; + } + $this->SetFColor($color); + $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); + } + } + } + } + + if ($table['empty_cells']!='hide' || !empty($textbuffer) || !$table['borders_separate']) { $paintcell = true; } + else { $paintcell = false; } + + //Vertical align + if ($R && INTVAL($R) > 0 && isset($va) && $va!='B') { $va='B';} + + if (!isset($va) || empty($va) || $va=='M') $this->y += ($h-$mih)/2; + elseif (isset($va) && $va=='B') $this->y += $h-$mih; + + + //TABLE ROW OR CELL FILL BGCOLOR + $fill = 0; + if (isset($tablehf['bgcolor']) && $tablehf['bgcolor'] && $tablehf['bgcolor']!='transparent') { + $fill = $tablehf['bgcolor']; + $leveladj = 6; + } + else if (isset($content[$i][0]['trbgcolor']) && $content[$i][0]['trbgcolor'] && $content[$i][0]['trbgcolor']!='transparent') { // Row color + $fill = $content[$i][0]['trbgcolor']; + $leveladj = 3; + } + if ($fill && $paintcell) { + $color = $this->ConvertColor($fill); + if ($color) { + if ($table['borders_separate']) { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x+ ($table['border_spacing_H']/2), $y+ ($table['border_spacing_V']/2), $w- $table['border_spacing_H'], $h- $table['border_spacing_V'], 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>($x + ($table['border_spacing_H']/2)), 'y'=>($y + ($table['border_spacing_V']/2)), 'w'=>($w - $table['border_spacing_H']), 'h'=>($h - $table['border_spacing_V']), 'col'=>$color); + } + } + else { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x, $y, $w, $h, 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>$x, 'y'=>$y, 'w'=>$w, 'h'=>$h, 'col'=>$color); + } + } + } + } + + +/*-- BACKGROUNDS --*/ + if (isset($tablehf['gradient']) && $tablehf['gradient'] && $paintcell){ + $g = $this->grad->parseBackgroundGradient($tablehf['gradient']); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($tablehf['background-image']) && $paintcell){ + if ($tablehf['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $tablehf['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $tablehf['background-image']['gradient'] ); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else if ($tablehf['background-image']['image_id']) { // Background pattern + $n = count($this->patterns)+1; + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($tablehf['background-image']['orig_w'], $tablehf['background-image']['orig_h'], $pw, $ph, $tablehf['background-image']['resize'], $tablehf['background-image']['x_repeat'] , $tablehf['background-image']['y_repeat']); + $this->patterns[$n] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'pgh'=>$this->h, 'image_id'=>$tablehf['background-image']['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$tablehf['background-image']['x_pos'] , 'y_pos'=>$tablehf['background-image']['y_pos'] , 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$tablehf['background-image']['itype']); + if ($tablehf['background-image']['opacity']>0 && $tablehf['background-image']['opacity']<1) { $opac = $this->SetAlpha($tablehf['background-image']['opacity'],'Normal',true); } + else { $opac = ''; } + $this->_out(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px*_MPDFK, ($this->h-$py)*_MPDFK, $pw*_MPDFK, -$ph*_MPDFK)); + } + else { + $this->tableBackgrounds[$level*9+8][] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'image_id'=>$tablehf['background-image']['image_id'], 'orig_w'=>$tablehf['background-image']['orig_w'], 'orig_h'=>$tablehf['background-image']['orig_h'], 'x_pos'=>$tablehf['background-image']['x_pos'], 'y_pos'=>$tablehf['background-image']['y_pos'], 'x_repeat'=>$tablehf['background-image']['x_repeat'], 'y_repeat'=>$tablehf['background-image']['y_repeat'], 'clippath'=>'', 'resize'=>$tablehf['background-image']['resize'], 'opacity'=>$tablehf['background-image']['opacity'], 'itype'=>$tablehf['background-image']['itype']); + } + } + } +/*-- END BACKGROUNDS --*/ + + //Cell Border + if ($table['borders_separate'] && $paintcell && $border) { + $this->_tableRect($x+ ($table['border_spacing_H']/2)+($border_details['L']['w'] /2), $y+ ($table['border_spacing_V']/2)+($border_details['T']['w'] /2), $w-$table['border_spacing_H']-($border_details['L']['w'] /2)-($border_details['R']['w'] /2), $h- $table['border_spacing_V']-($border_details['T']['w'] /2)-($border_details['B']['w']/2), $border, $border_details, false, $table['borders_separate']); + } + else if ($paintcell && $border) { + $this->_tableRect($x, $y, $w, $h, $border, $border_details, true, $table['borders_separate']); // true causes buffer + } + + //Print cell content + //$this->divheight = $this->table_lineheight*$this->lineheight; + if (!empty($textbuffer)) { + if ($horf=='F' && preg_match('/{colsum([0-9]*)[_]*}/', $textbuffer[0][0], $m)) { + $rep = sprintf("%01.".intval($m[1])."f", $this->colsums[$colctr-1]); + $textbuffer[0][0] = preg_replace('/{colsum[0-9_]*}/', $rep ,$textbuffer[0][0]); + } + + if ($R) { + $cellPtSize = $textbuffer[0][11] / $this->shrin_k; + if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } + $cellFontHeight = ($cellPtSize/_MPDFK); + $opx = $this->x; + $opy = $this->y; + $angle = INTVAL($R); + // Only allow 45 - 90 degrees (when bottom-aligned) or -90 + if ($angle > 90) { $angle = 90; } + else if ($angle > 0 && (isset($va) && $va!='B')) { $angle = 90; } + else if ($angle > 0 && $angle <45) { $angle = 45; } + else if ($angle < 0) { $angle = -90; } + $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); + if (isset($align) && $align =='R') { + $this->x += ($w) + ($offset) - ($cellFontHeight/3) - ($padding['R'] + $border_details['R']['w']); + } + else if (!isset($align ) || $align =='C') { + $this->x += ($w/2) + ($offset); + } + else { + $this->x += ($offset) + ($cellFontHeight/3)+($padding['L'] + $border_details['L']['w']); + } + $str = ''; + foreach($tablehf['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + + if (!isset($va) || $va=='M') { + $this->y -= ($h-$mih)/2; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += (($h-$mih)/2)+($padding['T'] + $border_details['T']['w']) + ($mih-($padding['T'] + $border_details['T']['w']+$border_details['B']['w']+$padding['B'])); } + else if ($angle < 0) { $this->y += (($h-$mih)/2)+($padding['T'] + $border_details['T']['w']); } + } + else if (isset($va) && $va=='B') { + $this->y -= $h-$mih; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += $h-($border_details['B']['w']+$padding['B']); } + else if ($angle < 0) { $this->y += $h-$mih+($padding['T'] + $border_details['T']['w']); } + } + else if (isset($va) && $va=='T') { + if ($angle > 0) { $this->y += $mih-($border_details['B']['w']+$padding['B']); } + else if ($angle < 0) { $this->y += ($padding['T'] + $border_details['T']['w']); } + } + + $this->Rotate($angle,$this->x,$this->y); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + if (!empty($textbuffer[0][3])) { //Font Color + $cor = $textbuffer[0][3]; + $this->SetTColor($cor); + } + $s_str = $this->strike; + $this->strike = $textbuffer[0][8]; //Strikethrough + $this->SetFont($textbuffer[0][4],$textbuffer[0][2],$cellPtSize,true,true); + $this->Text($this->x,$this->y,$str); + $this->Rotate(0); + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $this->SetTColor(0); + $this->strike = $s_str; + $this->x = $opx; + $this->y = $opy; + } + else { + if ($table['borders_separate']) { // NB twice border width + $xadj = $border_details['L']['w'] + $padding['L'] +($table['border_spacing_H']/2); + $wadj = $border_details['L']['w'] + $border_details['R']['w'] + $padding['L'] +$padding['R'] + $table['border_spacing_H']; + $yadj = $border_details['T']['w'] + $padding['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $border_details['L']['w']/2 + $padding['L']; + $wadj = ($border_details['L']['w'] + $border_details['R']['w'])/2 + $padding['L'] + $padding['R']; + $yadj = $border_details['T']['w']/2 + $padding['T']; + } + + $this->divwidth=$w-($wadj); + $this->x += $xadj; + $this->y += $yadj; + $this->printbuffer($textbuffer,'',true); + } + + } + $textbuffer = array(); + +/*-- BACKGROUNDS --*/ + if (!$this->ColActive) { + if (isset($content[$i][0]['trgradients']) && ($colctr==1 || $table['borders_separate'])) { + $g = $this->grad->parseBackgroundGradient($content[$i][0]['trgradients']); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($content[$i][0]['trbackground-images']) && ($colctr==1 || $table['borders_separate'])) { + if ($content[$i][0]['trbackground-images']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $content[$i][0]['trbackground-images']['gradient'] )) { + $g = $this->grad->parseMozGradient( $content[$i][0]['trbackground-images']['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else { + $image_id = $content[$i][0]['trbackground-images']['image_id']; + $orig_w = $content[$i][0]['trbackground-images']['orig_w']; + $orig_h = $content[$i][0]['trbackground-images']['orig_h']; + $x_pos = $content[$i][0]['trbackground-images']['x_pos']; + $y_pos = $content[$i][0]['trbackground-images']['y_pos']; + $x_repeat = $content[$i][0]['trbackground-images']['x_repeat']; + $y_repeat = $content[$i][0]['trbackground-images']['y_repeat']; + $resize = $content[$i][0]['trbackground-images']['resize']; + $opacity = $content[$i][0]['trbackground-images']['opacity']; + $itype = $content[$i][0]['trbackground-images']['itype']; + + $clippath = ''; + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + else { + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } + } +/*-- END BACKGROUNDS --*/ + + // TABLE BORDER - if separate OR collapsed and only table border + if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { + $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H']/2); + $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H']/2); + $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V']/2); + $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V']/2); + $tbx = $x; + $tby = $y; + $tbw = $w; + $tbh = $h; + $tab_bord = 0; + $corner = ''; + if ($i == $firstrow && $horf=='H') { // Top + $tby -= $halfspaceT + ($table['border_details']['T']['w']/2); + $tbh += $halfspaceT + ($table['border_details']['T']['w']/2); + $this->setBorder($tab_bord , _BORDER_TOP); + $corner .= 'T'; + } + if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i+$tablehf['rowspan']) == ($lastrow+1))) && $horf=='F') { // Bottom + $tbh += $halfspaceB + ($table['border_details']['B']['w']/2); + $this->setBorder($tab_bord , _BORDER_BOTTOM); + $corner .= 'B'; + } + if ($colctr == 1 && $firstSpread) { // Left + $tbx -= $halfspaceL + ($table['border_details']['L']['w']/2); + $tbw += $halfspaceL + ($table['border_details']['L']['w']/2); + $this->setBorder($tab_bord , _BORDER_LEFT); + $corner .= 'L'; + } + if ($colctr == count($content[$i]) && $finalSpread) { // Right + $tbw += $halfspaceR + ($table['border_details']['R']['w']/2); + $this->setBorder($tab_bord , _BORDER_RIGHT); + $corner .= 'R'; + } + $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord , $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H'] ); + } + + + }// end column $content + $this->y = $y + $h; //Update y coordinate + }// end row $i + unset($table ); + $this->colsums = array(); + } +} +/*-- END TABLES --*/ + +/*-- HTMLHEADERS-FOOTERS --*/ +function SetHTMLHeader($header='',$OE='',$write=false) { + + $height = 0; + if (is_array($header) && isset($header['html']) && $header['html']) { + $Hhtml = $header['html']; + if ($this->setAutoTopMargin) { + if (isset($header['h'])) { $height = $header['h']; } + else { $height = $this->_gethtmlheight($Hhtml); } + } + } + else if (!is_array($header) && $header) { + $Hhtml = $header; + if ($this->setAutoTopMargin) { $height = $this->_gethtmlheight($Hhtml); } + } + else { $Hhtml = ''; } + + if ($OE != 'E') { $OE = 'O'; } + if ($OE == 'E') { + + if ($Hhtml) { + $this->HTMLHeaderE['html'] = $Hhtml; + $this->HTMLHeaderE['h'] = $height; + } + else { $this->HTMLHeaderE = ''; } + } + else { + + if ($Hhtml) { + $this->HTMLHeader['html'] = $Hhtml; + $this->HTMLHeader['h'] = $height; + } + else { $this->HTMLHeader = ''; } + } + if (!$this->mirrorMargins && $OE == 'E') { return; } + if ($Hhtml=='') { return; } + if ($OE == 'E') { + $this->headerDetails['even'] = array(); // override and clear any other non-HTML header/footer + } + else { + $this->headerDetails['odd'] = array(); // override and clear any non-HTML other header/footer + } + + if ($this->setAutoTopMargin=='pad') { + $this->tMargin = $this->margin_header + $height + $this->orig_tMargin; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } + } + else if ($this->setAutoTopMargin=='stretch') { + $this->tMargin = max($this->orig_tMargin, $this->margin_header + $height + $this->autoMarginPadding); + if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } + } + if ($write && $this->state!=0 && (($this->mirrorMargins && $OE == 'E' && ($this->page)%2==0) || ($this->mirrorMargins && $OE != 'E' && ($this->page)%2==1) || !$this->mirrorMargins)) { $this->writeHTMLHeaders(); } +} + +function SetHTMLFooter($footer='',$OE='') { + + $height = 0; + if (is_array($footer) && isset($footer['html']) && $footer['html']) { + $Fhtml = $footer['html']; + if ($this->setAutoBottomMargin) { + if (isset($footer['h'])) { $height = $footer['h']; } + else { $height = $this->_gethtmlheight($Fhtml); } + } + } + else if (!is_array($footer) && $footer) { + $Fhtml = $footer; + if ($this->setAutoBottomMargin) { $height = $this->_gethtmlheight($Fhtml); } + } + else { $Fhtml = ''; } + + if ($OE != 'E') { $OE = 'O'; } + if ($OE == 'E') { + + if ($Fhtml) { + $this->HTMLFooterE['html'] = $Fhtml; + $this->HTMLFooterE['h'] = $height; + } + else { $this->HTMLFooterE = ''; } + } + else { + + if ($Fhtml) { + $this->HTMLFooter['html'] = $Fhtml; + $this->HTMLFooter['h'] = $height; + } + else { $this->HTMLFooter = ''; } + } + if (!$this->mirrorMargins && $OE == 'E') { return; } + if ($Fhtml=='') { return false; } + if ($OE == 'E') { + $this->footerDetails['even'] = array(); // override and clear any other header/footer + } + else { + $this->footerDetails['odd'] = array(); // override and clear any other header/footer + } + + if ($this->setAutoBottomMargin=='pad') { + $this->bMargin = $this->margin_footer + $height + $this->orig_bMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin ; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } + } + else if ($this->setAutoBottomMargin=='stretch') { + $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $height + $this->autoMarginPadding); + $this->PageBreakTrigger=$this->h-$this->bMargin ; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } + } +} + + +function _getHtmlHeight($html) { + $save_state = $this->state; + if($this->state==0) { + $this->AddPage($this->CurOrientation); + } + $this->state = 2; + $this->Reset(); + $this->pageoutput[$this->page] = array(); + $save_x = $this->x; + $save_y = $this->y; + $this->x = $this->lMargin; + $this->y = $this->margin_header; + $html = str_replace('{PAGENO}',$this->pagenumPrefix.$this->docPageNum($this->page).$this->pagenumSuffix,$html); + $html = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->docPageNumTotal($this->page).$this->nbpgSuffix,$html ); + $html = str_replace($this->aliasNbPg,$this->page,$html ); + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $savepb = $this->pageBackgrounds; + $this->writingHTMLheader = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLheader = false; + $h = ($this->y - $this->margin_header); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + $this->headerbuffer = ''; + $this->pageBackgrounds = $savepb; + $this->x = $save_x; + $this->y = $save_y; + $this->state = $save_state; + if($save_state==0) { + unset($this->pages[1]); + $this->page = 0; + } + return $h; +} + + +// Called internally from Header +function writeHTMLHeaders() { + + if ($this->mirrorMargins && ($this->page)%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + if ($OE == 'E') { + $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeaderE['html'] ; + } + else { + $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeader['html'] ; + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->saveHTMLHeader[$this->page][$OE]['rotate'] = true; + $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->tMargin; + $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->bMargin; + $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->h; + $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->w; + } + else { + $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->lMargin; + $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->rMargin; + $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->w; + $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->h; + } +} + +function writeHTMLFooters() { + + if ($this->mirrorMargins && ($this->page)%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + if ($OE == 'E') { + $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooterE['html'] ; + } + else { + $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooter['html'] ; + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->saveHTMLFooter[$this->page][$OE]['rotate'] = true; + $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->tMargin; + $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->bMargin; + $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->rMargin; + $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->lMargin; + $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->h; + $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->w; + } + else { + $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->lMargin; + $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->rMargin; + $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->tMargin; + $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->bMargin; + $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->w; + $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->h; + } +} +/*-- END HTMLHEADERS-FOOTERS --*/ + +function DefHeaderByName($name,$arr) { + if (!$name) { $name = '_default'; } + $this->pageheaders[$name] = $arr; +} + +function DefFooterByName($name,$arr) { + if (!$name) { $name = '_default'; } + $this->pagefooters[$name] = $arr; +} + +function SetHeaderByName($name,$side='O',$write=false) { + if (!$name) { $name = '_default'; } + if ($side=='E') { $this->headerDetails['even'] = $this->pageheaders[$name]; } + else { $this->headerDetails['odd'] = $this->pageheaders[$name]; } + if ($write) { $this->Header(); } +} + +function SetFooterByName($name,$side='O') { + if (!$name) { $name = '_default'; } + if ($side=='E') { $this->footerDetails['even'] = $this->pagefooters[$name]; } + else { $this->footerDetails['odd'] = $this->pagefooters[$name]; } +} + +/*-- HTMLHEADERS-FOOTERS --*/ +function DefHTMLHeaderByName($name,$html) { + if (!$name) { $name = '_default'; } + + $this->pageHTMLheaders[$name]['html'] = $html; + $this->pageHTMLheaders[$name]['h'] = $this->_gethtmlheight($html); +} + +function DefHTMLFooterByName($name,$html) { + if (!$name) { $name = '_default'; } + + $this->pageHTMLfooters[$name]['html'] = $html; + $this->pageHTMLfooters[$name]['h'] = $this->_gethtmlheight($html); +} + +function SetHTMLHeaderByName($name,$side='O',$write=false) { + if (!$name) { $name = '_default'; } + $this->SetHTMLHeader($this->pageHTMLheaders[$name],$side,$write); +} + +function SetHTMLFooterByName($name,$side='O') { + if (!$name) { $name = '_default'; } + $this->SetHTMLFooter($this->pageHTMLfooters[$name],$side,$write); +} +/*-- END HTMLHEADERS-FOOTERS --*/ + + +function SetHeader($Harray=array(),$side='',$write=false) { + if (is_string($Harray)) { + if (strlen($Harray)==0) { + if ($side=='O') { $this->headerDetails['odd'] = array(); } + else if ($side=='E') { $this->headerDetails['even'] = array(); } + else { $this->headerDetails = array(); } + } + else if (strpos($Harray,'|') || strpos($Harray,'|')===0) { + $hdet = explode('|',$Harray); + $this->headerDetails = array ( + 'odd' => array ( + 'L' => array ('content' => $hdet[0], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'C' => array ('content' => $hdet[1], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'R' => array ('content' => $hdet[2], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ), + 'even' => array ( + 'R' => array ('content' => $hdet[0], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'C' => array ('content' => $hdet[1], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'L' => array ('content' => $hdet[2], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ) + ); + } + else { + $this->headerDetails = array ( + 'odd' => array ( + 'R' => array ('content' => $Harray, 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ), + 'even' => array ( + 'L' => array ('content' => $Harray, 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ) + ); + } + } + else if (is_array($Harray)) { + if ($side=='O') { $this->headerDetails['odd'] = $Harray; } + else if ($side=='E') { $this->headerDetails['even'] = $Harray; } + else { $this->headerDetails = $Harray; } + } +/*-- HTMLHEADERS-FOOTERS --*/ + // Overwrite any HTML Header previously set + if ($side=='E') { $this->SetHTMLHeader('','E'); } + else if ($side=='O') { $this->SetHTMLHeader(''); } + else { + $this->SetHTMLHeader(''); + $this->SetHTMLHeader('','E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + if ($write) { + $save_y = $this->y; + $this->Header(); + $this->SetY($save_y) ; + } +} + + + + +function SetFooter($Farray=array(),$side='') { + if (is_string($Farray)) { + if (strlen($Farray)==0) { + if ($side=='O') { $this->footerDetails['odd'] = array(); } + else if ($side=='E') { $this->footerDetails['even'] = array(); } + else { $this->footerDetails = array(); } + } + else if (strpos($Farray,'|') || strpos($Farray,'|')===0) { + $fdet = explode('|',$Farray); + $this->footerDetails = array ( + 'odd' => array ( + 'L' => array ('content' => $fdet[0], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'C' => array ('content' => $fdet[1], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'R' => array ('content' => $fdet[2], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ), + 'even' => array ( + 'R' => array ('content' => $fdet[0], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'C' => array ('content' => $fdet[1], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'L' => array ('content' => $fdet[2], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ) + ); + } + else { + $this->footerDetails = array ( + 'odd' => array ( + 'R' => array ('content' => $Farray, 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ), + 'even' => array ( + 'L' => array ('content' => $Farray, 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ) + ); + } + } + else if (is_array($Farray)) { + if ($side=='O') { $this->footerDetails['odd'] = $Farray; } + else if ($side=='E') { $this->footerDetails['even'] = $Farray; } + else { $this->footerDetails = $Farray; } + } +/*-- HTMLHEADERS-FOOTERS --*/ + // Overwrite any HTML Footer previously set + if ($side=='E') { $this->SetHTMLFooter('','E'); } + else if ($side=='O') { $this->SetHTMLFooter(''); } + else { + $this->SetHTMLFooter(''); + $this->SetHTMLFooter('','E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ +} + +/*-- WATERMARK --*/ +function setUnvalidatedText($txt='', $alpha=-1) { + if ($alpha>=0) $this->watermarkTextAlpha = $alpha; + $this->watermarkText = $txt; +} +function SetWatermarkText($txt='', $alpha=-1) { + if ($alpha>=0) $this->watermarkTextAlpha = $alpha; + $this->watermarkText = $txt; +} + +function SetWatermarkImage($src, $alpha=-1, $size='D', $pos='F') { + if ($alpha>=0) $this->watermarkImageAlpha = $alpha; + $this->watermarkImage = $src; + $this->watermark_size = $size; + $this->watermark_pos = $pos; +} +/*-- END WATERMARK --*/ + + +//Page footer +function Footer() { +/*-- CSS-PAGE --*/ + // PAGED MEDIA - CROP / CROSS MARKS from @PAGE + if ($this->show_marks == 'CROP' || $this->show_marks == 'CROPCROSS') { + // Show TICK MARKS + $this->SetLineWidth(0.1); // = 0.1 mm + $this->SetDColor($this->ConvertColor(0)); + $l = $this->cropMarkLength; + $m = $this->cropMarkMargin; // Distance of crop mark from margin + $b = $this->nonPrintMargin; // Non-printable border at edge of paper sheet + $ax1 = $b; + $bx = $this->page_box['outer_width_LR'] - $m; + $ax = max($ax1, $bx-$l); + $cx1 = $this->w - $b; + $dx = $this->w - $this->page_box['outer_width_LR'] + $m; + $cx = min($cx1, $dx+$l); + $ay1 = $b; + $by = $this->page_box['outer_width_TB'] - $m; + $ay = max($ay1, $by-$l); + $cy1 = $this->h - $b; + $dy = $this->h - $this->page_box['outer_width_TB'] + $m; + $cy = min($cy1, $dy+$l); + + $this->Line($ax, $this->page_box['outer_width_TB'], $bx, $this->page_box['outer_width_TB']); + $this->Line($cx, $this->page_box['outer_width_TB'], $dx, $this->page_box['outer_width_TB']); + $this->Line($ax, $this->h - $this->page_box['outer_width_TB'], $bx, $this->h - $this->page_box['outer_width_TB']); + $this->Line($cx, $this->h - $this->page_box['outer_width_TB'], $dx, $this->h - $this->page_box['outer_width_TB']); + $this->Line($this->page_box['outer_width_LR'], $ay, $this->page_box['outer_width_LR'], $by); + $this->Line($this->page_box['outer_width_LR'], $cy, $this->page_box['outer_width_LR'], $dy); + $this->Line($this->w - $this->page_box['outer_width_LR'], $ay, $this->w - $this->page_box['outer_width_LR'], $by); + $this->Line($this->w - $this->page_box['outer_width_LR'], $cy, $this->w - $this->page_box['outer_width_LR'], $dy); + + if ($this->printers_info) { + $hd = date('Y-m-d H:i').' Page '.$this->page.' of {nb}'; + $this->SetTColor($this->ConvertColor(0)); + $this->SetFont('arial','',7.5,true,true); + $this->x = $this->page_box['outer_width_LR'] + 1.5; + $this->y = 1; + $this->Cell($headerpgwidth ,$this->FontSize,$hd,0,0,'L',0,'',0,0,0,'M'); + $this->SetFont($this->default_font,'',$this->original_default_font_size); + } + + } + if ($this->show_marks == 'CROSS' || $this->show_marks == 'CROPCROSS') { + $this->SetLineWidth(0.1); // = 0.1 mm + $this->SetDColor($this->ConvertColor(0)); + $l = 14 /2; // longer length of the cross line (half) + $w = 6 /2; // shorter width of the cross line (half) + $r = 1.2; // radius of circle + $m = $this->crossMarkMargin; // Distance of cross mark from margin + $x1 = $this->page_box['outer_width_LR'] - $m; + $x2 = $this->w - $this->page_box['outer_width_LR'] + $m; + $y1 = $this->page_box['outer_width_TB'] - $m; + $y2 = $this->h - $this->page_box['outer_width_TB'] + $m; + // Left + $this->Circle($x1, $this->h/2, $r, 'S') ; + $this->Line($x1-$w, $this->h/2, $x1+$w, $this->h/2); + $this->Line($x1, $this->h/2-$l, $x1, $this->h/2+$l); + // Right + $this->Circle($x2, $this->h/2, $r, 'S') ; + $this->Line($x2-$w, $this->h/2, $x2+$w, $this->h/2); + $this->Line($x2, $this->h/2-$l, $x2, $this->h/2+$l); + // Top + $this->Circle($this->w/2, $y1, $r, 'S') ; + $this->Line($this->w/2, $y1-$w, $this->w/2, $y1+$w); + $this->Line($this->w/2-$l, $y1, $this->w/2+$l, $y1); + // Bottom + $this->Circle($this->w/2, $y2, $r, 'S') ; + $this->Line($this->w/2, $y2-$w, $this->w/2, $y2+$w); + $this->Line($this->w/2-$l, $y2, $this->w/2+$l, $y2); + } + + + // If @page set non-HTML headers/footers named, they were not read until later in the HTML code - so now set them + if ($this->page==1) { + if ($this->firstPageBoxHeader) { + $this->headerDetails['odd'] = $this->pageheaders[$this->firstPageBoxHeader]; + $this->Header(); + } + if ($this->firstPageBoxFooter) { + $this->footerDetails['odd'] = $this->pagefooters[$this->firstPageBoxFooter]; + } + $this->firstPageBoxHeader=''; + $this->firstPageBoxFooter=''; + } +/*-- END CSS-PAGE --*/ + + + +/*-- HTMLHEADERS-FOOTERS --*/ + if (($this->mirrorMargins && ($this->page%2==0) && $this->HTMLFooterE) || ($this->mirrorMargins && ($this->page%2==1) && $this->HTMLFooter) || (!$this->mirrorMargins && $this->HTMLFooter)) { + $this->writeHTMLFooters(); +/*-- WATERMARK --*/ + if (($this->watermarkText) && ($this->showWatermarkText)) { + $this->watermark( $this->watermarkText, 45, 120, $this->watermarkTextAlpha); // Watermark text + } + if (($this->watermarkImage) && ($this->showWatermarkImage)) { + $this->watermarkImg( $this->watermarkImage, $this->watermarkImageAlpha); // Watermark image + } +/*-- END WATERMARK --*/ + return; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + $this->processingHeader=true; + $this->ResetMargins(); // necessary after columns + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; +/*-- WATERMARK --*/ + if (($this->watermarkText) && ($this->showWatermarkText)) { + $this->watermark( $this->watermarkText, 45, 120, $this->watermarkTextAlpha); // Watermark text + } + if (($this->watermarkImage) && ($this->showWatermarkImage)) { + $this->watermarkImg( $this->watermarkImage, $this->watermarkImageAlpha); // Watermark image + } +/*-- END WATERMARK --*/ + $h = $this->footerDetails; + if(count($h)) { + + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out(sprintf('q 0 -1 1 0 0 %.3F cm ',($this->h*_MPDFK))); + $headerpgwidth = $this->h - $this->orig_lMargin - $this->orig_rMargin; + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $headerlmargin = $this->orig_rMargin; + } + else { + $headerlmargin = $this->orig_lMargin; + } + } + else { + $yadj = 0; + $headerpgwidth = $this->pgwidth; + $headerlmargin = $this->lMargin; + } + $this->SetY(-$this->margin_footer); + + $this->SetTColor($this->ConvertColor(0)); + $this->SUP = false; + $this->SUB = false; + $this->bullet = false; + + // only show pagenumber if numbering on + $pgno = $this->docPageNum($this->page, true); + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $side = 'even'; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS = DEFAULT + $side = 'odd'; + } + $maxfontheight = 0; + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + } + } + // LEFT-CENTER-RIGHT + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + $hd = str_replace('{PAGENO}',$pgno,$h[$side][$pos]['content']); + $hd = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->aliasNbPgGp.$this->nbpgSuffix,$hd); + $hd = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$hd); + if (isset($h[$side][$pos]['font-family']) && $h[$side][$pos]['font-family']) { $hff = $h[$side][$pos]['font-family']; } + else { $hff = $this->original_default_font; } + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->original_default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + if (isset($h[$side][$pos]['font-style']) && $h[$side][$pos]['font-style']) { $hfst = $h[$side][$pos]['font-style']; } + else { $hfst = ''; } + if (isset($h[$side][$pos]['color']) && $h[$side][$pos]['color']) { + $hfcol = $h[$side][$pos]['color']; + $cor = $this->ConvertColor($hfcol); + if ($cor) { $this->SetTColor($cor); } + } + else { $hfcol = ''; } + $this->SetFont($hff,$hfst,$hfsz,true,true); + $this->x = $headerlmargin ; + $this->y = $this->h - $this->margin_footer - ($maxfontheight/_MPDFK); + $hd = $this->purify_utf8_text($hd); + if ($this->text_input_as_HTML) { + $hd = $this->all_entities_to_utf8($hd); + } + // CONVERT CODEPAGE + if ($this->usingCoreFont) { $hd = mb_convert_encoding($hd,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY RTL + $this->magic_reverse_dir($hd, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($hd); // *INDIC* + $align = $pos; + if ($this->directionality == 'rtl') { + if ($pos == 'L') { $align = 'R'; } + else if ($pos == 'R') { $align = 'L'; } + } + + if ($pos!='L' && (strpos($hd,$this->aliasNbPg)!==false || strpos($hd,$this->aliasNbPgGp)!==false)) { + if (strpos($hd,$this->aliasNbPgGp)!==false) { $type= 'nbpggp'; } else { $type= 'nbpg'; } + $this->_out('{mpdfheader'.$type.' '.$pos.' ff='.$hff.' fs='.$hfst.' fz='.$hfsz.'}'); + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + $this->_out('Q'); + } + else { + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + } + if ($hfcol) { $this->SetTColor($this->ConvertColor(0)); } + } + } + // Return Font to normal + $this->SetFont($this->default_font,'',$this->original_default_font_size); + + // LINE + + if (isset($h[$side]['line']) && $h[$side]['line']) { + $this->SetLineWidth(0.1); + $this->SetDColor($this->ConvertColor(0)); + $this->Line($headerlmargin , $this->y-($maxfontheight*($this->footer_line_spacing)/_MPDFK), $headerlmargin +$headerpgwidth, $this->y-($maxfontheight*($this->footer_line_spacing)/_MPDFK)); + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out('Q'); + } + } + $this->processingHeader=false; + +} + +/////////////////// +// HYPHENATION +/////////////////// +// mPDF 5.6.21 +// Hard hyphens +function hardHyphenate($word, $maxWidth) { + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + // Get dictionary + $poss = array(); + $softhyphens = array(); + $offset = 0; + $p = true; + if ($this->usingCoreFont) { + $wl = strlen($word); + } + else { + $wl = mb_strlen($word,'UTF-8'); + } + while($offset < $wl) { + if (!$this->usingCoreFont) { + $p = mb_strpos($word, "-", $offset, 'UTF-8'); + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $p = strpos($word, "-", $offset); + } + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + $success = false; + foreach($poss AS $i) { + if ($this->usingCoreFont) { + $a = substr($word,0,$i); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = substr($word,$i,strlen($word)); + $prelength = strlen($pre); + } + else { + $a = mb_substr($word,0,$i,'UTF-8'); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8'); + $prelength = mb_strlen($pre, 'UTF-8'); + } + $success = true; + } + return array($success,$pre,$post,$prelength); +} + + +/*-- HYPHENATION --*/ +/////////////////// +/////////////////// +// HYPHENATION +/////////////////// +// Soft hyphs +function softHyphenate($word, $maxWidth) { + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + // Get dictionary + $poss = array(); + $softhyphens = array(); + $offset = 0; + $p = true; + if ($this->usingCoreFont) { + $wl = strlen($word); + } + else { + $wl = mb_strlen($word,'UTF-8'); + } + while($offset < $wl) { + // Soft Hyphens chr(173) + if (!$this->usingCoreFont) { + $p = mb_strpos($word, "\xc2\xad", $offset, 'UTF-8'); + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $p = strpos($word, chr(173), $offset); + } + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + $success = false; + foreach($poss AS $i) { + if ($this->usingCoreFont) { + $a = substr($word,0,$i); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = substr($word,$i,strlen($word)); + $prelength = strlen($pre); + } + else { + $a = mb_substr($word,0,$i,'UTF-8'); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8'); + $prelength = mb_strlen($pre, 'UTF-8'); + } + $success = true; + } + return array($success,$pre,$post,$prelength); +} + +/////////////////// +// Word hyphenation +function hyphenateWord($word, $maxWidth) { + // Do everything inside this function in utf-8 + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + + // Get dictionary + if (!$this->loadedSHYdictionary) { + if (file_exists(_MPDF_PATH.'patterns/dictionary.txt')) { + $this->SHYdictionary = file(_MPDF_PATH.'patterns/dictionary.txt',FILE_SKIP_EMPTY_LINES); + foreach($this->SHYdictionary as $entry) { + $entry = trim($entry); + $poss = array(); + $offset = 0; + $p = true; + $wl = mb_strlen($entry ,'UTF-8'); + while($offset < $wl) { + $p = mb_strpos($entry, '/', $offset, 'UTF-8'); + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + if (count($poss)) { $this->SHYdictionaryWords[str_replace('/', '', mb_strtolower($entry))] = $poss; } + } + } + $this->loadedSHYdictionary = true; + } + + if (!in_array($this->SHYlang,$this->SHYlanguages)) { return array(false,'','',''); } + // If no pattern loaded or not the best one + if (count($this->SHYpatterns) < 1 || ($this->loadedSHYpatterns && $this->loadedSHYpatterns != $this->SHYlang)) { + include(_MPDF_PATH."patterns/" . $this->SHYlang . ".php"); + $patterns = explode(' ', $patterns); + $new_patterns = array(); + for($i = 0; $i < count($patterns); $i++) { + $value = $patterns[$i]; + $new_patterns[preg_replace('/[0-9]/', '', $value)] = $value; + } + $this->SHYpatterns = $new_patterns; + $this->loadedSHYpatterns = $this->SHYlang; + } + + if ($this->usingCoreFont) { $word = mb_convert_encoding($word,'UTF-8',$this->mb_enc); } + + $prepre = ''; + $postpost = ''; + $startpunctuation = "\xc2\xab\xc2\xbf\xe2\x80\x98\xe2\x80\x9b\xe2\x80\x9c\xe2\x80\x9f"; + $endpunctuation = "\xe2\x80\x9e\xe2\x80\x9d\xe2\x80\x9a\xe2\x80\x99\xc2\xbb"; + $pre = ''; + $post = ''; + + + if (preg_match('/^(["\''.$startpunctuation .'])+(.{'.$this->SHYcharmin.',})$/u',$word,$m)) { + $prepre = $m[1]; + $word = $m[2]; + } + if (preg_match('/^(.{'.$this->SHYcharmin.',})([\'\.,;:!?"'.$endpunctuation .']+)$/u',$word,$m)) { + $word = $m[1]; + $postpost = $m[2]; + } + if(mb_strlen($word,'UTF-8') < $this->SHYcharmin) { + return array(false,'','',''); + } + $success = false; + + if(isset($this->SHYdictionaryWords[mb_strtolower($word)])) { + foreach($this->SHYdictionaryWords[mb_strtolower($word)] AS $i) { + $a = $prepre . mb_substr($word,0,$i,'UTF-8'); + if ($this->usingCoreFont) { $testa = mb_convert_encoding($a,$this->mb_enc,'UTF-8'); } + else { $testa = $a; } + if ($this->GetStringWidth($testa.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8') . $postpost; + $success = true; + } + } + + if (!$success) { + $text_word = '_' . $word . '_'; + $word_length = mb_strlen($text_word,'UTF-8'); + + $single_character = preg_split('//u', $text_word); + + $text_word = mb_strtolower($text_word,'UTF-8'); + $hyphenated_word = array(); + $numb3rs = array('0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true, '7' => true, '8' => true, '9' => true); + for($position = 0; $position <= ($word_length - $this->SHYcharmin); $position++) { + $maxwins = min(($word_length - $position), $this->SHYcharmax); + for($win = $this->SHYcharmin; $win <= $maxwins; $win++) { + if(isset($this->SHYpatterns[mb_substr($text_word, $position, $win,'UTF-8')])) { + $pattern = $this->SHYpatterns[mb_substr($text_word, $position, $win,'UTF-8')]; + $digits = 1; + $pattern_length = mb_strlen($pattern,'UTF-8'); + for($i = 0; $i < $pattern_length; $i++) { + $char = $pattern[$i]; + if(isset($numb3rs[$char])) { + $zero = ($i == 0) ? $position - 1 : $position + $i - $digits; + if(!isset($hyphenated_word[$zero]) || $hyphenated_word[$zero] != $char) $hyphenated_word[$zero] = $char; + $digits++; + } + } + } + } + } + + for($i = $this->SHYleftmin; $i <= (mb_strlen($word,'UTF-8') - $this->SHYrightmin); $i++) { + if(isset($hyphenated_word[$i]) && $hyphenated_word[$i] % 2 != 0) { + $a = $prepre . mb_substr($word,0,$i,'UTF-8'); + if ($this->usingCoreFont) { $testa = mb_convert_encoding($a,$this->mb_enc,'UTF-8'); } + else { $testa = $a; } + if ($this->GetStringWidth($testa.'-') > $maxWidth + 0.0001) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8') . $postpost; + $success = true; + } + } + } + if ($this->usingCoreFont) { + $pre = mb_convert_encoding($pre,$this->mb_enc,'UTF-8'); + $post = mb_convert_encoding($post,$this->mb_enc,'UTF-8'); + $prelength = strlen($pre); + } + else { + $prelength = mb_strlen($pre); + } + return array($success,$pre,$post,$prelength); + +} +/*-- END HYPHENATION --*/ + + +/*-- HTML-CSS --*/ +/////////////////// +/// HTML parser /// +/////////////////// +function WriteHTML($html,$sub=0,$init=true,$close=true) { + // $sub ADDED - 0 = default; 1=headerCSS only; 2=HTML body (parts) only; 3 - HTML parses only + // 4 - writes HTML headers + // $close Leaves buffers etc. in current state, so that it can continue a block etc. + // $init - Clears and sets buffers to Top level block etc. + + if (empty($html)) { $html = ''; } + if ($this->progressBar) { $this->UpdateProgressBar(1,0,'Parsing CSS & Headers'); } // *PROGRESS-BAR* + + if ($init) { + $this->headerbuffer=''; + $this->textbuffer = array(); + $this->fixedPosBlockSave = array(); + } + if ($sub == 1) { $html = ''; } // stylesheet only + + if ($this->allow_charset_conversion) { + if ($sub < 1) { + $this->ReadCharset($html); + } + if ($this->charset_in && $sub!=4) { // mPDF 5.4.14 + $success = iconv($this->charset_in,'UTF-8//TRANSLIT',$html); + if ($success) { $html = $success; } + } + } + $html = $this->purify_utf8($html,false); + if ($init) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + } + + $zproperties = array(); + if ($sub < 2) { + $this->ReadMetaTags($html); + + // mPDF 5.6.18 + if (preg_match('/]*href=["\']([^"\'>]*)["\']/i', $html, $m)) { + $this->SetBasePath($m[1]); + } + // NB default stylesheet now in mPDF.css - read on initialising class + $html = $this->cssmgr->ReadCSS($html); + + if ($this->useLang && !$this->usingCoreFont && preg_match('/]*lang=[\'\"](.*?)[\'\"]/ism',$html,$m)) { + $html_lang = $m[1]; + } + + if (preg_match('/]*dir=[\'\"]\s*rtl\s*[\'\"]/ism',$html)) { + $zproperties['DIRECTION'] = 'rtl'; + } + + // allow in-line CSS for body tag to be parsed // Get tag inline CSS + if (preg_match('/]*)>(.*?)<\/body>/ism',$html,$m) || preg_match('/]*)>(.*)$/ism',$html,$m)) { + $html = $m[2]; + // Changed to allow style="background: url('bg.jpg')" + if (preg_match('/style=[\"](.*?)[\"]/ism',$m[1],$mm) || preg_match('/style=[\'](.*?)[\']/ism',$m[1],$mm)) { + $zproperties = $this->cssmgr->readInlineCSS($mm[1]); + } + if (preg_match('/dir=[\'\"]\s*rtl\s*[\'\"]/ism',$m[1])) { + $zproperties['DIRECTION'] = 'rtl'; + } + if (isset($html_lang) && $html_lang) { $zproperties['LANG'] = $html_lang; } + if ($this->useLang && !$this->onlyCoreFonts && preg_match('/lang=[\'\"](.*?)[\'\"]/ism',$m[1],$mm)) { + $zproperties['LANG'] = $mm[1]; + } + + } + } + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + if ($zproperties) { $properties = $this->cssmgr->array_merge_recursive_unique($properties,$zproperties); } + + if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { + $this->cssmgr->CSS['BODY']['DIRECTION'] = $properties['DIRECTION']; + } + if (!isset($this->cssmgr->CSS['BODY']['DIRECTION'])) { + $this->cssmgr->CSS['BODY']['DIRECTION'] = $this->directionality; + } + else { $this->SetDirectionality($this->cssmgr->CSS['BODY']['DIRECTION']); } + + $this->setCSS($properties,'','BODY'); + $this->blk[0]['InlineProperties'] = $this->saveInlineProperties(); + + if ($sub == 1) { return ''; } + if (!isset($this->cssmgr->CSS['BODY'])) { $this->cssmgr->CSS['BODY'] = array(); } + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT'])) { + $this->bodyBackgroundGradient = $properties['BACKGROUND-GRADIENT']; + } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($properties, $this->pgwidth); + if ($ret) { $this->bodyBackgroundImage = $ret; } + } +/*-- END BACKGROUNDS --*/ + +/*-- CSS-PAGE --*/ + // If page-box is set + if ($this->state==0 && isset($this->cssmgr->CSS['@PAGE']) && $this->cssmgr->CSS['@PAGE'] ) { + $this->page_box['current'] = ''; + $this->page_box['using'] = true; + list($pborientation,$pbmgl,$pbmgr,$pbmgt,$pbmgb,$pbmgh,$pbmgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS('', false, 'O'); + $this->DefOrientation = $this->CurOrientation = $pborientation; + $this->orig_lMargin = $this->DeflMargin = $pbmgl; + $this->orig_rMargin = $this->DefrMargin = $pbmgr; + $this->orig_tMargin = $this->tMargin = $pbmgt; + $this->orig_bMargin = $this->bMargin = $pbmgb; + $this->orig_hMargin = $this->margin_header = $pbmgh; + $this->orig_fMargin = $this->margin_footer = $pbmgf; + list($pborientation,$pbmgl,$pbmgr,$pbmgt,$pbmgb,$pbmgh,$pbmgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS('', true, 'O'); // first page + $this->show_marks = $marks; + if ($hname && !preg_match('/^html_(.*)$/i',$hname)) $this->firstPageBoxHeader = $hname; + if ($fname && !preg_match('/^html_(.*)$/i',$fname)) $this->firstPageBoxFooter = $fname; + } +/*-- END CSS-PAGE --*/ + + $parseonly = false; + $this->bufferoutput = false; + if ($sub == 3) { + $parseonly = true; + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } + $this->textbuffer=array(); + } + else if ($sub == 4) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } + $this->bufferoutput = true; + $this->textbuffer=array(); + $this->headerbuffer=''; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + } + + mb_internal_encoding('UTF-8'); + + $html = $this->AdjustHTML($html, $this->tabSpaces); //Try to make HTML look more like XHTML + + if ($this->autoFontGroups) { $html = $this->AutoFont($html); } + +/*-- HTMLHEADERS-FOOTERS --*/ + preg_match_all('/]*)>(.*?)<\/htmlpageheader>/si',$html,$h); + for($i=0;$ipageHTMLheaders[$n[1]]['html'] = $h[2][$i]; + $this->pageHTMLheaders[$n[1]]['h'] = $this->_gethtmlheight($h[2][$i]); + } + } + preg_match_all('/]*)>(.*?)<\/htmlpagefooter>/si',$html,$f); + for($i=0;$ipageHTMLfooters[$n[1]]['html'] = $f[2][$i]; + $this->pageHTMLfooters[$n[1]]['h'] = $this->_gethtmlheight($f[2][$i]); + } + } +/*-- END HTMLHEADERS-FOOTERS --*/ + $html = preg_replace('//si','',$html); + $html = preg_replace('//si','',$html); + + if($this->state==0 && $sub!=1 && $sub!=3 && $sub!=4) { + $this->AddPage($this->CurOrientation); + } + + +/*-- HTMLHEADERS-FOOTERS --*/ + + if (isset($hname) && preg_match('/^html_(.*)$/i',$hname,$n)) $this->SetHTMLHeader($this->pageHTMLheaders[$n[1]],'O',true); + if (isset($fname) && preg_match('/^html_(.*)$/i',$fname,$n)) $this->SetHTMLFooter($this->pageHTMLfooters[$n[1]],'O'); + +/*-- END HTMLHEADERS-FOOTERS --*/ + + $html=str_replace('checkSIP = false; + $this->checkSMP = false; + $this->checkCJK = false; + if ($this->onlyCoreFonts) { $html = $this->SubstituteChars($html); } + else { + if (preg_match("/([".$this->pregRTLchars."])/u", $html)) { $this->biDirectional = true; } // *RTL* + if (preg_match("/([\x{20000}-\x{2FFFF}])/u", $html)) { $this->checkSIP = true; } + if (preg_match("/([\x{10000}-\x{1FFFF}])/u", $html)) { $this->checkSMP = true; } +/*-- CJK-FONTS --*/ + if (preg_match("/([".$this->pregCJKchars."])/u", $html)) { $this->checkCJK = true; } +/*-- END CJK-FONTS --*/ + } + + // Don't allow non-breaking spaces that are converted to substituted chars or will break anyway and mess up table width calc. + $html = str_replace('160',chr(32),$html); + $html = str_replace('','|',$html); + $html = str_replace('','|',$html); + $html = str_replace('','|',$html); + + //Add new supported tags in the DisableTags function + $html=strip_tags($html,$this->enabledtags); //remove all unsupported tags, but the ones inside the 'enabledtags' string + + //Explode the string in order to parse the HTML code + $a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + // ? more accurate regexp that allows e.g. + // if changing - also change in fn.SubstituteChars() + // $a = preg_split ('/<((?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); + + if ($this->mb_enc) { + mb_internal_encoding($this->mb_enc); + } + $pbc = 0; + if ($this->progressBar) { $this->UpdateProgressBar(1,0); } // *PROGRESS-BAR* + $this->subPos = -1; + $cnt = count($a); + for($i=0;$i<$cnt; $i++) { + $e = $a[$i]; + if($i%2==0) { + //TEXT + if ($this->blk[$this->blklvl]['hide']) { continue; } + if ($this->inlineDisplayOff) { continue; } + if ($this->inMeter) { continue; } // mPDF 5.5.09 + + if ($this->inFixedPosBlock) { $this->fixedPosBlock .= $e; continue; } // *CSS-POSITION* + if (strlen($e) == 0) { continue; } + + $e = strcode2utf($e); + $e = $this->lesser_entity_decode($e); + + if ($this->usingCoreFont) { + // If core font is selected in document which is not onlyCoreFonts - substitute with non-core font + if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->subPos<$i && !$this->specialcontent) { + $cnt += $this->SubstituteCharsNonCore($a, $i, $e); + } + // CONVERT ENCODING + $e = mb_convert_encoding($e,$this->mb_enc,'UTF-8'); + // mPDF 5.6.41 + if ($this->toupper) { $e = mb_strtoupper($e,$this->mb_enc); } + if ($this->tolower) { $e = mb_strtolower($e,$this->mb_enc); } + if ($this->capitalize) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } + } + else { + if ($this->checkSIP && $this->CurrentFont['sipext'] && $this->subPos<$i && !$this->specialcontent) { + $cnt += $this->SubstituteCharsSIP($a, $i, $e); + } + + if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->CurrentFont['type']!='Type0' && $this->subPos<$i && !$this->specialcontent) { + // mPDF 5.6.62 removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner + $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u",'',$e); + $cnt += $this->SubstituteCharsMB($a, $i, $e); + } + if ($this->biDirectional) { // *RTL* + $e = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $e); // *RTL* + } // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($e); // *INDIC* + + // mPDF 5.6.62 removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner + $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u",'',$e); + + if ($this->toupper) { $e = mb_strtoupper($e,$this->mb_enc); } + if ($this->tolower) { $e = mb_strtolower($e,$this->mb_enc); } + if ($this->capitalize) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } + } + if (($this->tts) || ($this->ttz) || ($this->tta)) { + $es = explode('|',$e); + $e = ''; + foreach($es AS $val) { + $e .= chr($val); + } + } + //Adjust lineheight + + // FORM ELEMENTS + if ($this->specialcontent) { +/*-- FORMS --*/ + //SELECT tag (form element) + if ($this->specialcontent == "type=select") { + $e = ltrim($e); + $stringwidth = $this->GetStringWidth($e); + if (!isset($this->selectoption['MAXWIDTH']) || $stringwidth > $this->selectoption['MAXWIDTH']) { $this->selectoption['MAXWIDTH'] = $stringwidth; } + if (!isset($this->selectoption['SELECTED']) || $this->selectoption['SELECTED'] == '') { $this->selectoption['SELECTED'] = $e; } + // mPDD 1.4 Active Forms + if (isset($this->selectoption['ACTIVE']) && $this->selectoption['ACTIVE']) { + $this->selectoption['ITEMS'][]=array('exportValue'=>$this->selectoption['currentVAL'], 'content'=>$e, 'selected'=>$this->selectoption['currentSEL']); + } + } + // TEXTAREA + else { + $objattr = unserialize($this->specialcontent); + $objattr['text'] = $e; + $te = "\xbb\xa4\xactype=textarea,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if ($this->tdbegin) { + $this->_saveCellTextBuffer($te, $this->HREF); + } + else { + $this->_saveTextBuffer($te, $this->HREF); + } + } +/*-- END FORMS --*/ + } + + // TABLE + else if ($this->tableLevel) { +/*-- TABLES --*/ + if ($this->tdbegin) { + if (($this->ignorefollowingspaces) && !$this->ispre) { $e = ltrim($e); } + if ($e || $e==='0') { + if (($this->blockjustfinished || $this->listjustfinished) && $this->cell[$this->row][$this->col]['s']>0) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0;// reset + } + $this->blockjustfinished=false; + $this->listjustfinished=false; + + $this->_saveCellTextBuffer($e, $this->HREF); + + if (!isset($this->cell[$this->row][$this->col]['R']) || !$this->cell[$this->row][$this->col]['R']) { + if (isset($this->cell[$this->row][$this->col]['s'])) { + $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($e, false); + } + else { $this->cell[$this->row][$this->col]['s'] = $this->GetStringWidth($e, false); } + if (!empty($this->spanborddet)) { + $this->cell[$this->row][$this->col]['s'] += $this->spanborddet['L']['w'] + $this->spanborddet['R']['w']; + } + } + + if ($this->checkCJK && preg_match("/([".$this->pregCJKchars."])/u", $e)) { $this->tableCJK = true; } // *CJK-FONTS* + + // mPDF 5.6.13 Decimal mark alignment + if (substr($this->cell[$this->row][$this->col]['a'],0,1) == 'D') { + $dp = $this->decimal_align[substr($this->cell[$this->row][$this->col]['a'],0,2)]; + $s = preg_split('/'.preg_quote($dp,'/').'/', $e, 2); // ? needs to be /u if not core + $s0 = $this->GetStringWidth($s[0], false); + if ($s[1]) { $s1 = $this->GetStringWidth(($s[1].$dp), false); } + else $s1 = 0; + if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'])) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = $s0; + } + else { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = max($s0, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0']); + } + if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'])) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = $s1; + } + else { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = max($s1, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1']); + } + } + + if ($this->tableLevel==1 && $this->useGraphs) { + $this->graphs[$this->currentGraphId]['data'][$this->row][$this->col] = $e; + } + $this->nestedtablejustfinished = false; + $this->linebreakjustfinished=false; + } + } +/*-- END TABLES --*/ + } + // ALL ELSE + else { + if ($this->ignorefollowingspaces and !$this->ispre) { $e = ltrim($e); } + if ($e || $e==='0') $this->_saveTextBuffer($e, $this->HREF); + } + } + + + else { // TAG ** + + if($e[0]=='/') { +/*-- PROGRESS-BAR --*/ + if ($this->progressBar) { // 10% increments + if (intval($i*10/$cnt) != $pbc) { $pbc = intval($i*10/$cnt); $this->UpdateProgressBar(1,$pbc*10,$tag); } + } +/*-- END PROGRESS-BAR --*/ + + + // Check for tags where HTML specifies optional end tags, + // and/or does not allow nesting e.g. P inside P, or + $endtag = trim(strtoupper(substr($e,1))); // mPDF 5.4.20 + if($this->blk[$this->blklvl]['hide']) { + if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { + unset($this->blk[$this->blklvl]); + $this->blklvl--; + } + continue; + } + +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { $this->fixedPosBlockDepth--; } + if ($this->fixedPosBlockDepth == 0) { + $this->fixedPosBlockSave[] = array($this->fixedPosBlock, $this->fixedPosBlockBBox, $this->page); + $this->fixedPosBlock = ''; + $this->inFixedPosBlock = false; + continue; + } + $this->fixedPosBlock .= '<'.$e.'>'; + continue; + } +/*-- END CSS-POSITION --*/ + if ($this->allow_html_optional_endtags && !$parseonly) { + if (($endtag == 'DIV' || $endtag =='FORM' || $endtag =='CENTER') && $this->lastoptionaltag == 'P') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'LI' && $endtag == 'OL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'LI' && $endtag == 'UL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'DD' && $endtag == 'DL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'DT' && $endtag == 'DL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'OPTION' && $endtag == 'SELECT') { $this->CloseTag($this->lastoptionaltag ); } +/*-- TABLES --*/ + if ($endtag == 'TABLE') { + if ($this->lastoptionaltag == 'THEAD' || $this->lastoptionaltag == 'TBODY' || $this->lastoptionaltag == 'TFOOT') { + $this->CloseTag($this->lastoptionaltag); + } + if ($this->lastoptionaltag == 'TR') { $this->CloseTag('TR'); } + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); } + } + if ($endtag == 'THEAD' || $endtag == 'TBODY' || $endtag == 'TFOOT') { + if ($this->lastoptionaltag == 'TR') { $this->CloseTag('TR'); } + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); } + } + if ($endtag == 'TR') { + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); } + } +/*-- END TABLES --*/ + } + $this->CloseTag($endtag); + } + + else { // OPENING TAG + if($this->blk[$this->blklvl]['hide']) { + if (strpos($e,' ')) { $te = strtoupper(substr($e,0,strpos($e,' '))); } + else { $te = strtoupper($e); } + if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { + $this->blklvl++; + $this->blk[$this->blklvl]['hide']=true; + } + continue; + } + +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + if (strpos($e,' ')) { $te = strtoupper(substr($e,0,strpos($e,' '))); } + else { $te = strtoupper($e); } + $this->fixedPosBlock .= '<'.$e.'>'; + if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { $this->fixedPosBlockDepth++; } + continue; + } +/*-- END CSS-POSITION --*/ + $regexp = '|=\'(.*?)\'|s'; // eliminate single quotes, if any + $e = preg_replace($regexp,"=\"\$1\"",$e); + // changes anykey=anyvalue to anykey="anyvalue" (only do this inside [some] tags) + if (substr($e,0,10)!='pageheader' && substr($e,0,10)!='pagefooter' && substr($e,0,12)!='tocpagebreak') { // mPDF 5.6.69 + $regexp = '| (\\w+?)=([^\\s>"]+)|si'; + $e = preg_replace($regexp," \$1=\"\$2\"",$e); + } + + $e = preg_replace('/ (\\S+?)\s*=\s*"/i', " \\1=\"", $e); + + //Fix path values, if needed + $orig_srcpath = ''; + if ((stristr($e,"href=") !== false) or (stristr($e,"src=") !== false) ) { + $regexp = '/ (href|src)\s*=\s*"(.*?)"/i'; + preg_match($regexp,$e,$auxiliararray); + if (isset($auxiliararray[2])) { $path = $auxiliararray[2]; } + else { $path = ''; } + if (trim($path) != '' && !(stristr($e,"src=") !== false && substr($path,0,4)=='var:')) { + $orig_srcpath = $path; + $this->GetFullPath($path); + $regexp = '/ (href|src)="(.*?)"/i'; + $e = preg_replace($regexp,' \\1="'.$path.'"',$e); + } + }//END of Fix path values + + + //Extract attributes + $contents=array(); + $contents1=array(); // mPDF 5.5.17 + $contents2=array(); + // Changed to allow style="background: url('bg.jpg')" + // mPDF 5.5.17 Changed to improve performance; maximum length of \S (attribute) = 16 + // mPDF 5.6.30 Increase allowed attribute name to 32 - cutting off "toc-even-header-name" etc. + preg_match_all('/\\S{1,32}=["][^"]*["]/',$e,$contents1); + preg_match_all('/\\S{1,32}=[\'][^\']*[\']/i',$e,$contents2); + + $contents = array_merge($contents1, $contents2); + preg_match('/\\S+/',$e,$a2); + $tag=strtoupper($a2[0]); + $attr=array(); + if ($orig_srcpath) { $attr['ORIG_SRC'] = $orig_srcpath; } + if (!empty($contents)) { + foreach($contents[0] as $v) { + // Changed to allow style="background: url('bg.jpg')" + if(preg_match('/^([^=]*)=["]?([^"]*)["]?$/',$v,$a3) || preg_match('/^([^=]*)=[\']?([^\']*)[\']?$/',$v,$a3)) { + if (strtoupper($a3[1])=='ID' || strtoupper($a3[1])=='CLASS') { // 4.2.013 Omits STYLE + $attr[strtoupper($a3[1])]=trim(strtoupper($a3[2])); + } + // includes header-style-right etc. used for + else if (preg_match('/^(HEADER|FOOTER)-STYLE/i',$a3[1])) { + $attr[strtoupper($a3[1])]=trim(strtoupper($a3[2])); + } + else { + $attr[strtoupper($a3[1])]=trim($a3[2]); + } + } + } + } + $this->OpenTag($tag,$attr); +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + $this->fixedPosBlockBBox = array($tag,$attr, $this->x, $this->y); + $this->fixedPosBlock = ''; + $this->fixedPosBlockDepth = 1; + } +/*-- END CSS-POSITION --*/ + // mPDF 5.5.09 + if (preg_match('/\/$/',$e)) { $this->closeTag($tag); } + + } + + } // end TAG + } //end of foreach($a as $i=>$e) + + if ($close) { + + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + + // Output any text left in buffer + if (count($this->textbuffer) && !$parseonly) { $this->printbuffer($this->textbuffer); } + if (!$parseonly) $this->textbuffer=array(); + +/*-- CSS-FLOAT --*/ + // If ended with a float, need to move to end page + $currpos = $this->page*1000 + $this->y; + if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { + $old_page = $this->page; + $new_page = intval($this->blk[$this->blklvl]['float_endpos'] /1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + $this->ResetMargins(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + } + $this->y = (($this->blk[$this->blklvl]['float_endpos'] *1000) % 1000000)/1000; // mod changes operands to integers before processing + } +/*-- END CSS-FLOAT --*/ + +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + //Create Internal Links, if needed + if (!empty($this->internallink) ) { + foreach($this->internallink as $k=>$v) { + if (strpos($k,"#") !== false ) { continue; } //ignore + $ypos = $v['Y']; + $pagenum = $v['PAGE']; + $sharp = "#"; + while (array_key_exists($sharp.$k,$this->internallink)) { + $internallink = $this->internallink[$sharp.$k]; + $this->SetLink($internallink,$ypos,$pagenum); + $sharp .= "#"; + } + } + } + + $this->linemaxfontsize = ''; + $this->lineheight_correction = $this->default_lineheight_correction; + + $this->bufferoutput = false; + +/*-- CSS-POSITION --*/ + if (count($this->fixedPosBlockSave) && $sub != 4) { + foreach($this->fixedPosBlockSave AS $fpbs) { + $old_page = $this->page; + $this->page = $fpbs[2]; + $this->WriteFixedPosHTML($fpbs[0], 0, 0, 100, 100,'auto', $fpbs[1]); // 0,0,10,10 are overwritten by bbox + $this->page = $old_page; + } + } +/*-- END CSS-POSITION --*/ + + } +} + +/*-- CSS-POSITION --*/ + +function WriteFixedPosHTML($html='',$x, $y, $w, $h, $overflow='visible', $bounding=array()) { + // $overflow can be 'hidden', 'visible' or 'auto' - 'auto' causes autofit to size + // Annotations disabled - enabled in mPDF 5.0 + // Links do work + // Will always go on current page (or start Page 1 if required) + // Probably INCOMPATIBLE WITH keep with table, columns etc. + // Called externally or interally via
    + // When used internally, $x $y $w $h and $overflow are all overridden by $bounding + + $overflow = strtolower($overflow); + if($this->state==0) { + $this->AddPage($this->CurOrientation); + } + $save_y = $this->y; + $save_x = $this->x; + $this->fullImageHeight = $this->h; + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + $save_annots = $this->title2annots; // *ANNOTATIONS* + $this->writingHTMLheader = true; // a FIX to stop pagebreaks etc. + $this->writingHTMLfooter = true; + $this->InFooter = true; // suppresses autopagebreaks + $save_bgs = $this->pageBackgrounds; + $checkinnerhtml = preg_replace('/\s/','',$html); + + if ($w > $this->w) { $x = 0; $w = $this->w; } + if ($h > $this->h) { $y = 0; $h = $this->h; } + if ($x > $this->w) { $x = $this->w - $w; } + if ($y > $this->h) { $y = $this->h - $h; } + + if (!empty($bounding)) { + // $cont_ containing block = full physical page (position: absolute) or page inside margins (position: fixed) + // $bbox_ Bounding box is the
    which is positioned absolutely/fixed + // top/left/right/bottom/width/height/background*/border*/padding*/margin* are taken from bounding + // font*[family/size/style/weight]/line-height/text*[align/decoration/transform/indent]/color are transferred to $inner + // as an enclosing
    (after having checked ID/CLASS) + // $x, $y, $w, $h are inside of $bbox_ = containing box for $inner_ + // $inner_ InnerHTML is the contents of that block to be output + $tag = $bounding[0]; + $attr = $bounding[1]; + $orig_x0 = $bounding[2]; + $orig_y0 = $bounding[3]; + + // As in WriteHTML() initialising + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + + $this->blk[0]['blockContext'] = $this->blockContext; + + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl = 1; + $this->initialiseBlock($this->blk[1]); + $this->blk[1]['tag'] = $tag; + $this->blk[1]['attr'] = $attr; + $this->Reset(); + $p = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + if (isset($p['ROTATE']) && ($p['ROTATE']==90 || $p['ROTATE']==-90)) { $rotate = $p['ROTATE']; } + else { $rotate = 0; } + if (isset($p['OVERFLOW'])) { $overflow = strtolower($p['OVERFLOW']); } + if (strtolower($p['POSITION']) == 'fixed') { + $cont_w = $this->pgwidth; // $this->blk[0]['inner_width']; + $cont_h = $this->h - $this->tMargin - $this->bMargin; + $cont_x = $this->lMargin; + $cont_y = $this->tMargin; + } + else { + $cont_w = $this->w; // ABSOLUTE; + $cont_h = $this->h; + $cont_x = 0; + $cont_y = 0; + } + + // Pass on in-line properties to the innerhtml + $css = ''; + if (isset($p['TEXT-ALIGN'])) { $css .= 'text-align: '.strtolower($p['TEXT-ALIGN']).'; '; } + if (isset($p['TEXT-TRANSFORM'])) { $css .= 'text-transform: '.strtolower($p['TEXT-TRANSFORM']).'; '; } + if (isset($p['TEXT-INDENT'])) { $css .= 'text-indent: '.strtolower($p['TEXT-INDENT']).'; '; } + if (isset($p['TEXT-DECORATION'])) { $css .= 'text-decoration: '.strtolower($p['TEXT-DECORATION']).'; '; } + if (isset($p['FONT-FAMILY'])) { $css .= 'font-family: '.strtolower($p['FONT-FAMILY']).'; '; } + if (isset($p['FONT-STYLE'])) { $css .= 'font-style: '.strtolower($p['FONT-STYLE']).'; '; } + if (isset($p['FONT-WEIGHT'])) { $css .= 'font-weight: '.strtolower($p['FONT-WEIGHT']).'; '; } + if (isset($p['FONT-SIZE'])) { $css .= 'font-size: '.strtolower($p['FONT-SIZE']).'; '; } + if (isset($p['LINE-HEIGHT'])) { $css .= 'line-height: '.strtolower($p['LINE-HEIGHT']).'; '; } + if (isset($p['TEXT-SHADOW'])) { $css .= 'text-shadow: '.strtolower($p['TEXT-SHADOW']).'; '; } + if (isset($p['LETTER-SPACING'])) { $css .= 'letter-spacing: '.strtolower($p['LETTER-SPACING']).'; '; } + if (isset($p['FONT-VARIANT'])) { $css .= 'font-variant: '.strtolower($p['FONT-VARIANT']).'; '; } + if (isset($p['COLOR'])) { $css .= 'color: '.strtolower($p['COLOR']).'; '; } + if (isset($p['Z-INDEX'])) { $css .= 'z-index: '.$p['Z-INDEX'].'; '; } // mPDF 5.6.01 + if ($css) { + $html = '
    '.$html.'
    '; + } + // Copy over (only) the properties to set for border and background + $pb = array(); + $pb['MARGIN-TOP'] = $p['MARGIN-TOP']; + $pb['MARGIN-RIGHT'] = $p['MARGIN-RIGHT']; + $pb['MARGIN-BOTTOM'] = $p['MARGIN-BOTTOM']; + $pb['MARGIN-LEFT'] = $p['MARGIN-LEFT']; + $pb['PADDING-TOP'] = $p['PADDING-TOP']; + $pb['PADDING-RIGHT'] = $p['PADDING-RIGHT']; + $pb['PADDING-BOTTOM'] = $p['PADDING-BOTTOM']; + $pb['PADDING-LEFT'] = $p['PADDING-LEFT']; + $pb['BORDER-TOP'] = $p['BORDER-TOP']; + $pb['BORDER-RIGHT'] = $p['BORDER-RIGHT']; + $pb['BORDER-BOTTOM'] = $p['BORDER-BOTTOM']; + $pb['BORDER-LEFT'] = $p['BORDER-LEFT']; + $pb['BORDER-TOP-LEFT-RADIUS-H'] = $p['BORDER-TOP-LEFT-RADIUS-H']; + $pb['BORDER-TOP-LEFT-RADIUS-V'] = $p['BORDER-TOP-LEFT-RADIUS-V']; + $pb['BORDER-TOP-RIGHT-RADIUS-H'] = $p['BORDER-TOP-RIGHT-RADIUS-H']; + $pb['BORDER-TOP-RIGHT-RADIUS-V'] = $p['BORDER-TOP-RIGHT-RADIUS-V']; + $pb['BORDER-BOTTOM-LEFT-RADIUS-H'] = $p['BORDER-BOTTOM-LEFT-RADIUS-H']; + $pb['BORDER-BOTTOM-LEFT-RADIUS-V'] = $p['BORDER-BOTTOM-LEFT-RADIUS-V']; + $pb['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-H']; + $pb['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-V']; + if (isset($p['BACKGROUND-COLOR'])) { $pb['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } + if (isset($p['BOX-SHADOW'])) { $pb['BOX-SHADOW'] = $p['BOX-SHADOW']; } +/*-- BACKGROUNDS --*/ + if (isset($p['BACKGROUND-IMAGE'])) { $pb['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } + if (isset($p['BACKGROUND-IMAGE-RESIZE'])) { $pb['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } + if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $pb['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } + if (isset($p['BACKGROUND-REPEAT'])) { $pb['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } + if (isset($p['BACKGROUND-POSITION'])) { $pb['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } + if (isset($p['BACKGROUND-GRADIENT'])) { $pb['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } + if (isset($p['BACKGROUND-SIZE'])) { $pb['BACKGROUND-SIZE'] = $p['BACKGROUND-SIZE']; } // mPDF 5.6.12 + if (isset($p['BACKGROUND-ORIGIN'])) { $pb['BACKGROUND-ORIGIN'] = $p['BACKGROUND-ORIGIN']; } // mPDF 5.6.12 + if (isset($p['BACKGROUND-CLIP'])) { $pb['BACKGROUND-CLIP'] = $p['BACKGROUND-CLIP']; } // mPDF 5.6.12 + +/*-- END BACKGROUNDS --*/ + + $this->setCSS($pb,'BLOCK',$tag); + + //================================================================ + $bbox_br = $this->blk[1]['border_right']['w']; + $bbox_bl = $this->blk[1]['border_left']['w']; + $bbox_bt = $this->blk[1]['border_top']['w']; + $bbox_bb = $this->blk[1]['border_bottom']['w']; + $bbox_pr = $this->blk[1]['padding_right']; + $bbox_pl = $this->blk[1]['padding_left']; + $bbox_pt = $this->blk[1]['padding_top']; + $bbox_pb = $this->blk[1]['padding_bottom']; + $bbox_mr = $this->blk[1]['margin_right']; + if (strtolower($p['MARGIN-RIGHT'])=='auto') { $bbox_mr = 'auto'; } + $bbox_ml = $this->blk[1]['margin_left']; + if (strtolower($p['MARGIN-LEFT'])=='auto') { $bbox_ml = 'auto'; } + $bbox_mt = $this->blk[1]['margin_top']; + if (strtolower($p['MARGIN-TOP'])=='auto') { $bbox_mt = 'auto'; } + $bbox_mb = $this->blk[1]['margin_bottom']; + if (strtolower($p['MARGIN-BOTTOM'])=='auto') { $bbox_mb = 'auto'; } + if (isset($p['LEFT']) && strtolower($p['LEFT'])!='auto') { $bbox_left = $this->ConvertSize($p['LEFT'], $cont_w, $this->FontSize,false); } + else { $bbox_left = 'auto'; } + if (isset($p['TOP']) && strtolower($p['TOP'])!='auto') { $bbox_top = $this->ConvertSize($p['TOP'], $cont_h, $this->FontSize,false); } + else { $bbox_top = 'auto'; } + if (isset($p['RIGHT']) && strtolower($p['RIGHT'])!='auto') { $bbox_right = $this->ConvertSize($p['RIGHT'], $cont_w, $this->FontSize,false); } + else { $bbox_right = 'auto'; } + if (isset($p['BOTTOM']) && strtolower($p['BOTTOM'])!='auto') { $bbox_bottom = $this->ConvertSize($p['BOTTOM'], $cont_h, $this->FontSize,false); } + else { $bbox_bottom = 'auto'; } + if (isset($p['WIDTH']) && strtolower($p['WIDTH'])!='auto') { $inner_w = $this->ConvertSize($p['WIDTH'], $cont_w, $this->FontSize,false); } + else { $inner_w = 'auto'; } + if (isset($p['HEIGHT']) && strtolower($p['HEIGHT'])!='auto') { $inner_h = $this->ConvertSize($p['HEIGHT'], $cont_h, $this->FontSize,false); } + else { $inner_h = 'auto'; } + + // If bottom or right pos are set and not left / top - save this to adjust rotated block later + if ($rotate) { + if ($bbox_left === 'auto' && $bbox_right !== 'auto') { $rot_rpos = $bbox_right; } + else { $rot_rpos = false; } + if ($bbox_top === 'auto' && $bbox_bottom !== 'auto') { $rot_bpos = $bbox_bottom; } + else { $rot_bpos = false; } + } + + //================================================================ + if ($checkinnerhtml=='' && $inner_h==='auto') { $inner_h = 0.0001; } + if ($checkinnerhtml=='' && $inner_w==='auto') { $inner_w = 2*$this->GetCharWidth('W',false); } + //================================================================ + // Algorithm from CSS2.1 See http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height + // mPD 5.3.14 + // Special case (not CSS) if all not specified, centre vertically on page + if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom==='auto' && $bbox_mt==='auto' && $bbox_mb==='auto') { + $bbox_top_orig = $bbox_top; + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + $bbox_top = $orig_y0 - $bbox_mt - $cont_y; + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + // mPD 5.3.14 + else if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom==='auto') { + $bbox_top_orig = $bbox_top = $orig_y0 - $cont_y; + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + else if ($bbox_top!=='auto' && $inner_h!=='auto' && $bbox_bottom!=='auto') { + if ($bbox_mt==='auto' && $bbox_mb==='auto') { + $x = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; + $bbox_mt = $bbox_mb = ($x/2); + } + else if ($bbox_mt==='auto') { + $bbox_mt = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + else if ($bbox_mb==='auto') { + $bbox_mb = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; + } + else { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + } + else { + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom!=='auto') { + // solve for $bbox_top when content_h known - $inner_h=='auto' && $bbox_top =='auto' + } + else if ($bbox_top==='auto' && $bbox_bottom==='auto' && $inner_h!=='auto') { + $bbox_top = $orig_y0 - $bbox_mt - $cont_y; + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + else if ($inner_h==='auto' && $bbox_bottom==='auto' && $bbox_top!=='auto') { + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + else if ($bbox_top==='auto' && $inner_h!=='auto' && $bbox_bottom!=='auto') { + $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; + } + else if ($inner_h==='auto' && $bbox_top!=='auto' && $bbox_bottom!=='auto') { + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; + } + else if ($bbox_bottom==='auto' && $bbox_top!=='auto' && $inner_h!=='auto') { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + } + + // THEN DO SAME FOR WIDTH + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width + if ($bbox_left==='auto' && $inner_w==='auto' && $bbox_right==='auto') { + if ($bbox_ml==='auto') { $bbox_ml = 0; } + if ($bbox_mr==='auto') { $bbox_mr = 0; } + // IF containing element RTL, should set $bbox_right + $bbox_left = $orig_x0 - $bbox_ml - $cont_x; + // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' + } + else if ($bbox_left!=='auto' && $inner_w!=='auto' && $bbox_right!=='auto') { + if ($bbox_ml==='auto' && $bbox_mr==='auto') { + $x = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; + $bbox_ml = $bbox_mr = ($x/2); + } + else if ($bbox_ml==='auto') { + $bbox_ml = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; + } + else if ($bbox_mr==='auto') { + $bbox_mr = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; + } + else { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + } + else { + if ($bbox_ml==='auto') { $bbox_ml = 0; } + if ($bbox_mr==='auto') { $bbox_mr = 0; } + if ($bbox_left==='auto' && $inner_w==='auto' && $bbox_right!=='auto') { + // solve for $bbox_left when content_w known - $inner_w=='auto' && $bbox_left =='auto' + } + else if ($bbox_left==='auto' && $bbox_right==='auto' && $inner_w!=='auto') { + // IF containing element RTL, should set $bbox_right + $bbox_left = $orig_x0 - $bbox_ml - $cont_x; + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + else if ($inner_w==='auto' && $bbox_right==='auto' && $bbox_left!=='auto') { + // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' + } + else if ($bbox_left==='auto' && $inner_w!=='auto' && $bbox_right!=='auto') { + $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + } + else if ($inner_w==='auto' && $bbox_left!=='auto' && $bbox_right!=='auto') { + $inner_w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + } + else if ($bbox_right==='auto' && $bbox_left!=='auto' && $inner_w!=='auto') { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + } + + //================================================================ + //================================================================ +/*-- BACKGROUNDS --*/ + if (isset($pb['BACKGROUND-IMAGE']) && $pb['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($pb, $this->blk[1]['inner_width']); + if ($ret) { $this->blk[1]['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + //================================================================ + $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; + // Set (temporary) values for x y w h to do first paint, if values are auto + if ($inner_h==='auto' && $bbox_top==='auto') { + $y = $cont_y + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - ($bbox_bottom + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); + } + else if ($inner_h==='auto' && $bbox_bottom==='auto') { + $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - ($bbox_top + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); + } + if ($inner_w==='auto' && $bbox_left==='auto') { + $x = $cont_x + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - ($bbox_right + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); + } + else if ($inner_w==='auto' && $bbox_right==='auto') { + $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - ($bbox_left + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + $saved_block1 = $this->blk[1]; + unset($p); + unset($pb); + //================================================================ + if ($inner_w==='auto') { // do a first write + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->maxPosR = 0; + $this->maxPosL = $this->w; // For RTL + $this->WriteHTML($html , 4); + $inner_w = $this->maxPosR - $this->lMargin; + if ($bbox_right==='auto') { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + else if ($bbox_left==='auto') { + $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + $bbox_x = $cont_x + $bbox_left + $bbox_ml ; + $inner_x = $bbox_x + $bbox_bl + $bbox_pl; + $x = $inner_x; + } + $w = $inner_w; + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + } + + if ($inner_h==='auto') { // do a first write + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); + $inner_h = $this->y - $y; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if (($this->y + $bbox_pb + $bbox_bb) > ($cont_y + $cont_h)) { + $adj = ($this->y + $bbox_pb + $bbox_bb) - ($cont_y + $cont_h); + $inner_h -= $adj; + } + } + if ($bbox_bottom==='auto' && $bbox_top_orig==='auto') { + $bbox_bottom = $bbox_top = ($cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb)/2; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if ($bbox_top < 0) { + $bbox_top = 0; + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $inner_y = $bbox_y + $bbox_bt + $bbox_pt; + $y = $inner_y; + + } + else if ($bbox_bottom==='auto') { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb; + } + else if ($bbox_top==='auto') { + $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if ($bbox_top < 0) { + $bbox_top = 0; + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $inner_y = $bbox_y + $bbox_bt + $bbox_pt; + $y = $inner_y; + } + $h = $inner_h; + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + } + $inner_w = $w; + $inner_h = $h; + + } + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $actual_h = $this->y - $y; + $use_w = $w; + $use_h = $h; + $ratio = $actual_h / $use_w; + + if ($overflow!='hidden' && $overflow!='visible') { + $target = $h/$w; + if (($ratio / $target ) > 1) { + $nl = CEIL($actual_h / $this->lineheight); + $l = $use_w * $nl; + $est_w = sqrt(($l * $this->lineheight) / $target) * 0.8; + $use_w += ($est_w - $use_w) - ($w/100); + } + $bpcstart = ($ratio / $target); + $bpcctr = 1; + while(($ratio / $target ) > 1) { + + if ($this->progressBar) { $this->UpdateProgressBar(4,intval(100/($ratio/$target)),('Auto-sizing fixed-position block: '.$bpcctr++)); } // *PROGRESS-BAR* + + $this->x = $x; + $this->y = $y; + + if (($ratio / $target) > 1.5 || ($ratio / $target) < 0.6) { + $use_w += ($w/$this->incrementFPR1); + } + else if (($ratio / $target) > 1.2 || ($ratio / $target) < 0.85) { + $use_w += ($w/$this->incrementFPR2); + } + else if (($ratio / $target) > 1.1 || ($ratio / $target) < 0.91) { + $use_w += ($w/$this->incrementFPR3); + } + else { + $use_w += ($w/$this->incrementFPR4); + } + + $use_h = $use_w * $target ; + $this->rMargin=$this->w - $use_w - $x; + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $actual_h = $this->y - $y; + $ratio = $actual_h / $use_w; + } + if ($this->progressBar) { $this->UpdateProgressBar(4,'100',' '); } // *PROGRESS-BAR* + } + $shrink_f = $w/$use_w; + + //================================================================ + + $this->pages[$this->page] .= '___BEFORE_BORDERS___'; + $block_s = $this->PrintPageBackgrounds(); // Save to print later inside clipping path + $this->pageBackgrounds = array(); + + //================================================================ + + if ($rotate) { + $prerotw = $bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br; + $preroth = $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; + $rot_start = " q\n"; + if ($rotate == 90) { + if ($rot_rpos !== false) { $adjw = $prerotw; } // width before rotation + else { $adjw = $preroth; } // height before rotation + if ($rot_bpos !== false) { $adjh = -$prerotw + $preroth; } + else { $adjh = 0; } + } + else { + if ($rot_rpos !== false) { $adjw = $prerotw - $preroth; } + else { $adjw = 0; } + if ($rot_bpos !== false) { $adjh = $preroth; } // height before rotation + else { $adjh = $prerotw; } // width before rotation + } + $rot_start .= $this->transformTranslate($adjw, $adjh, true)."\n"; + $rot_start .= $this->transformRotate($rotate, $bbox_x, $bbox_y, true)."\n"; + $rot_end = " Q\n"; + } + else { + $rot_start = ''; + $rot_end = ''; + } + + //================================================================ + if (!empty($bounding)) { + // WHEN HEIGHT // BOTTOM EDGE IS KNOWN and $this->y is set to the bottom + // Re-instate saved $this->blk[1] + $this->blk[1] = $saved_block1; + + // These are only needed when painting border/background + $this->blk[1]['width'] = $bbox_w = $cont_w - $bbox_left - $bbox_ml - $bbox_mr - $bbox_right; + $this->blk[1]['x0'] = $bbox_x; + $this->blk[1]['y0'] = $bbox_y; + $this->blk[1]['startpage'] = $this->page; + $this->blk[1]['y1'] = $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb ; + $this->_out($rot_start); // mPDF 5.0 + $this->PaintDivBB('',0,1); // Prints borders and sets backgrounds in $this->pageBackgrounds + $this->_out($rot_end); + } + + $s = $this->PrintPageBackgrounds(); + $s = $rot_start.$s.$rot_end; + $this->pages[$this->page] = preg_replace('/___BEFORE_BORDERS___/', "\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + + $this->_out($rot_start); + + // Clipping Output + if ($overflow=='hidden') { + //Bounding rectangle to clip + $clip_y1 = $this->y; + if (!empty($bounding) && ($this->y + $bbox_pb + $bbox_bb) > ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb )) { + $clip_y1 = ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb ) - ($bbox_pb + $bbox_bb); + } + //$op = 'W* n'; // Clipping + $op = 'W n'; // Clipping alternative mode + $this->_out("q"); + $ch = $clip_y1 - $y; + $this->_out(sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$ch*_MPDFK,$op)); + if (!empty($block_s)) { + $tmp = "q\n".sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$ch*_MPDFK,$op); + $tmp .= "\n".$block_s."\nQ"; + $block_s = $tmp ; + } + } + + + if (!empty($block_s)) { + if ($shrink_f != 1) { // i.e. autofit has resized the box + $tmp = "q\n".$this->transformScale(($shrink_f*100),($shrink_f*100), $x, $y, true); + $tmp .= "\n".$block_s."\nQ"; + $block_s = $tmp ; + } + $this->_out($block_s); + } + + + + if ($shrink_f != 1) { // i.e. autofit has resized the box + $this->StartTransform(); + $this->transformScale(($shrink_f*100),($shrink_f*100), $x, $y); + } + + $this->_out($this->headerbuffer); + + if ($shrink_f != 1) { // i.e. autofit has resized the box + $this->StopTransform(); + } + + if ($overflow=='hidden') { + //End clipping + $this->_out("Q"); + } + + $this->_out($rot_end); + + + // Page Links + foreach($this->HTMLheaderPageLinks AS $lk) { + if ($rotate) { + $tmp = $lk[2]; // Switch h - w + $lk[2] = $lk[3]; + $lk[3] = $tmp; + + $lx1 = (($lk[0]/_MPDFK)); + $ly1 = (($this->h-($lk[1]/_MPDFK))); + if ($rotate == 90) { + $adjx = -($lx1-$bbox_x) + ($preroth - ($ly1-$bbox_y)); + $adjy = -($ly1-$bbox_y) + ($lx1-$bbox_x); + $lk[2] = -$lk[2]; + } + else if ($rotate == -90) { + $adjx = -($lx1-$bbox_x) + ($ly1-$bbox_y); + $adjy = -($ly1-$bbox_y) - ($lx1-$bbox_x) + $prerotw; + $lk[3] = -$lk[3]; + } + if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } + if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } + $lx1 += $adjx; + $ly1 += $adjy; + + $lk[0] = $lx1*_MPDFK; + $lk[1] = ($this->h-$ly1)*_MPDFK; + } + if ($shrink_f != 1) { // i.e. autofit has resized the box + $lx1 = (($lk[0]/_MPDFK)-$x); + $lx2 = $x + ($lx1 * $shrink_f); + $lk[0] = $lx2*_MPDFK; + $ly1 = (($this->h-($lk[1]/_MPDFK))-$y); + $ly2 = $y + ($ly1 * $shrink_f); + $lk[1] = ($this->h-$ly2)*_MPDFK; + $lk[2] *= $shrink_f; // width + $lk[3] *= $shrink_f; // height + } + $this->PageLinks[$this->page][]=$lk; + } + + foreach($this->HTMLheaderPageForms AS $n=>$f) { + if ($shrink_f != 1) { // i.e. autofit has resized the box + $f['x'] = $x + (($f['x'] -$x) * $shrink_f); + $f['y'] = $y + (($f['y'] -$y) * $shrink_f); + $f['w'] *= $shrink_f; + $f['h'] *= $shrink_f; + $f['style']['fontsize'] *= $shrink_f; + } + $this->form->forms[$f['n']] = $f; + } + // Page Annotations + foreach($this->HTMLheaderPageAnnots AS $lk) { + if ($rotate) { + if ($rotate == 90) { + $adjx = -($lk['x']-$bbox_x) + ($preroth - ($lk['y']-$bbox_y)); + $adjy = -($lk['y']-$bbox_y) + ($lk['x']-$bbox_x); + } + else if ($rotate == -90) { + $adjx = -($lk['x']-$bbox_x) + ($lk['y']-$bbox_y); + $adjy = -($lk['y']-$bbox_y) - ($lk['x']-$bbox_x) + $prerotw; + } + if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } + if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } + $lk['x'] += $adjx; + $lk['y'] += $adjy; + } + if ($shrink_f != 1) { // i.e. autofit has resized the box + $lk['x'] = $x + (($lk['x']-$x) * $shrink_f); + $lk['y'] = $y + (($lk['y']-$y) * $shrink_f); + } + $this->PageAnnots[$this->page][]=$lk; + } + + // Restore + $this->headerbuffer = ''; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = $save_bgs; + $this->writingHTMLheader = false; + + $this->writingHTMLfooter = false; + $this->fullImageHeight = false; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->SetXY($save_x,$save_y) ; + $this->title2annots = $save_annots; // *ANNOTATIONS* + $this->InFooter = false; // turns back on autopagebreaks + $this->pageoutput[$this->page]=array(); + $this->pageoutput[$this->page]['Font']=''; +/*-- COLUMNS --*/ + if ($save_cols) { + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ +} +/*-- END CSS-POSITION --*/ + + + +function initialiseBlock(&$blk) { + $blk['margin_top'] = 0; + $blk['margin_left'] = 0; + $blk['margin_bottom'] = 0; + $blk['margin_right'] = 0; + $blk['padding_top'] = 0; + $blk['padding_left'] = 0; + $blk['padding_bottom'] = 0; + $blk['padding_right'] = 0; + $blk['border_top']['w'] = 0; + $blk['border_left']['w'] = 0; + $blk['border_bottom']['w'] = 0; + $blk['border_right']['w'] = 0; + $blk['hide'] = false; + $blk['outer_left_margin'] = 0; + $blk['outer_right_margin'] = 0; + $blk['cascadeCSS'] = array(); + $blk['block-align'] = false; + $blk['bgcolor'] = false; + $blk['page_break_after_avoid'] = false; + $blk['keep_block_together'] = false; + $blk['float'] = false; + $blk['line_height'] = ''; + $blk['margin_collapse'] = false; +} + + +function border_details($bd) { + $prop = preg_split('/\s+/',trim($bd)); + + if (isset($this->blk[$this->blklvl]['inner_width'])) { $refw = $this->blk[$this->blklvl]['inner_width']; } + else if (isset($this->blk[$this->blklvl-1]['inner_width'])) { $refw = $this->blk[$this->blklvl-1]['inner_width']; } + else { $refw = $this->w; } + if ( count($prop) == 1 ) { + $bsize = $this->ConvertSize($prop[0],$refw,$this->FontSize,false); + if ($bsize > 0) { + return array('s' => 1, 'w' => $bsize, 'c' => $this->ConvertColor(0), 'style'=>'solid'); + } + else { return array('w' => 0, 's' => 0); } + } + + else if (count($prop) == 2 ) { + // 1px solid + if (in_array($prop[1],$this->borderstyles) || $prop[1] == 'none' || $prop[1] == 'hidden' ) { $prop[2] = ''; } + // solid #000000 + else if (in_array($prop[0],$this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { $prop[0] = ''; $prop[1] = $prop[0]; $prop[2] = $prop[1]; } + // 1px #000000 + else { $prop[1] = ''; $prop[2] = $prop[1]; } + } + else if ( count($prop) == 3 ) { + // Change #000000 1px solid to 1px solid #000000 (proper) + if (substr($prop[0],0,1) == '#') { $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $prop[2]; $prop[2] = $tmp; } + // Change solid #000000 1px to 1px solid #000000 (proper) + else if (substr($prop[0],1,1) == '#') { $tmp = $prop[1]; $prop[0] = $prop[2]; $prop[1] = $prop[0]; $prop[2] = $tmp; } + // Change solid 1px #000000 to 1px solid #000000 (proper) + else if (in_array($prop[0],$this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { + $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $tmp; + } + } + else { return array(); } + // Size + $bsize = $this->ConvertSize($prop[0],$refw,$this->FontSize,false); + //color + $coul = $this->ConvertColor($prop[2]); // returns array + // Style + $prop[1] = strtolower($prop[1]); + if (in_array($prop[1],$this->borderstyles) && $bsize > 0) { $on = 1; } + else if ($prop[1] == 'hidden') { $on = 1; $bsize = 0; $coul = ''; } + else if ($prop[1] == 'none') { $on = 0; $bsize = 0; $coul = ''; } + else { $on = 0; $bsize = 0; $coul = ''; $prop[1] = ''; } + return array('s' => $on, 'w' => $bsize, 'c' => $coul, 'style'=> $prop[1] ); +} + + + +/*-- END HTML-CSS --*/ + + +// Return either a number (factor) - based on current set fontsize (if % or em) - or exact lineheight (with 'mm' after it) +function fixLineheight($v) { + $lh = false; + if (preg_match('/^[0-9\.,]*$/',$v) && $v >= 0) { return ($v + 0); } + else if (strtoupper($v) == 'NORMAL') { + return $this->normalLineheight; + } + else { + $tlh = $this->ConvertSize($v,$this->FontSize,$this->FontSize,true); + if ($tlh) { return ($tlh.'mm'); } + } + return $this->normalLineheight; +} + + +/*-- BORDER-RADIUS --*/ +function _borderPadding($a, $b, &$px, &$py) { + // $px and py are padding long axis (x) and short axis (y) + $added = 0; // extra padding + + $x = $a-$px; + $y = $b-$py; + // Check if Falls within ellipse of border radius + if ( ( (($x+$added)*($x+$added))/($a*$a) + (($y+$added)*($y+$added))/($b*$b) ) <=1 ) { return false; } + + $t = atan2($y,$x); + + $newx = $b / sqrt((($b*$b)/($a*$a)) + ( tan($t) * tan($t) ) ); + $newy = $a / sqrt((($a*$a)/($b*$b)) + ( (1/tan($t)) * (1/tan($t)) ) ); + $px = max($px, $a - $newx + $added); + $py = max($py, $b - $newy + $added); +} +/*-- END BORDER-RADIUS --*/ + + + +/*-- HTML-CSS --*/ + + +/*-- CSS-PAGE --*/ +function SetPagedMediaCSS($name='', $first, $oddEven) { + if ($oddEven == 'E') { + if ($this->directionality=='rtl') { $side = 'R'; } + else { $side = 'L'; } + } + else { + if ($this->directionality=='rtl') { $side = 'L'; } + else { $side = 'R'; } + } + $name = strtoupper($name); + $p = array(); + $p['SIZE'] = 'AUTO'; + + // Uses mPDF original margins as default + $p['MARGIN-RIGHT'] = strval($this->orig_rMargin).'mm'; + $p['MARGIN-LEFT'] = strval($this->orig_lMargin).'mm'; + $p['MARGIN-TOP'] = strval($this->orig_tMargin).'mm'; + $p['MARGIN-BOTTOM'] = strval($this->orig_bMargin).'mm'; + $p['MARGIN-HEADER'] = strval($this->orig_hMargin).'mm'; + $p['MARGIN-FOOTER'] = strval($this->orig_fMargin).'mm'; + + // Basic page + selector + if (isset($this->cssmgr->CSS['@PAGE'])) { $zp = $this->cssmgr->CSS['@PAGE']; } + else { $zp = array(); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + if (isset($p['EVEN-HEADER-NAME']) && $oddEven=='E') { + $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); + } + if (isset($p['ODD-HEADER-NAME']) && $oddEven!='E') { + $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); + } + if (isset($p['EVEN-FOOTER-NAME']) && $oddEven=='E') { + $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); + } + if (isset($p['ODD-FOOTER-NAME']) && $oddEven!='E') { + $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); + } + + // If right/Odd page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>RIGHT']) && $side=='R') { + $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>RIGHT']; + } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If left/Even page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>LEFT']) && $side=='L') { + $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>LEFT']; + } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If first page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>FIRST']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named page + if ($name) { + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name])) { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name]; } + else { $zp = array(); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + if (isset($p['EVEN-HEADER-NAME']) && $oddEven=='E') { + $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); + } + if (isset($p['ODD-HEADER-NAME']) && $oddEven!='E') { + $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); + } + if (isset($p['EVEN-FOOTER-NAME']) && $oddEven=='E') { + $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); + } + if (isset($p['ODD-FOOTER-NAME']) && $oddEven!='E') { + $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); + } + + // If named right/Odd page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>RIGHT']) && $side=='R') { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>RIGHT']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named left/Even page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>LEFT']) && $side=='L') { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>LEFT']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named first page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>FIRST']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + } + + $orientation = $mgl = $mgr = $mgt = $mgb = $mgh = $mgf = ''; + $header = $footer = ''; + $resetpagenum = $pagenumstyle = $suppress = ''; + $marks = ''; + $bg = array(); + + $newformat = ''; + + + if (isset($p['SHEET-SIZE']) && is_array($p['SHEET-SIZE'])) { + $newformat = $p['SHEET-SIZE']; + if ($newformat[0] > $newformat[1]) { // landscape + $newformat = array_reverse($newformat); + $p['ORIENTATION'] = 'L'; + } + else { $p['ORIENTATION'] = 'P'; } + $this->_setPageSize($newformat, $p['ORIENTATION']); + } + + if (isset($p['SIZE']) && is_array($p['SIZE']) && !$newformat) { + if ($p['SIZE']['W'] > $p['SIZE']['H']) { $p['ORIENTATION'] = 'L'; } + else { $p['ORIENTATION'] = 'P'; } + } + if (is_array($p['SIZE'])) { + if ($p['SIZE']['W'] > $this->fw) { $p['SIZE']['W'] = $this->fw; } // mPD 4.2 use fw not fPt + if ($p['SIZE']['H'] > $this->fh) { $p['SIZE']['H'] = $this->fh; } + if (($p['ORIENTATION']==$this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION']=='P')) { + $outer_width_LR = ($this->fw - $p['SIZE']['W'])/2; + $outer_width_TB = ($this->fh - $p['SIZE']['H'])/2; + } + else { + $outer_width_LR = ($this->fh - $p['SIZE']['W'])/2; + $outer_width_TB = ($this->fw - $p['SIZE']['H'])/2; + } + $pgw = $p['SIZE']['W']; + $pgh = $p['SIZE']['H']; + } + else { // AUTO LANDSCAPE PORTRAIT + $outer_width_LR = 0; + $outer_width_TB = 0; + if (!$newformat) { + if (strtoupper($p['SIZE']) == 'AUTO') { $p['ORIENTATION']=$this->DefOrientation; } + else if (strtoupper($p['SIZE']) == 'LANDSCAPE') { $p['ORIENTATION']='L'; } + else { $p['ORIENTATION']='P'; } + } + if (($p['ORIENTATION']==$this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION']=='P')) { + $pgw = $this->fw; + $pgh = $this->fh; + } + else { + $pgw = $this->fh; + $pgh = $this->fw; + } + } + + if (isset($p['HEADER']) && $p['HEADER']) { $header = $p['HEADER']; } + if (isset($p['FOOTER']) && $p['FOOTER']) { $footer = $p['FOOTER']; } + if (isset($p['RESETPAGENUM']) && $p['RESETPAGENUM']) { $resetpagenum = $p['RESETPAGENUM']; } + if (isset($p['PAGENUMSTYLE']) && $p['PAGENUMSTYLE']) { $pagenumstyle = $p['PAGENUMSTYLE']; } + if (isset($p['SUPPRESS']) && $p['SUPPRESS']) { $suppress = $p['SUPPRESS']; } + + if (preg_match('/cross/i', $p['MARKS']) && preg_match('/crop/i', $p['MARKS'])) { $marks = 'CROPCROSS'; } + else if (strtoupper($p['MARKS']) == 'CROP') { $marks = 'CROP'; } + else if (strtoupper($p['MARKS']) == 'CROSS') { $marks = 'CROSS'; } + + + if (isset($p['BACKGROUND-COLOR']) && $p['BACKGROUND-COLOR']) { $bg['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } +/*-- BACKGROUNDS --*/ + if (isset($p['BACKGROUND-GRADIENT']) && $p['BACKGROUND-GRADIENT']) { $bg['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } + if (isset($p['BACKGROUND-IMAGE']) && $p['BACKGROUND-IMAGE']) { $bg['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } + if (isset($p['BACKGROUND-REPEAT']) && $p['BACKGROUND-REPEAT']) { $bg['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } + if (isset($p['BACKGROUND-POSITION']) && $p['BACKGROUND-POSITION']) { $bg['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } + if (isset($p['BACKGROUND-IMAGE-RESIZE']) && $p['BACKGROUND-IMAGE-RESIZE']) { $bg['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } + if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $bg['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } +/*-- END BACKGROUNDS --*/ + + if (isset($p['MARGIN-LEFT'])) { $mgl = $this->ConvertSize($p['MARGIN-LEFT'],$pgw) + $outer_width_LR; } + if (isset($p['MARGIN-RIGHT'])) { $mgr = $this->ConvertSize($p['MARGIN-RIGHT'],$pgw) + $outer_width_LR; } + if (isset($p['MARGIN-BOTTOM'])) { $mgb = $this->ConvertSize($p['MARGIN-BOTTOM'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-TOP'])) { $mgt = $this->ConvertSize($p['MARGIN-TOP'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-HEADER'])) { $mgh = $this->ConvertSize($p['MARGIN-HEADER'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-FOOTER'])) { $mgf = $this->ConvertSize($p['MARGIN-FOOTER'],$pgh) + $outer_width_TB; } + + if (isset($p['ORIENTATION']) && $p['ORIENTATION']) { $orientation = $p['ORIENTATION']; } + $this->page_box['outer_width_LR'] = $outer_width_LR; // Used in MARKS:crop etc. + $this->page_box['outer_width_TB'] = $outer_width_TB; + + return array($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$header,$footer,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat); +} +/*-- END CSS-PAGE --*/ + + + +/*-- CSS-FLOAT --*/ +// Added mPDF 3.0 Float DIV - CLEAR +function ClearFloats($clear, $blklvl=0) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($blklvl,true); + $end = $currpos = ($this->page*1000 + $this->y); + if ($clear == 'BOTH' && ($l_exists || $r_exists)) { + $this->pageoutput[$this->page] = array(); + $end = max($l_max, $r_max, $currpos); + } + else if ($clear == 'RIGHT' && $r_exists) { + $this->pageoutput[$this->page] = array(); + $end = max($r_max, $currpos); + } + else if ($clear == 'LEFT' && $l_exists ) { + $this->pageoutput[$this->page] = array(); + $end = max($l_max, $currpos); + } + else { return; } + $old_page = $this->page; + $new_page = intval($end/1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + } + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + $this->y = (($end*1000) % 1000000)/1000; // mod changes operands to integers before processing +} + + +// Added mPDF 3.0 Float DIV +function GetFloatDivInfo($blklvl=0,$clear=false) { + // If blklvl specified, only returns floats at that level - for ClearFloats + $l_exists = false; + $r_exists = false; + $l_max = 0; + $r_max = 0; + $l_width = 0; + $r_width = 0; + if (count($this->floatDivs)) { + $currpos = ($this->page*1000 + $this->y); + foreach($this->floatDivs AS $f) { + if (($clear && $f['blockContext'] == $this->blk[$blklvl]['blockContext']) || (!$clear && $currpos >= $f['startpos'] && $currpos < ($f['endpos']-0.001) && $f['blklvl'] > $blklvl && $f['blockContext'] == $this->blk[$blklvl]['blockContext'])) { + if ($f['side']=='L') { + $l_exists= true; + $l_max = max($l_max, $f['endpos']); + $l_width = max($l_width , $f['w']); + } + if ($f['side']=='R') { + $r_exists= true; + $r_max = max($r_max, $f['endpos']); + $r_width = max($r_width , $f['w']); + } + } + } + } + return array($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width); +} +/*-- END CSS-FLOAT --*/ + + + + +function OpenTag($tag,$attr) +{ + + // What this gets: < $tag $attr['WIDTH']="90px" > does not get content here + // Correct tags where HTML specifies optional end tags, + // and/or does not allow nesting e.g. P inside P, or + if ($this->allow_html_optional_endtags) { + if (($tag == 'P' || $tag == 'DIV' || $tag == 'H1' || $tag == 'H2' || $tag == 'H3' || $tag == 'H4' || $tag == 'H5' || $tag == 'H6' || $tag == 'UL' || $tag == 'OL' || $tag == 'TABLE' || $tag=='PRE' || $tag=='FORM' || $tag=='ADDRESS' || $tag=='BLOCKQUOTE' || $tag=='CENTER' || $tag=='DL' || $tag == 'HR' ) && $this->lastoptionaltag == 'P') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DD' && $this->lastoptionaltag == 'DD') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DD' && $this->lastoptionaltag == 'DT') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DT' && $this->lastoptionaltag == 'DD') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DT' && $this->lastoptionaltag == 'DT') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'LI' && $this->lastoptionaltag == 'LI') { $this->CloseTag($this->lastoptionaltag ); } + if (($tag == 'TD' || $tag == 'TH') && $this->lastoptionaltag == 'TD') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if (($tag == 'TD' || $tag == 'TH') && $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TR') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TD') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); $this->CloseTag('THEAD'); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); $this->CloseTag('THEAD'); } // *TABLES* + if ($tag == 'OPTION' && $this->lastoptionaltag == 'OPTION') { $this->CloseTag($this->lastoptionaltag ); } + } + + $align = array('left'=>'L','center'=>'C','right'=>'R','top'=>'T','text-top'=>'TT','middle'=>'M','baseline'=>'BS','bottom'=>'B','text-bottom'=>'TB','justify'=>'J'); + + $this->ignorefollowingspaces=false; + + //Opening tag + switch($tag){ + + case 'DOTTAB': + $objattr = array(); + $objattr['type'] = 'dottab'; + $dots=str_repeat('.', 3)." "; // minimum number of dots + $objattr['width'] = $this->GetStringWidth($dots); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['height'] = 0; + $objattr['colorarray'] = $this->colorarray; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + // mPDF 5.6.19 + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); // mPDF 5.6.33 + if (isset($properties['OUTDENT'])) { // mPDF 5.6.33 + $objattr['outdent'] = $this->ConvertSize($properties['OUTDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + else if (isset($attr['OUTDENT'])) { + $objattr['outdent'] = $this->ConvertSize($attr['OUTDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + else { $objattr['outdent'] = 0; } + + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + + $e = "\xbb\xa4\xactype=dottab,objattr=".serialize($objattr)."\xbb\xa4\xac"; +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + $this->_saveCellTextBuffer($e); + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e); + } // *TABLES* + break; + + case 'PAGEHEADER': + case 'PAGEFOOTER': + $this->ignorefollowingspaces = true; + if ($attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + + if ($tag=='PAGEHEADER') { $p = &$this->pageheaders[$pname]; } + else { $p = &$this->pagefooters[$pname]; } + + $p['L']=array(); + $p['C']=array(); + $p['R']=array(); + $p['L']['font-style'] = ''; + $p['C']['font-style'] = ''; + $p['R']['font-style'] = ''; + + if (isset($attr['CONTENT-LEFT'])) { + $p['L']['content'] = $attr['CONTENT-LEFT']; + } + if (isset($attr['CONTENT-CENTER'])) { + $p['C']['content'] = $attr['CONTENT-CENTER']; + } + if (isset($attr['CONTENT-RIGHT'])) { + $p['R']['content'] = $attr['CONTENT-RIGHT']; + } + + if (isset($attr['HEADER-STYLE']) || isset($attr['FOOTER-STYLE'])) { // font-family,size,weight,style,color + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE']); } + if (isset($properties['FONT-FAMILY'])) { + $p['L']['font-family'] = $properties['FONT-FAMILY']; + $p['C']['font-family'] = $properties['FONT-FAMILY']; + $p['R']['font-family'] = $properties['FONT-FAMILY']; + } + if (isset($properties['FONT-SIZE'])) { + $p['L']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + $p['C']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + $p['R']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { + $p['L']['font-style'] = 'B'; + $p['C']['font-style'] = 'B'; + $p['R']['font-style'] = 'B'; + } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { + $p['L']['font-style'] .= 'I'; + $p['C']['font-style'] .= 'I'; + $p['R']['font-style'] .= 'I'; + } + if (isset($properties['COLOR'])) { + $p['L']['color'] = $properties['COLOR']; + $p['C']['color'] = $properties['COLOR']; + $p['R']['color'] = $properties['COLOR']; + } + } + if (isset($attr['HEADER-STYLE-LEFT']) || isset($attr['FOOTER-STYLE-LEFT'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-LEFT']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-LEFT']); } + if (isset($properties['FONT-FAMILY'])) { $p['L']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['L']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['L']['font-style'] ='B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['L']['font-style'] .='I'; } + if (isset($properties['COLOR'])) { $p['L']['color'] = $properties['COLOR']; } + } + if (isset($attr['HEADER-STYLE-CENTER']) || isset($attr['FOOTER-STYLE-CENTER'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-CENTER']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-CENTER']); } + if (isset($properties['FONT-FAMILY'])) { $p['C']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['C']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['C']['font-style'] = 'B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['C']['font-style'] .= 'I'; } + if (isset($properties['COLOR'])) { $p['C']['color'] = $properties['COLOR']; } + } + if (isset($attr['HEADER-STYLE-RIGHT']) || isset($attr['FOOTER-STYLE-RIGHT'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-RIGHT']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-RIGHT']); } + if (isset($properties['FONT-FAMILY'])) { $p['R']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['R']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['R']['font-style'] = 'B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['R']['font-style'] .= 'I'; } + if (isset($properties['COLOR'])) { $p['R']['color'] = $properties['COLOR']; } + } + if (isset($attr['LINE']) && $attr['LINE']) { // 0|1|on|off + if ($attr['LINE']=='1' || strtoupper($attr['LINE'])=='ON') { $lineset=1; } + else { $lineset=0; } + $p['line'] = $lineset; + } + break; + + +/*-- HTMLHEADERS-FOOTERS --*/ + case 'SETHTMLPAGEHEADER': + case 'SETHTMLPAGEFOOTER': + $this->ignorefollowingspaces = true; + if (isset($attr['NAME']) && $attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + if (isset($attr['PAGE']) && $attr['PAGE']) { // O|odd|even|E|ALL|[blank] + if (strtoupper($attr['PAGE'])=='O' || strtoupper($attr['PAGE'])=='ODD') { $side='odd'; } + else if (strtoupper($attr['PAGE'])=='E' || strtoupper($attr['PAGE'])=='EVEN') { $side='even'; } + else if (strtoupper($attr['PAGE'])=='ALL') { $side='both'; } + else { $side='odd'; } + } + else { $side='odd'; } + if (isset($attr['VALUE']) && $attr['VALUE']) { // -1|1|on|off + if ($attr['VALUE']=='1' || strtoupper($attr['VALUE'])=='ON') { $set=1; } + else if ($attr['VALUE']=='-1' || strtoupper($attr['VALUE'])=='OFF') { $set=0; } + else { $set=1; } + } + else { $set=1; } + if (isset($attr['SHOW-THIS-PAGE']) && $attr['SHOW-THIS-PAGE'] && $tag=='SETHTMLPAGEHEADER') { $write = 1; } + else { $write = 0; } + if ($side=='odd' || $side=='both') { + if ($set && $tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader($this->pageHTMLheaders[$pname],'O',$write); } + else if ($set && $tag=='SETHTMLPAGEFOOTER') { $this->SetHTMLFooter($this->pageHTMLfooters[$pname],'O'); } + else if ($tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader('','O'); } + else { $this->SetHTMLFooter('','O'); } + } + if ($side=='even' || $side=='both') { + if ($set && $tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader($this->pageHTMLheaders[$pname],'E',$write); } + else if ($set && $tag=='SETHTMLPAGEFOOTER') { $this->SetHTMLFooter($this->pageHTMLfooters[$pname],'E'); } + else if ($tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader('','E'); } + else { $this->SetHTMLFooter('','E'); } + } + break; +/*-- END HTMLHEADERS-FOOTERS --*/ + + case 'SETPAGEHEADER': + case 'SETPAGEFOOTER': + $this->ignorefollowingspaces = true; + if (isset($attr['NAME']) && $attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + if (isset($attr['PAGE']) && $attr['PAGE']) { // O|odd|even|E|ALL|[blank] + if (strtoupper($attr['PAGE'])=='O' || strtoupper($attr['PAGE'])=='ODD') { $side='odd'; } + else if (strtoupper($attr['PAGE'])=='E' || strtoupper($attr['PAGE'])=='EVEN') { $side='even'; } + else if (strtoupper($attr['PAGE'])=='ALL') { $side='both'; } + else { $side='odd'; } + } + else { $side='odd'; } + if (isset($attr['VALUE']) && $attr['VALUE']) { // -1|1|on|off + if ($attr['VALUE']=='1' || strtoupper($attr['VALUE'])=='ON') { $set=1; } + else if ($attr['VALUE']=='-1' || strtoupper($attr['VALUE'])=='OFF') { $set=0; } + else { $set=1; } + } + else { $set=1; } + if ($side=='odd' || $side=='both') { + if ($set && $tag=='SETPAGEHEADER') { $this->headerDetails['odd'] = $this->pageheaders[$pname]; } + else if ($set && $tag=='SETPAGEFOOTER') { $this->footerDetails['odd'] = $this->pagefooters[$pname]; } + else if ($tag=='SETPAGEHEADER') { $this->headerDetails['odd'] = array(); } + else { $this->footerDetails['odd'] = array(); } + if (!$this->mirrorMargins || ($this->page)%2!=0) { // ODD + if ($tag=='SETPAGEHEADER') { $this->_setAutoHeaderHeight($this->headerDetails['odd'],$this->HTMLHeader); } + if ($tag=='SETPAGEFOOTER') { $this->_setAutoFooterHeight($this->footerDetails['odd'],$this->HTMLFooter); } + } + } + if ($side=='even' || $side=='both') { + if ($set && $tag=='SETPAGEHEADER') { $this->headerDetails['even'] = $this->pageheaders[$pname]; } + else if ($set && $tag=='SETPAGEFOOTER') { $this->footerDetails['even'] = $this->pagefooters[$pname]; } + else if ($tag=='SETPAGEHEADER') { $this->headerDetails['even'] = array(); } + else { $this->footerDetails['even'] = array(); } + if ($this->mirrorMargins && ($this->page)%2==0) { // EVEN + if ($tag=='SETPAGEHEADER') { $this->_setAutoHeaderHeight($this->headerDetails['even'],$this->HTMLHeaderE); } + if ($tag=='SETPAGEFOOTER') { $this->_setAutoFooterHeight($this->footerDetails['even'],$this->HTMLFooterE); } + } + } + if (isset($attr['SHOW-THIS-PAGE']) && $attr['SHOW-THIS-PAGE'] && $tag=='SETPAGEHEADER') { + $this->Header(); + } + break; + + +/*-- TOC --*/ + case 'TOC': //added custom-tag - set Marker for insertion later of ToC + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $this->tocontents->openTagTOC($attr); + break; + + + + case 'TOCPAGEBREAK': // custom-tag - set Marker for insertion later of ToC AND adds PAGEBREAK + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + list($isbreak,$toc_id) = $this->tocontents->openTagTOCPAGEBREAK($attr); + if ($isbreak) break; + // No break - continues as PAGEBREAK... +/*-- END TOC --*/ + + + case 'PAGE_BREAK': //custom-tag + case 'PAGEBREAK': //custom-tag + case 'NEWPAGE': //custom-tag + case 'FORMFEED': //custom-tag + + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + if(!empty($this->textbuffer)) { //Output previously buffered content + $this->printbuffer($this->textbuffer); + $this->textbuffer=array(); + } + $this->ignorefollowingspaces = true; + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + if (isset($attr['SHEET-SIZE']) && $tag != 'FORMFEED' && !$this->restoreBlockPageBreaks) { + // Convert to same types as accepted in initial mPDF() A4, A4-L, or array(w,h) + $prop = preg_split('/\s+/',trim($attr['SHEET-SIZE'])); + if (count($prop) == 2 ) { + $newformat = array($this->ConvertSize($prop[0]), $this->ConvertSize($prop[1])); + } + else { $newformat = $attr['SHEET-SIZE']; } + } + else { $newformat = ''; } + + $mgr = $mgl = $mgt = $mgb = $mgh = $mgf = ''; + if (isset($attr['MARGIN-RIGHT'])) { $mgr = $this->ConvertSize($attr['MARGIN-RIGHT'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-LEFT'])) { $mgl = $this->ConvertSize($attr['MARGIN-LEFT'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-TOP'])) { $mgt = $this->ConvertSize($attr['MARGIN-TOP'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-BOTTOM'])) { $mgb = $this->ConvertSize($attr['MARGIN-BOTTOM'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-HEADER'])) { $mgh = $this->ConvertSize($attr['MARGIN-HEADER'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-FOOTER'])) { $mgf = $this->ConvertSize($attr['MARGIN-FOOTER'],$this->w,$this->FontSize,false); } + $ohname = $ehname = $ofname = $efname = ''; + if (isset($attr['ODD-HEADER-NAME'])) { $ohname = $attr['ODD-HEADER-NAME']; } + if (isset($attr['EVEN-HEADER-NAME'])) { $ehname = $attr['EVEN-HEADER-NAME']; } + if (isset($attr['ODD-FOOTER-NAME'])) { $ofname = $attr['ODD-FOOTER-NAME']; } + if (isset($attr['EVEN-FOOTER-NAME'])) { $efname = $attr['EVEN-FOOTER-NAME']; } + $ohvalue = $ehvalue = $ofvalue = $efvalue = 0; + if (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE']=='1' || strtoupper($attr['ODD-HEADER-VALUE'])=='ON')) { $ohvalue = 1; } + else if (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE']=='-1' || strtoupper($attr['ODD-HEADER-VALUE'])=='OFF')) { $ohvalue = -1; } + if (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE']=='1' || strtoupper($attr['EVEN-HEADER-VALUE'])=='ON')) { $ehvalue = 1; } + else if (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['EVEN-HEADER-VALUE'])=='OFF')) { $ehvalue = -1; } + if (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE']=='1' || strtoupper($attr['ODD-FOOTER-VALUE'])=='ON')) { $ofvalue = 1; } + else if (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['ODD-FOOTER-VALUE'])=='OFF')) { $ofvalue = -1; } + if (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['EVEN-FOOTER-VALUE'])=='ON')) { $efvalue = 1; } + else if (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['EVEN-FOOTER-VALUE'])=='OFF')) { $efvalue = -1; } + + if (isset($attr['ORIENTATION']) && (strtoupper($attr['ORIENTATION'])=='L' || strtoupper($attr['ORIENTATION'])=='LANDSCAPE')) { $orient = 'L'; } + else if (isset($attr['ORIENTATION']) && (strtoupper($attr['ORIENTATION'])=='P' || strtoupper($attr['ORIENTATION'])=='PORTRAIT')) { $orient = 'P'; } + else { $orient = $this->CurOrientation; } + + if (isset($attr['PAGE-SELECTOR']) && $attr['PAGE-SELECTOR']) { $pagesel = $attr['PAGE-SELECTOR']; } + else { $pagesel = ''; } + + $resetpagenum = ''; + $pagenumstyle = ''; + $suppress = ''; + if (isset($attr['RESETPAGENUM'])) { $resetpagenum = $attr['RESETPAGENUM']; } + if (isset($attr['PAGENUMSTYLE'])) { $pagenumstyle = $attr['PAGENUMSTYLE']; } + if (isset($attr['SUPPRESS'])) { $suppress = $attr['SUPPRESS']; } + + if ($tag == 'TOCPAGEBREAK') { $type = 'NEXT-ODD'; } + else if(isset($attr['TYPE'])) { $type = strtoupper($attr['TYPE']); } + else { $type = ''; } + + if ($type == 'E' || $type == 'EVEN') { $this->AddPage($orient,'E', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'O' || $type == 'ODD') { $this->AddPage($orient,'O', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'NEXT-ODD') { $this->AddPage($orient,'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'NEXT-EVEN') { $this->AddPage($orient,'NEXT-EVEN', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else { $this->AddPage($orient,'', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + +/*-- TOC --*/ + if ($tag == 'TOCPAGEBREAK') { + if ($toc_id) { $this->tocontents->m_TOC[$toc_id]['TOCmark'] = $this->page; } + else { $this->tocontents->TOCmark = $this->page; } + } +/*-- END TOC --*/ + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if (($tag == 'FORMFEED' || $this->restoreBlockPagebreaks) && !$this->tableLevel && !$this->listlvl) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + + break; + + +/*-- TOC --*/ + case 'TOCENTRY': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'toc'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['toclevel'] = $attr['LEVEL']; } else { $objattr['toclevel'] = 0; } + if (isset($attr['NAME']) && $attr['NAME']) { $objattr['toc_id'] = $attr['NAME']; } else { $objattr['toc_id'] = 0; } + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; +/*-- END TOC --*/ + +/*-- INDEX --*/ + case 'INDEXENTRY': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { + if (isset($attr['XREF']) && $attr['XREF']) { + $this->IndexEntry(htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES),$attr['XREF']); + break; + } + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'indexentry'; + $e = "\xbb\xa4\xactype=indexentry,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; + + + case 'INDEXINSERT': + if (isset($attr['FONT-SIZE'])) { $reffontsize = $attr['FONT-SIZE']; } else { $reffontsize = ''; } + if (isset($attr['LINE-SPACING']) && $attr['LINE-SPACING']) { $linespacing = $attr['LINE-SPACING']; } else { $linespacing = ''; } + if (isset($attr['DIV-FONT-SIZE']) && $attr['DIV-FONT-SIZE']) { $divlettfontsize = $attr['DIV-FONT-SIZE']; } else { $divlettfontsize = ''; } + if (isset($attr['FONT']) && $attr['FONT']) { $reffont = $attr['FONT']; } else { $reffont = ''; } + if (isset($attr['DIV-FONT']) && $attr['DIV-FONT']) { $divlettfont = $attr['DIV-FONT']; } else { $divlettfont = ''; } + if (isset($attr['COLS']) && $attr['COLS']) { $cols = $attr['COLS']; } else { $cols = 1; } + if (isset($attr['OFFSET']) && $attr['OFFSET']) { $offset = $attr['OFFSET']; } else { $offset = 3; } + if (isset($attr['GAP']) && $attr['GAP']) { $gap = $attr['GAP']; } else { $gap = 5; } + + if (isset($attr['USEDIVLETTERS']) && (strtoupper($attr['USEDIVLETTERS'])=='OFF' || $attr['USEDIVLETTERS']==-1 || $attr['USEDIVLETTERS']==='0')) { $usedivletters = 0; } + else { $usedivletters = 1; } + + if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $links = true; } + else { $links = false; } + $this->CreateIndex($cols, $reffontsize, $linespacing, $offset, $usedivletters, $divlettfontsize, $gap, $reffont,$divlettfont, $links); + break; +/*-- END INDEX --*/ + +/*-- WATERMARK --*/ + + case 'WATERMARKTEXT': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { $txt = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); } else { $txt = ''; } + if (isset($attr['ALPHA']) && $attr['ALPHA']>0) { $alpha = $attr['ALPHA']; } else { $alpha = -1; } + $this->SetWatermarkText($txt, $alpha); + break; + + + case 'WATERMARKIMAGE': + if (isset($attr['SRC'])) { $src = $attr['SRC']; } else { $src = ''; } + if (isset($attr['ALPHA']) && $attr['ALPHA']>0) { $alpha = $attr['ALPHA']; } else { $alpha = -1; } + if (isset($attr['SIZE']) && $attr['SIZE']) { + $size = $attr['SIZE']; + if (strpos($size,',')) { $size = explode(',',$size); } + } + else { $size = 'D'; } + if (isset($attr['POS']) && $attr['POS']) { + $pos = $attr['POS']; + if (strpos($pos,',')) { $pos = explode(',',$pos); } + } + else { $pos = 'P'; } + $this->SetWatermarkImage($src, $alpha, $size, $pos); + break; +/*-- END WATERMARK --*/ + +/*-- BOOKMARKS --*/ + case 'BOOKMARK': + if (isset($attr['CONTENT'])) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'bookmark'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['bklevel'] = $attr['LEVEL']; } else { $objattr['bklevel'] = 0; } + $e = "\xbb\xa4\xactype=bookmark,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; +/*-- END BOOKMARKS --*/ + +/*-- ANNOTATIONS --*/ + case 'ANNOTATION': + + //if (isset($attr['CONTENT']) && !$this->writingHTMLheader && !$this->writingHTMLfooter) { // Stops annotations in FixedPos + if (isset($attr['CONTENT'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'annot'; + $objattr['POPUP'] = ''; + } + else { break; } + if (isset($attr['POS-X'])) { $objattr['POS-X'] = $attr['POS-X']; } else { $objattr['POS-X'] = 0; } + if (isset($attr['POS-Y'])) { $objattr['POS-Y'] = $attr['POS-Y']; } else { $objattr['POS-Y'] = 0; } + if (isset($attr['ICON'])) { $objattr['ICON'] = $attr['ICON']; } else { $objattr['ICON'] = 'Note'; } + if (isset($attr['AUTHOR'])) { $objattr['AUTHOR'] = $attr['AUTHOR']; } + else if (isset($attr['TITLE'])) { $objattr['AUTHOR'] = $attr['TITLE']; } else { $objattr['AUTHOR'] = ''; } + if (isset($attr['FILE'])) { $objattr['FILE'] = $attr['FILE']; } else { $objattr['FILE'] = ''; } + if (isset($attr['SUBJECT'])) { $objattr['SUBJECT'] = $attr['SUBJECT']; } else { $objattr['SUBJECT'] = ''; } + if (isset($attr['OPACITY']) && $attr['OPACITY']>0 && $attr['OPACITY']<=1) { $objattr['OPACITY'] = $attr['OPACITY']; } + else if ($this->annotMargin) { $objattr['OPACITY'] = 1; } + else { $objattr['OPACITY'] = $this->annotOpacity; } + if (isset($attr['COLOR'])) { + $cor = $this->ConvertColor($attr['COLOR']); + if ($cor) { $objattr['COLOR'] = $cor; } + else { $objattr['COLOR'] = $this->ConvertColor('yellow'); } + } + else { $objattr['COLOR'] = $this->ConvertColor('yellow'); } + + if (isset($attr['POPUP']) && !empty($attr['POPUP'])) { + $pop = preg_split('/\s+/',trim($attr['POPUP'])); + if (count($pop)>1) { $objattr['POPUP'] = $pop; } + else { $objattr['POPUP'] = true; } + } + $e = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + break; +/*-- END ANNOTATIONS --*/ + + +/*-- COLUMNS --*/ + case 'COLUMNS': //added custom-tag + if (isset($attr['COLUMN-COUNT']) && ($attr['COLUMN-COUNT'] || $attr['COLUMN-COUNT']==='0')) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + if(!empty($this->textbuffer)) { //Output previously buffered content + $this->printbuffer($this->textbuffer); + $this->textbuffer=array(); + } + + if (isset($attr['VALIGN']) && $attr['VALIGN']) { + if ($attr['VALIGN'] == 'J') { $valign = 'J'; } + else { $valign = $align[$attr['VALIGN']]; } + } + else { $valign = ''; } + if (isset($attr['COLUMN-GAP']) && $attr['COLUMN-GAP']) { $this->SetColumns($attr['COLUMN-COUNT'],$valign,$attr['COLUMN-GAP']); } + else { $this->SetColumns($attr['COLUMN-COUNT'],$valign); } + } + $this->ignorefollowingspaces = true; + break; + + case 'COLUMN_BREAK': //custom-tag + case 'COLUMNBREAK': //custom-tag + case 'NEWCOLUMN': //custom-tag + $this->ignorefollowingspaces = true; + $this->NewColumn(); + $this->ColumnAdjust = false; // disables all column height adjustment for the page. + break; + +/*-- END COLUMNS --*/ + + + case 'BDO': + // $this->biDirectional = true; + break; + + + case 'TTZ': + $this->ttz = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $this->setCSS(array('FONT-FAMILY'=>'czapfdingbats','FONT-WEIGHT'=>'normal','FONT-STYLE'=>'normal'),'INLINE'); + break; + + case 'TTS': + $this->tts = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $this->setCSS(array('FONT-FAMILY'=>'csymbol','FONT-WEIGHT'=>'normal','FONT-STYLE'=>'normal'),'INLINE'); + break; + + case 'TTA': + $this->tta = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + + if (in_array($this->FontFamily,$this->mono_fonts)) { + $this->setCSS(array('FONT-FAMILY'=>'ccourier'),'INLINE'); + } + else if (in_array($this->FontFamily,$this->serif_fonts)) { + $this->setCSS(array('FONT-FAMILY'=>'ctimes'),'INLINE'); + } + else { + $this->setCSS(array('FONT-FAMILY'=>'chelvetica'),'INLINE'); + } + break; + + + + // INLINE PHRASES OR STYLES + case 'SUB': + case 'SUP': + case 'ACRONYM': + case 'BIG': + case 'SMALL': + case 'INS': + case 'S': + case 'STRIKE': + case 'DEL': + case 'STRONG': + case 'CITE': + case 'Q': + case 'EM': + case 'B': + case 'I': + case 'U': + case 'SAMP': + case 'CODE': + case 'KBD': + case 'TT': + case 'VAR': + case 'FONT': + case 'MARK': // mPDF 5.5.09 + case 'TIME': + + case 'SPAN': +/*-- ANNOTATIONS --*/ + if ($this->title2annots && isset($attr['TITLE'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + $objattr['CONTENT'] = $attr['TITLE']; + $objattr['type'] = 'annot'; + $objattr['POS-X'] = 0; + $objattr['POS-Y'] = 0; + $objattr['ICON'] = 'Comment'; + $objattr['AUTHOR'] = ''; + $objattr['SUBJECT'] = ''; + $objattr['OPACITY'] = $this->annotOpacity; + $objattr['COLOR'] = $this->ConvertColor('yellow'); + $annot = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + } +/*-- END ANNOTATIONS --*/ + + if ($tag == 'SPAN') { + $this->spanlvl++; + $this->InlineProperties['SPAN'][$this->spanlvl] = $this->saveInlineProperties(); + if (isset($annot)) { $this->InlineAnnots[$tag][$this->spanlvl] = $annot; } // *ANNOTATIONS* + } + else { + if (!isset($this->InlineProperties[$tag])) $this->InlineProperties[$tag] = $this->saveInlineProperties(); // mPDF 5.4.13 + if (isset($annot)) { $this->InlineAnnots[$tag] = $annot; } // *ANNOTATIONS* + } + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + break; + + + case 'A': + if (isset($attr['NAME']) and $attr['NAME'] != '') { + $e = ''; +/*-- BOOKMARKS --*/ + if ($this->anchor2Bookmark) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['NAME'],ENT_QUOTES); + $objattr['type'] = 'bookmark'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['bklevel'] = $attr['LEVEL']; } else { $objattr['bklevel'] = 0; } + $e = "\xbb\xa4\xactype=bookmark,objattr=".serialize($objattr)."\xbb\xa4\xac"; + } +/*-- END BOOKMARKS --*/ + if($this->tableLevel) { // *TABLES* + $this->_saveCellTextBuffer($e, '', $attr['NAME']); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->_saveTextBuffer($e, '', $attr['NAME']); //an internal link (adds a space for recognition) + } // *TABLES* + } + if (isset($attr['HREF'])) { + $this->InlineProperties['A'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + $this->HREF=htmlspecialchars_decode(urldecode($attr['HREF'])); + } + break; + + case 'LEGEND': // mPDF 5.4.18 + $this->InlineProperties['LEGEND'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + break; + + + + case 'PROGRESS': // mPDF 5.5.09 + case 'METER': // mPDF 5.5.09 + $this->inMeter = true; // mPDF 5.5.09 + + if (isset($attr['MAX']) && $attr['MAX']) { $max = $attr['MAX']; } + else { $max = 1; } + if (isset($attr['MIN']) && $attr['MIN'] && $tag=='METER') { $min = $attr['MIN']; } + else { $min = 0; } + if ($max < $min) { $max = $min; } + + if (isset($attr['VALUE']) && ($attr['VALUE'] || $attr['VALUE']==='0')) { + $value = $attr['VALUE']; + if ($value < $min) { $value = $min; } + else if ($value > $max) { $value = $max; } + } + else { $value = ''; } + + if (isset($attr['LOW']) && $attr['LOW']) { $low = $attr['LOW']; } + else { $low = $min; } + if ($low < $min) { $low = $min; } + else if ($low > $max) { $low = $max; } + if (isset($attr['HIGH']) && $attr['HIGH']) { $high = $attr['HIGH']; } + else { $high = $max; } + if ($high < $low) { $high = $low; } + else if ($high > $max) { $high = $max; } + if (isset($attr['OPTIMUM']) && $attr['OPTIMUM']) { $optimum = $attr['OPTIMUM']; } + else { $optimum = $min + (($max-$min)/2); } + if ($optimum < $min) { $optimum = $min; } + else if ($optimum > $max) { $optimum = $max; } + if (isset($attr['TYPE']) && $attr['TYPE']) { $type = $attr['TYPE']; } + else { $type = ''; } + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['WIDTH'])) $w = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['HEIGHT'])) $h = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + // Image file + if (!class_exists('meter', false)) { + include(_MPDF_PATH.'classes/meter.php'); + } + $this->meter = new meter(); + $svg = $this->meter->makeSVG(strtolower($tag), $type, $value, $max, $min, $optimum, $low, $high); + //Save to local file + $srcpath= _MPDF_TEMP_PATH.'_tempSVG'.RAND(1,10000).'_'.strtolower($tag).'.svg'; + file_put_contents($srcpath, $svg); + $orig_srcpath = $srcpath; + $this->GetFullPath($srcpath); + + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { + // SVG units are pixels + $w = $this->FontSize/(10/_MPDFK) * abs($info['w'])/_MPDFK; // mPDF 5.5.21 + $h = $this->FontSize/(10/_MPDFK) * abs($info['h'])/_MPDFK; + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=abs($w*$info['h']/$info['w']); + } + + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=abs($h*$info['w']/$info['h']); + } + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $properties = array(); + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { + $this->_saveTextBuffer($e, $this->HREF); + } + + break; + + + case 'BR': + // Added mPDF 3.0 Float DIV - CLEAR + if (isset($attr['STYLE'])) { + $properties = $this->cssmgr->readInlineCSS($attr['STYLE']); + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']),$this->blklvl); } // *CSS-FLOAT* + } + + +/*-- TABLES --*/ + if($this->tableLevel) { + + if ($this->blockjustfinished || $this->listjustfinished) { + $this->_saveCellTextBuffer("\n"); + } + + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + } + else { +/*-- END TABLES --*/ + if (count($this->textbuffer)) { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/ $/','',$this->textbuffer[count($this->textbuffer)-1][0]); + } + $this->_saveTextBuffer("\n"); + } // *TABLES* + $this->ignorefollowingspaces = true; + $this->blockjustfinished=false; + $this->listjustfinished=false; + + $this->linebreakjustfinished=true; + break; + + + // *********** BLOCKS ******************** + + + case 'PRE': + $this->ispre=true; // ADDED - Prevents left trim of textbuffer in printbuffer() + + case 'DIV': + case 'FORM': + case 'CENTER': + + case 'BLOCKQUOTE': + case 'ADDRESS': + + case 'CAPTION': + case 'P': + case 'H1': + case 'H2': + case 'H3': + case 'H4': + case 'H5': + case 'H6': + case 'DL': + case 'DT': + case 'DD': + case 'FIELDSET': + // mPDF 5.5.22 + case 'DETAILS': + case 'SUMMARY': + // mPDF 5.5.09 + case 'ARTICLE': + case 'ASIDE': + case 'FIGURE': + case 'FIGCAPTION': + case 'FOOTER': + case 'HEADER': + case 'HGROUP': + case 'NAV': + case 'SECTION': + $p = $this->cssmgr->PreviewBlockCSS($tag,$attr); + if(isset($p['DISPLAY']) && strtolower($p['DISPLAY'])=='none') { + $this->blklvl++; + $this->blk[$this->blklvl]['hide'] = true; + return; + } + if($tag == 'CAPTION') { + // position is written in AdjstHTML + if (isset($attr['POSITION']) && strtolower($attr['POSITION'])=='bottom') { $divpos = 'B'; } + else { $divpos = 'T'; } + if (isset($attr['ALIGN']) && strtolower($attr['ALIGN'])=='bottom') { $cappos = 'B'; } + else if (isset($p['CAPTION-SIDE']) && strtolower($p['CAPTION-SIDE'])=='bottom') { $cappos = 'B'; } + else { $cappos = 'T'; } + if (isset($attr['ALIGN'])) { unset($attr['ALIGN']); } + if ($cappos != $divpos) { + $this->blklvl++; + $this->blk[$this->blklvl]['hide'] = true; + return; + } + } + +/*-- FORMS --*/ + if($tag == 'FORM') { + if (isset($attr['METHOD']) && strtolower($attr['METHOD'])=='get') { $this->form->formMethod = 'GET'; } + else { $this->form->formMethod = 'POST'; } + if (isset($attr['ACTION'])) { $this->form->formAction = $attr['ACTION']; } + else { $this->form->formAction = ''; } + } +/*-- END FORMS --*/ + + +/*-- CSS-POSITION --*/ + if ((isset($p['POSITION']) && (strtolower($p['POSITION'])=='fixed' || strtolower($p['POSITION'])=='absolute')) && $this->blklvl==0) { + if ($this->inFixedPosBlock) { + $this->Error("Cannot nest block with position:fixed or position:absolute"); + } + $this->inFixedPosBlock = true; + return; + } +/*-- END CSS-POSITION --*/ + // Start Block + $this->ignorefollowingspaces = true; + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + +/*-- LISTS --*/ + if ($this->listlvl>0) { return; } +/*-- END LISTS --*/ + + $this->InlineProperties = array(); + $this->spanlvl = 0; + $this->listjustfinished=false; + $this->divbegin=true; + + $this->linebreakjustfinished=false; + +/*-- TABLES --*/ + if ($this->tableLevel) { + + // If already something on the line + if ($this->cell[$this->row][$this->col]['s'] > 0 && !$this->nestedtablejustfinished ) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + } + // Cannot set block properties inside table - use Bold to indicate h1-h6 + if ($tag == 'CENTER' && $this->tdbegin) { $this->cell[$this->row][$this->col]['a'] = $align['center']; } + + $this->InlineProperties['BLOCKINTABLE'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + + + break; + } +/*-- END TABLES --*/ + + if ($tag == 'P' || $tag == 'DT' || $tag == 'DD') { $this->lastoptionaltag = $tag; } // Save current HTML specified optional endtag + else { $this->lastoptionaltag = ''; } + + if ($this->lastblocklevelchange == 1) { $blockstate = 1; } // Top margins/padding only + else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + $this->printbuffer($this->textbuffer,$blockstate); + $this->textbuffer=array(); + + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + + $this->blklvl++; + + $currblk =& $this->blk[$this->blklvl]; + $this->initialiseBlock($currblk); + $prevblk =& $this->blk[$this->blklvl-1]; + + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + $pagesel = ''; +/*-- CSS-PAGE --*/ + + if (isset($properties['PAGE'])) { $pagesel = $properties['PAGE']; } +/*-- END CSS-PAGE --*/ + + // If page-box has changed AND/OR PAGE-BREAK-BEFORE + $save_cols = false; + if (($pagesel && $pagesel != $this->page_box['current']) || (isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE'])) { + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + // Must Add new page if changed page properties + if (isset($properties['PAGE-BREAK-BEFORE'])) { + if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'ALWAYS') { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($this->page_box['current'] != $pagesel) { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } // *CSS-PAGE* + } +/*-- CSS-PAGE --*/ + else if ($pagesel != $this->page_box['current']) { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } +/*-- END CSS-PAGE --*/ + + // if using htmlheaders, the headers need to be rewritten when new page + // done by calling WriteHTML() within resethtmlheaders + // so block is reset to 0 - now we need to resurrect it + // As in WriteHTML() initialising + if (!($this->restoreBlockPagebreaks && isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE'])) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl++; + $currblk =& $this->blk[$this->blklvl]; + $prevblk =& $this->blk[$this->blklvl-1]; + + $this->initialiseBlock($currblk); + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + } +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks && isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE']) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE']) == 'AVOID' && !$this->ColActive && !$this->keep_block_together) { + $currblk['keep_block_together'] = 1; + $this->kt_y00 = $this->y; + $this->kt_p00 = $this->page; + $this->keep_block_together = 1; + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + } + if ($lastbottommargin && isset($properties['MARGIN-TOP']) && $properties['MARGIN-TOP'] && empty($properties['FLOAT'])) { $currblk['lastbottommargin'] = $lastbottommargin; } + + // mPDF 5.6.01 - LAYERS + if (isset($properties['Z-INDEX']) && $this->currentlayer==0) { + $v = intval($properties['Z-INDEX']); + if ($v > 0) { + $currblk['z-index'] = $v; + $this->BeginLayer($v); + } + } + + $this->setCSS($properties,'BLOCK',$tag); //name(id/class/style) found in the CSS array! + $currblk['InlineProperties'] = $this->saveInlineProperties(); + + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible' && !$this->tableLevel) { + $currblk['visibility'] = $v; + $this->SetVisibility($v); + } + } + + if(isset($attr['DIR']) && $attr['DIR']) { $currblk['direction'] = strtolower($attr['DIR']); } + if(isset($attr['ALIGN']) && $attr['ALIGN']) { $currblk['block-align'] = $align[strtolower($attr['ALIGN'])]; } + + if (isset($properties['HEIGHT'])) { + $currblk['css_set_height'] = $this->ConvertSize($properties['HEIGHT'],($this->h - $this->tMargin - $this->bMargin),$this->FontSize,false); + if (($currblk['css_set_height'] + $this->y) > $this->PageBreakTrigger && $this->y > $this->tMargin+5 && $currblk['css_set_height'] < ($this->h - ($this->tMargin + $this->bMargin))) { $this->AddPage($this->CurOrientation); } + } + else { $currblk['css_set_height'] = false; } + + + // Added mPDF 3.0 Float DIV + if (isset($prevblk['blockContext'])) { $currblk['blockContext'] = $prevblk['blockContext'] ; } // *CSS-FLOAT* + + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']), $this->blklvl-1); } // *CSS-FLOAT* + + $container_w = $prevblk['inner_width']; + $bdr = $currblk['border_right']['w']; + $bdl = $currblk['border_left']['w']; + $pdr = $currblk['padding_right']; + $pdl = $currblk['padding_left']; + + if (isset($currblk['css_set_width'])) { $setwidth = $currblk['css_set_width']; } + else { $setwidth = 0; } + +/*-- CSS-FLOAT --*/ + if (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) == 'RIGHT' && !$this->ColActive) { + // Cancel Keep-Block-together + $currblk['keep_block_together'] = false; + $this->kt_y00 = ''; + $this->keep_block_together = 0; + + $this->blockContext++; + $currblk['blockContext'] = $this->blockContext; + + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + + // DIV is too narrow for text to fit! + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + + if ($r_exists) { $currblk['margin_right'] += $r_width; } + + $currblk['float'] = 'R'; + $currblk['float_start_y'] = $this->y; + if ($currblk['css_set_width']) { + $currblk['margin_left'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + } + else { + // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width + // and do borders and backgrounds - For now - just set to maximum width left + + if ($l_exists) { $currblk['margin_left'] += $l_width; } + $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); + + $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + } + } + else if (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) == 'LEFT' && !$this->ColActive) { + // Cancel Keep-Block-together + $currblk['keep_block_together'] = false; + $this->kt_y00 = ''; + $this->keep_block_together = 0; + + $this->blockContext++; + $currblk['blockContext'] = $this->blockContext; + + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + + // DIV is too narrow for text to fit! + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + + if ($l_exists) { $currblk['margin_left'] += $l_width; } + + $currblk['float'] = 'L'; + $currblk['float_start_y'] = $this->y; + if ($setwidth) { + $currblk['margin_right'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + } + else { + // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width + // and do borders and backgrounds - For now - just set to maximum width left + + if ($r_exists) { $currblk['margin_right'] += $r_width; } + $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); + + $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + } + } + + else { + // Don't allow overlap - if floats present - adjust padding to avoid overlap with Floats + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + if ($r_exists) { $currblk['padding_right'] = max(($r_width-$currblk['margin_right']-$bdr), $pdr); } + if ($l_exists) { $currblk['padding_left'] = max(($l_width-$currblk['margin_left']-$bdl), $pdl); } + } +/*-- END CSS-FLOAT --*/ + + +/*-- BORDER-RADIUS --*/ + // Automatically increase padding if required for border-radius + if ($this->autoPadding && !$this->ColActive && !$this->keep_block_together) { + if ($currblk['border_radius_TL_H']>$currblk['padding_left'] && $currblk['border_radius_TL_V']>$currblk['padding_top']) { + if ($currblk['border_radius_TL_H']>$currblk['border_radius_TL_V']) { + $this->_borderPadding($currblk['border_radius_TL_H'],$currblk['border_radius_TL_V'], $currblk['padding_left'], $currblk['padding_top']); + } + else { + $this->_borderPadding($currblk['border_radius_TL_V'],$currblk['border_radius_TL_H'], $currblk['padding_top'], $currblk['padding_left']); + } + } + if ($currblk['border_radius_TR_H']>$currblk['padding_right'] && $currblk['border_radius_TR_V']>$currblk['padding_top']) { + if ($currblk['border_radius_TR_H']>$currblk['border_radius_TR_V']) { + $this->_borderPadding($currblk['border_radius_TR_H'],$currblk['border_radius_TR_V'], $currblk['padding_right'], $currblk['padding_top']); + } + else { + $this->_borderPadding($currblk['border_radius_TR_V'],$currblk['border_radius_TR_H'], $currblk['padding_top'], $currblk['padding_right']); + } + } + if ($currblk['border_radius_BL_H']>$currblk['padding_left'] && $currblk['border_radius_BL_V']>$currblk['padding_bottom']) { + if ($currblk['border_radius_BL_H']>$currblk['border_radius_BL_V']) { + $this->_borderPadding($currblk['border_radius_BL_H'],$currblk['border_radius_BL_V'], $currblk['padding_left'], $currblk['padding_bottom']); + } + else { + $this->_borderPadding($currblk['border_radius_BL_V'],$currblk['border_radius_BL_H'], $currblk['padding_bottom'], $currblk['padding_left']); + } + } + if ($currblk['border_radius_BR_H']>$currblk['padding_right'] && $currblk['border_radius_BR_V']>$currblk['padding_bottom']) { + if ($currblk['border_radius_BR_H']>$currblk['border_radius_BR_V']) { + $this->_borderPadding($currblk['border_radius_BR_H'],$currblk['border_radius_BR_V'], $currblk['padding_right'], $currblk['padding_bottom']); + } + else { + $this->_borderPadding($currblk['border_radius_BR_V'],$currblk['border_radius_BR_H'], $currblk['padding_bottom'], $currblk['padding_right']); + } + } + } +/*-- END BORDER-RADIUS --*/ + + + // Hanging indent - if negative indent: ensure padding is >= indent + if(!isset($currblk['text_indent'])) { $currblk['text_indent'] = null; } + if(!isset($currblk['inner_width'])) { $currblk['inner_width'] = null; } + $cbti = $this->ConvertSize($currblk['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($cbti < 0) { + $hangind = -($cbti); + if ($currblk['direction'] == 'rtl') { // *RTL* + $currblk['padding_right'] = max($currblk['padding_right'],$hangind); // *RTL* + } // *RTL* + else { // *RTL* + $currblk['padding_left'] = max($currblk['padding_left'],$hangind); + } // *RTL* + } + + if (isset($currblk['css_set_width'])) { + if (isset($properties['MARGIN-LEFT']) && isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT'])=='auto' && strtolower($properties['MARGIN-RIGHT'])=='auto') { + // Try to reduce margins to accomodate - if still too wide, set margin-right/left=0 (reduces width) + $anyextra = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); + if ($anyextra>0) { + $currblk['margin_left'] = $currblk['margin_right'] = $anyextra /2; + } + else { + $currblk['margin_left'] = $currblk['margin_right'] = 0; + } + } + else if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) + $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); + if ($currblk['margin_left'] < 0) { + $currblk['margin_left'] = 0; + } + } + else if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) + $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); + if ($currblk['margin_right'] < 0) { + $currblk['margin_right'] = 0; + } + } + else { + if ($currblk['direction'] == 'rtl') { // *RTL* + // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) + $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); // *RTL* + if ($currblk['margin_left'] < 0) { // *RTL* + $currblk['margin_left'] = 0; // *RTL* + } // *RTL* + } // *RTL* + else { // *RTL* + // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) + $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); + if ($currblk['margin_right'] < 0) { + $currblk['margin_right'] = 0; + } + } // *RTL* + } + } + + $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; + $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; + + $currblk['width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); + $currblk['inner_width'] = $currblk['width'] - ($currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); + + // Check DIV is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if ($currblk['inner_width'] < $mw) { + $currblk['padding_left'] = 0; + $currblk['padding_right'] = 0; + $currblk['border_left']['w'] = 0.2; + $currblk['border_right']['w'] = 0.2; + $currblk['margin_left'] = 0; + $currblk['margin_right'] = 0; + $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; + $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; + $currblk['width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); + $currblk['inner_width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); +// if ($currblk['inner_width'] < $mw) { $this->Error("DIV is too narrow for text to fit!"); } + } + + $this->x = $this->lMargin + $currblk['outer_left_margin']; + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive && !$this->keep_block_together) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $currblk['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + +/*-- TABLES --*/ + if ($this->use_kwt && isset($attr['KEEP-WITH-TABLE']) && !$this->ColActive && !$this->keep_block_together) { + $this->kwt = true; + $this->kwt_y0 = $this->y; + $this->kwt_x0 = $this->x; + $this->kwt_height = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + } + else { +/*-- END TABLES --*/ + $this->kwt = false; + } // *TABLES* + + //Save x,y coords in case we need to print borders... + $currblk['y0'] = $this->y; + $currblk['x0'] = $this->x; + $currblk['startpage'] = $this->page; + $this->oldy = $this->y; + + $this->lastblocklevelchange = 1 ; + + break; + + case 'HR': + // Added mPDF 3.0 Float DIV - CLEAR + if (isset($attr['STYLE'])) { + $properties = $this->cssmgr->readInlineCSS($attr['STYLE']); + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']),$this->blklvl); } // *CSS-FLOAT* + } + + $this->ignorefollowingspaces = true; + + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top'] = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['WIDTH'])) { $objattr['width'] = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); } + else if(isset($attr['WIDTH']) && $attr['WIDTH'] != '') $objattr['width'] = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + if (isset($properties['TEXT-ALIGN'])) { $objattr['align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + else if(isset($attr['ALIGN']) && $attr['ALIGN'] != '') $objattr['align'] = $align[strtolower($attr['ALIGN'])]; + + if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $objattr['align'] = 'R'; + } + if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $objattr['align'] = 'L'; + if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto' && isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $objattr['align'] = 'C'; + } + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + else if(isset($attr['COLOR']) && $attr['COLOR'] != '') $objattr['color'] = $this->ConvertColor($attr['COLOR']); + if (isset($properties['HEIGHT'])) { $objattr['linewidth'] = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + +/*-- TABLES --*/ + if ($this->tableLevel) { + $objattr['W-PERCENT'] = 100; + if (isset($properties['WIDTH']) && stristr($properties['WIDTH'],'%')) { + $properties['WIDTH'] += 0; //make "90%" become simply "90" + $objattr['W-PERCENT'] = $properties['WIDTH']; + } + if (isset($attr['WIDTH']) && stristr($attr['WIDTH'],'%')) { + $attr['WIDTH'] += 0; //make "90%" become simply "90" + $objattr['W-PERCENT'] = $attr['WIDTH']; + } + } +/*-- END TABLES --*/ + + $objattr['type'] = 'hr'; + $objattr['height'] = $objattr['linewidth'] + $objattr['margin_top'] + $objattr['margin_bottom']; + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + $this->_saveCellTextBuffer($e, $this->HREF); + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + break; + + +/*-- BARCODES --*/ + + case 'BARCODE': + if(isset($attr['CODE']) && $attr['CODE']) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['code'] = $attr['CODE']; + + if(isset($attr['TYPE'])) { + $objattr['btype'] = trim(strtoupper($attr['TYPE'])); + } + else { $objattr['btype'] = 'EAN13'; } // default + if (preg_match('/^(EAN13|ISBN|ISSN|EAN8|UPCA|UPCE)P([25])$/',$objattr['btype'],$m)) { + $objattr['btype'] = $m[1]; + $objattr['bsupp'] = $m[2]; + if (preg_match('/^(\S+)\s+(.*)$/',$objattr['code'],$mm)) { + $objattr['code'] = $mm[1]; + $objattr['bsupp_code'] = $mm[2]; + } + } + else { $objattr['bsupp'] = 0; } + + if(isset($attr['TEXT']) && $attr['TEXT']==1) { $objattr['showtext'] = 1; } + else { $objattr['showtext'] = 0; } + if(isset($attr['SIZE']) && $attr['SIZE']>0) { $objattr['bsize'] = $attr['SIZE']; } + else { $objattr['bsize'] = 1; } + if(isset($attr['HEIGHT']) && $attr['HEIGHT']>0) { $objattr['bheight'] = $attr['HEIGHT']; } + else { $objattr['bheight'] = 1; } + if(isset($attr['PR']) && $attr['PR']>0) { $objattr['pr_ratio'] = $attr['PR']; } + else { $objattr['pr_ratio'] = ''; } + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + if (isset($properties['COLOR']) && $properties['COLOR'] != '') { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + else { $objattr['color'] = false; } + if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { $objattr['bgcolor'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + else { $objattr['bgcolor'] = false; } + + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + + if ($objattr['btype'] == 'EAN13' || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN' || $objattr['btype'] == 'UPCA' || $objattr['btype'] == 'UPCE' || $objattr['btype'] == 'EAN8') { + $code = preg_replace('/\-/','',$objattr['code']); + if ($objattr['btype'] == 'ISSN' || $objattr['btype'] == 'ISBN') { + $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); + } + else { $arrcode = $this->barcode->getBarcodeArray($code, $objattr['btype'] ); } + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + + if ($objattr['bsupp'] == 2 || $objattr['bsupp'] == 5) { // EAN-2 or -5 Supplement + $supparrcode = $this->barcode->getBarcodeArray($objattr['bsupp_code'], 'EAN'.$objattr['bsupp'] ); + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR'] + $supparrcode["maxw"] + $supparrcode['sepM']) * $arrcode['nom-X'] * $objattr['bsize']; + } + else { + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; + } + $h = $arrcode['nom-H'] * $objattr['bsize'] * $objattr['bheight']; + // Add height for ISBN string + margin from top of bars + if (($objattr['showtext'] && $objattr['btype'] == 'EAN13') || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN') { + $tisbnm = 1.5 * $objattr['bsize']; // Top margin between TOP TEXT (isbn - if shown) & bars + $isbn_fontsize = 2.1 * $objattr['bsize']; + $h += $isbn_fontsize + $tisbnm ; + } + } + // QR-code + else if ($objattr['btype'] == 'QR') { + $w = $h = $objattr['bsize']*25; // Factor of 25mm (default) + $objattr['errorlevel'] = 'L'; + if (isset($attr['ERROR'])) { $objattr['errorlevel'] = $attr['ERROR']; } + } + else if ($objattr['btype'] == 'IMB' || $objattr['btype'] == 'RM4SCC' || $objattr['btype'] == 'KIX' || $objattr['btype'] == 'POSTNET' || $objattr['btype'] == 'PLANET') { + $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'] ); + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + $w = ($arrcode["maxw"] * $arrcode['nom-X'] * $objattr['bsize']) + $arrcode['quietL'] + $arrcode['quietR']; + $h = ($arrcode['nom-H'] * $objattr['bsize']) + (2*$arrcode['quietTB']); + } + else if (in_array($objattr['btype'], array('C128A','C128B','C128C','EAN128A','EAN128B','EAN128C','C39','C39+','C39E','C39E+','S25','S25+','I25','I25+','I25B','I25B+','C93','MSI','MSI+','CODABAR','CODE11'))) { + $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'], $objattr['pr_ratio'] ); + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; + $h = ((2*$arrcode['lightTB'] * $arrcode['nom-X']) + $arrcode['nom-H']) * $objattr['bsize'] * $objattr['bheight']; + } + else { break; } + + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + $objattr['type'] = 'barcode'; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['barcode_height'] = $h; + $objattr['barcode_width'] = $w; +/*-- CSS-IMAGE-FLOAT --*/ + if (!$this->ColActive && !$this->tableLevel && !$this->listlvl && !$this->kwt && !$this->keep_block_together) { + if (isset($properties['FLOAT']) && (strtoupper($properties['FLOAT']) == 'RIGHT' || strtoupper($properties['FLOAT']) == 'LEFT')) { + $objattr['float'] = substr(strtoupper($properties['FLOAT']),0,1); + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + $e = "\xbb\xa4\xactype=barcode,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + + } // *TABLES* + } + break; +/*-- END BARCODES --*/ + + + // *********** FORM ELEMENTS ******************** + +/*-- FORMS --*/ + case 'SELECT': + $this->lastoptionaltag = ''; // Save current HTML specified optional endtag + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { + $this->selectoption['SPELLCHECK'] = true; + } + + if (isset($properties['COLOR'])) { $this->selectoption['COLOR'] = $this->ConvertColor($properties['COLOR']); } + $this->specialcontent = "type=select"; + if(isset($attr['DISABLED'])) { $this->selectoption['DISABLED'] = $attr['DISABLED']; } + if(isset($attr['READONLY'])) { $this->selectoption['READONLY'] = $attr['READONLY']; } + if(isset($attr['REQUIRED'])) { $this->selectoption['REQUIRED'] = $attr['REQUIRED']; } + if(isset($attr['EDITABLE'])) { $this->selectoption['EDITABLE'] = $attr['EDITABLE']; } + if(isset($attr['TITLE'])) { $this->selectoption['TITLE'] = $attr['TITLE']; } + if(isset($attr['MULTIPLE'])) { $this->selectoption['MULTIPLE'] = $attr['MULTIPLE']; } + if(isset($attr['SIZE']) && $attr['SIZE']>1) { $this->selectoption['SIZE'] = $attr['SIZE']; } + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $this->selectoption['NAME'] = $attr['NAME']; } + if (isset($attr['ONCHANGE'])) { $this->selectoption['ONCHANGE'] = $attr['ONCHANGE']; } + } + + $properties = array(); + break; + + case 'OPTION': + $this->lastoptionaltag = 'OPTION'; // Save current HTML specified optional endtag + $this->selectoption['ACTIVE'] = true; + $this->selectoption['currentSEL'] = false; + if (empty($this->selectoption)) { + $this->selectoption['MAXWIDTH'] = ''; + $this->selectoption['SELECTED'] = ''; + } + if (isset($attr['SELECTED'])) { + $this->selectoption['SELECTED'] = ''; + $this->selectoption['currentSEL'] = true; + } + if(isset($attr['VALUE'])) { + $attr['VALUE'] = strcode2utf($attr['VALUE']); + $attr['VALUE'] = $this->lesser_entity_decode($attr['VALUE']); + if ($this->onlyCoreFonts) + $attr['VALUE'] = mb_convert_encoding($attr['VALUE'], $this->mb_enc,'UTF-8'); + } + $this->selectoption['currentVAL'] = $attr['VALUE']; + break; + + case 'TEXTAREA': + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + if(isset($attr['DISABLED'])) { $objattr['disabled'] = true; } + if(isset($attr['READONLY'])) { $objattr['readonly'] = true; } + if(isset($attr['REQUIRED'])) { $objattr['required'] = true; } + if(isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { $objattr['spellcheck'] = true; } + if(isset($attr['TITLE'])) { $objattr['title'] = $attr['TITLE']; } + if ($this->onlyCoreFonts) + $objattr['title'] = mb_convert_encoding($objattr['title'], $this->mb_enc,'UTF-8'); + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $objattr['fieldname'] = $attr['NAME']; } + $this->form->form_element_spacing['textarea']['outer']['v'] = 0; + $this->form->form_element_spacing['textarea']['inner']['v'] = 0; + if (isset($attr['ONCALCULATE'])) { $objattr['onCalculate'] = $attr['ONCALCULATE']; } + else if (isset($attr['ONCHANGE'])) { $objattr['onCalculate'] = $attr['ONCHANGE']; } + if (isset($attr['ONVALIDATE'])) { $objattr['onValidate'] = $attr['ONVALIDATE']; } + if (isset($attr['ONKEYSTROKE'])) { $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; } + if (isset($attr['ONFORMAT'])) { $objattr['onFormat'] = $attr['ONFORMAT']; } + } + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],'',0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + if ($this->useActiveForms) { + if(isset($properties['TEXT-ALIGN'])) { $objattr['text_align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + else if(isset($attr['ALIGN'])) { $objattr['text_align'] = $align[strtolower($attr['ALIGN'])]; } + if (isset($properties['OVERFLOW']) && strtolower($properties['OVERFLOW'])=='hidden') { $objattr['donotscroll'] = true; } + if (isset($properties['BORDER-TOP-COLOR'])) { $objattr['border-col'] = $this->ConvertColor($properties['BORDER-TOP-COLOR']); } + if (isset($properties['BACKGROUND-COLOR'])) { $objattr['background-col'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + } + $this->SetLineHeight('',$this->form->textarea_lineheight); + $formLineHeight = $this->lineheight; + + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($properties['VERTICAL-ALIGN']) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + $colsize = 20; //HTML default value + $rowsize = 2; //HTML default value + if (isset($attr['COLS'])) $colsize = intval($attr['COLS']); + if (isset($attr['ROWS'])) $rowsize = intval($attr['ROWS']); + + $charsize = $this->GetCharWidth('w',false); + if ($w) { $colsize = round(($w-($this->form->form_element_spacing['textarea']['outer']['h']*2)-($this->form->form_element_spacing['textarea']['inner']['h']*2))/$charsize); } + if ($h) { $rowsize = round(($h-($this->form->form_element_spacing['textarea']['outer']['v']*2)-($this->form->form_element_spacing['textarea']['inner']['v']*2))/$formLineHeight); } + + $objattr['type'] = 'textarea'; + $objattr['width'] = ($colsize * $charsize) + ($this->form->form_element_spacing['textarea']['outer']['h']*2)+($this->form->form_element_spacing['textarea']['inner']['h']*2); + $objattr['height'] = ($rowsize * $formLineHeight) + ($this->form->form_element_spacing['textarea']['outer']['v']*2)+($this->form->form_element_spacing['textarea']['inner']['v']*2); + $objattr['rows'] = $rowsize; + $objattr['cols'] = $colsize; + + $this->specialcontent = serialize($objattr); + + if ($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; // *TABLES* + } // *TABLES* + + // Clear properties - tidy up + $properties = array(); + break; + + + + // *********** FORM - INPUT ******************** + + case 'INPUT': + if (!isset($attr['TYPE'])) $attr['TYPE'] == 'TEXT'; + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['type'] = 'input'; + if(isset($attr['DISABLED'])) { $objattr['disabled'] = true; } + if(isset($attr['READONLY'])) { $objattr['readonly'] = true; } + if(isset($attr['REQUIRED'])) { $objattr['required'] = true; } + if(isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { $objattr['spellcheck'] = true; } + if(isset($attr['TITLE'])) { $objattr['title'] = $attr['TITLE']; } + else if(isset($attr['ALT'])) { $objattr['title'] = $attr['ALT']; } + else $objattr['title'] = ''; + $objattr['title'] = strcode2utf($objattr['title']); + $objattr['title'] = $this->lesser_entity_decode($objattr['title']); + if ($this->onlyCoreFonts) + $objattr['title'] = mb_convert_encoding($objattr['title'], $this->mb_enc,'UTF-8'); + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $objattr['fieldname'] = $attr['NAME']; } + } + if(isset($attr['VALUE'])) { + $attr['VALUE'] = strcode2utf($attr['VALUE']); + $attr['VALUE'] = $this->lesser_entity_decode($attr['VALUE']); + if ($this->onlyCoreFonts) + $attr['VALUE'] = mb_convert_encoding($attr['VALUE'], $this->mb_enc,'UTF-8'); + $objattr['value'] = $attr['VALUE']; + } + + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + $objattr['vertical-align'] = ''; + + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],($this->default_font_size/_MPDFK)); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + if ($this->useActiveForms) { + if(isset($attr['ALIGN'])) { $objattr['text_align'] = $align[strtolower($attr['ALIGN'])]; } + else if(isset($properties['TEXT-ALIGN'])) { $objattr['text_align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + if (isset($properties['BORDER-TOP-COLOR'])) { $objattr['border-col'] = $this->ConvertColor($properties['BORDER-TOP-COLOR']); } + if (isset($properties['BACKGROUND-COLOR'])) { $objattr['background-col'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + } + + $type = ''; + $texto=''; + $height = $this->FontSize; + $width = 0; + $spacesize = $this->GetCharWidth(' ',false); + + $w = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + + if ($properties['VERTICAL-ALIGN']) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + switch(strtoupper($attr['TYPE'])){ + case 'HIDDEN': + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + if ($this->useActiveForms) { + $this->form->SetFormText( 0, 0, $objattr['fieldname'], $objattr['value'], $objattr['value'], '', 0, '', true ); + } + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + break 2; + case 'CHECKBOX': //Draw Checkbox + $type = 'CHECKBOX'; + if (isset($attr['CHECKED'])) { $objattr['checked'] = true; } + else { $objattr['checked'] = false; } + $width = $this->FontSize; + $height = $this->FontSize; + break; + + case 'RADIO': //Draw Radio button + $type = 'RADIO'; + if (isset($attr['CHECKED'])) $objattr['checked'] = true; + $width = $this->FontSize; + $height = $this->FontSize; + break; + +/*-- IMAGES-CORE --*/ + case 'IMAGE': // Draw an Image button + if(isset($attr['SRC'])) { + $type = 'IMAGE'; + $srcpath = $attr['SRC']; + $orig_srcpath = $attr['ORIG_SRC']; + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width']); + + $extraheight = $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + // Image file + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + if ($info['cs']=='Indexed') { $objattr['Indexed'] = true; } + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // SVG units are pixels + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h'])/_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + if (isset($properties['IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi']>0) { + $w *= $this->img_dpi / $info['set-dpi']; + $h *= $this->img_dpi / $info['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $w *= $this->img_dpi / $dpi; + $h *= $this->img_dpi / $dpi; + } + } + } + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=$h*$info['w']/$info['h']; + if($h==0) $h=$w*$info['h']/$info['w']; + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=$w*$info['h']/$info['w']; + } + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=$h*$info['w']/$info['h']; + } + $height = $h + $extraheight; + $width = $w + $extrawidth; + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; + $objattr['ID'] = $info['i']; + $texto = 'X'; + if ($this->useActiveForms) { + if (isset($attr['ONCLICK'])) { $objattr['onClick'] = $attr['ONCLICK']; } + $objattr['type'] = 'input'; + $type = 'IMAGE'; + } + break; + } +/*-- END IMAGES-CORE --*/ + + case 'BUTTON': // Draw a button + case 'SUBMIT': + case 'RESET': + $type = strtoupper($attr['TYPE']); + if ($type=='IMAGE') { $type = 'BUTTON'; } // src path not found + if(isset($attr['NOPRINT'])) { $objattr['noprint'] = true; } + if (!isset($attr['VALUE'])) { + $objattr['value'] = ucfirst(strtolower($type)); + } + + $texto = " " . $objattr['value'] . " "; + $width = $this->GetStringWidth($texto) + ($this->form->form_element_spacing['button']['outer']['h']*2)+($this->form->form_element_spacing['button']['inner']['h']*2); + $height = $this->FontSize + ($this->form->form_element_spacing['button']['outer']['v']*2)+($this->form->form_element_spacing['button']['inner']['v']*2); + if ($this->useActiveForms) { + if (isset($attr['ONCLICK'])) { $objattr['onClick'] = $attr['ONCLICK']; } + } + break; + + case 'PASSWORD': + case 'TEXT': + default: + if ($type == '') { $type = 'TEXT'; } + if(strtoupper($attr['TYPE'])=='PASSWORD') { $type = 'PASSWORD'; } + if (isset($attr['VALUE'])) { + if ($type == 'PASSWORD') { + $num_stars = mb_strlen($attr['VALUE'],$this->mb_enc ); + $texto = str_repeat('*',$num_stars); + } + else { $texto = $attr['VALUE']; } + } + $xw = ($this->form->form_element_spacing['input']['outer']['h']*2)+($this->form->form_element_spacing['input']['inner']['h']*2); + $xh = ($this->form->form_element_spacing['input']['outer']['v']*2)+($this->form->form_element_spacing['input']['inner']['v']*2); + if ($w) { $width = $w + $xw; } + else { $width = (20 * $spacesize) + $xw; } // Default width in chars + if (isset($attr['SIZE']) and ctype_digit($attr['SIZE']) ) $width = ($attr['SIZE'] * $spacesize) + $xw; + $height = $this->FontSize + $xh; + if (isset($attr['MAXLENGTH']) and ctype_digit($attr['MAXLENGTH']) ) $objattr['maxlength'] = $attr['MAXLENGTH']; + if ($this->useActiveForms) { + if (isset($attr['ONCALCULATE'])) { $objattr['onCalculate'] = $attr['ONCALCULATE']; } + else if (isset($attr['ONCHANGE'])) { $objattr['onCalculate'] = $attr['ONCHANGE']; } + if (isset($attr['ONVALIDATE'])) { $objattr['onValidate'] = $attr['ONVALIDATE']; } + if (isset($attr['ONKEYSTROKE'])) { $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; } + if (isset($attr['ONFORMAT'])) { $objattr['onFormat'] = $attr['ONFORMAT']; } + } + break; + } + + $objattr['subtype'] = $type; + $objattr['text'] = $texto; + $objattr['width'] = $width; + $objattr['height'] = $height; + $e = "\xbb\xa4\xactype=input,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + break; // END of INPUT +/*-- END FORMS --*/ + + + // *********** GRAPH ******************** + case 'JPGRAPH': + if (!$this->useGraphs) { break; } + if ($attr['TABLE']) { $gid = strtoupper($attr['TABLE']); } + else { $gid = '0'; } + if (!is_array($this->graphs[$gid]) || count($this->graphs[$gid])==0 ) { break; } + include_once(_MPDF_PATH.'graph.php'); + $this->graphs[$gid]['attr'] = $attr; + + + if (isset($this->graphs[$gid]['attr']['WIDTH']) && $this->graphs[$gid]['attr']['WIDTH']) { + $this->graphs[$gid]['attr']['cWIDTH']=$this->ConvertSize($this->graphs[$gid]['attr']['WIDTH'],$pgwidth); + } // mm + if (isset($this->graphs[$gid]['attr']['HEIGHT']) && $this->graphs[$gid]['attr']['HEIGHT']) { + $this->graphs[$gid]['attr']['cHEIGHT']=$this->ConvertSize($this->graphs[$gid]['attr']['HEIGHT'],$pgwidth); + } + + $graph_img = print_graph($this->graphs[$gid],$this->blk[$this->blklvl]['inner_width']); + if ($graph_img) { + if(isset($attr['ROTATE'])) { + if ($attr['ROTATE']==90 || $attr['ROTATE']==-90) { + $tmpw = $graph_img['w']; + $graph_img['w']= $graph_img['h']; + $graph_img['h']= $tmpw; + } + } + $attr['SRC'] = $graph_img['file']; + $attr['WIDTH'] = $graph_img['w']; + $attr['HEIGHT'] = $graph_img['h']; + } + else { break; } + + // *********** IMAGE ******************** +/*-- IMAGES-CORE --*/ + case 'IMG': + if ($this->progressBar) { $this->UpdateProgressBar(1,'','IMG'); } // *PROGRESS-BAR* + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + if(isset($attr['SRC'])) { + $srcpath = $attr['SRC']; + $orig_srcpath = $attr['ORIG_SRC']; + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + // mPDF 5.6.01 - LAYERS + if (isset($properties['Z-INDEX']) && $this->currentlayer==0) { + $v = intval($properties['Z-INDEX']); + if ($v > 0) { + $objattr['z-index'] = $v; + } + } + + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['WIDTH'])) $w = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['HEIGHT'])) $h = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + // mPDF 5.5.15 // mPDF 5.6.60 + $maxw=$maxh=$minw=$minh=false; + if(isset($properties['MAX-WIDTH'])) $maxw = $this->ConvertSize($properties['MAX-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MAX-WIDTH'])) $maxw = $this->ConvertSize($attr['MAX-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MAX-HEIGHT'])) $maxh = $this->ConvertSize($properties['MAX-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MAX-HEIGHT'])) $maxh = $this->ConvertSize($attr['MAX-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MIN-WIDTH'])) $minw = $this->ConvertSize($properties['MIN-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MIN-WIDTH'])) $minw = $this->ConvertSize($attr['MIN-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MIN-HEIGHT'])) $minh = $this->ConvertSize($properties['MIN-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MIN-HEIGHT'])) $minh = $this->ConvertSize($attr['MIN-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + +/*-- BACKGROUNDS --*/ + if(isset($properties['GRADIENT-MASK']) && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/',$properties['GRADIENT-MASK'])) { + $objattr['GRADIENT-MASK'] = $properties['GRADIENT-MASK']; + } +/*-- END BACKGROUNDS --*/ + + // Image file + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + + if(isset($attr['ROTATE'])) { $image_orientation = $attr['ROTATE']; } + else if(isset($properties['IMAGE-ORIENTATION'])) { $image_orientation = $properties['IMAGE-ORIENTATION']; } + else { $image_orientation = 0; } + if($image_orientation) { + if ($image_orientation==90 || $image_orientation==-90 || $image_orientation==270) { + $tmpw = $info['w']; + $info['w'] = $info['h']; + $info['h'] = $tmpw; + } + $objattr['ROTATE'] = $image_orientation; + } + + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // SVG units are pixels + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h'])/_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + if (isset($properties['IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi']>0) { + $w *= $this->img_dpi / $info['set-dpi']; + $h *= $this->img_dpi / $info['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $w *= $this->img_dpi / $dpi; + $h *= $this->img_dpi / $dpi; + } + } + } + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + + // mPDF 5.5.15 + if ($minw && $w<$minw) { $w = $minw; $h=abs($w*$info['h']/$info['w']); } + if ($maxw && $w>$maxw) { $w = $maxw; $h=abs($w*$info['h']/$info['w']); } + if ($minh && $h<$minh) { $h = $minh; $w=abs($h*$info['w']/$info['h']); } + if ($maxh && $h>$maxh) { $h = $maxh; $w=abs($h*$info['w']/$info['h']); } + + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=abs($w*$info['h']/$info['w']); + } + + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=abs($h*$info['w']/$info['h']); + } + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; +/*-- CSS-IMAGE-FLOAT --*/ + if (!$this->ColActive && !$this->tableLevel && !$this->listlvl && !$this->kwt && !$this->keep_block_together) { + if (isset($properties['FLOAT']) && (strtoupper($properties['FLOAT']) == 'RIGHT' || strtoupper($properties['FLOAT']) == 'LEFT')) { + $objattr['float'] = substr(strtoupper($properties['FLOAT']),0,1); + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* +/*-- ANNOTATIONS --*/ + if ($this->title2annots && isset($attr['TITLE'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['CONTENT'] = $attr['TITLE']; + $objattr['type'] = 'annot'; + $objattr['POS-X'] = 0; + $objattr['POS-Y'] = 0; + $objattr['ICON'] = 'Comment'; + $objattr['AUTHOR'] = ''; + $objattr['SUBJECT'] = ''; + $objattr['OPACITY'] = $this->annotOpacity; + $objattr['COLOR'] = $this->ConvertColor('yellow'); + $e = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } +/*-- END ANNOTATIONS --*/ + } + break; +/*-- END IMAGES-CORE --*/ + + + // *********** CIRCULAR TEXT = TEXTCIRCLE ******************** + case 'TEXTCIRCLE': + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['top-text'] = ''; + $objattr['bottom-text'] = ''; + $objattr['r'] = 20; // radius (default value here for safety) + $objattr['space-width'] = 120; + $objattr['char-width'] = 100; + + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); + + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + if (isset($attr['R'])) { $objattr['r']=$this->ConvertSize($attr['R'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if(isset($attr['TOP-TEXT'])) { + $objattr['top-text'] = strcode2utf($attr['TOP-TEXT']); + $objattr['top-text'] = $this->lesser_entity_decode($objattr['top-text']); + if ($this->onlyCoreFonts) + $objattr['top-text'] = mb_convert_encoding($objattr['top-text'], $this->mb_enc,'UTF-8'); + } + if(isset($attr['BOTTOM-TEXT'])) { + $objattr['bottom-text'] = strcode2utf($attr['BOTTOM-TEXT']); + $objattr['bottom-text'] = $this->lesser_entity_decode($objattr['bottom-text']); + if ($this->onlyCoreFonts) + $objattr['bottom-text'] = mb_convert_encoding($objattr['bottom-text'], $this->mb_enc,'UTF-8'); + } + if(isset($attr['SPACE-WIDTH']) && $attr['SPACE-WIDTH']) { $objattr['space-width'] = $attr['SPACE-WIDTH']; } + if(isset($attr['CHAR-WIDTH']) && $attr['CHAR-WIDTH']) { $objattr['char-width'] = $attr['CHAR-WIDTH']; } + + // VISIBILITY + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + // mPDF 5.5.23 + if (isset($properties['FONT-SIZE'])) { + if (strtolower($properties['FONT-SIZE'])=='auto') { + if ($objattr['top-text'] && $objattr['bottom-text']) { + $objattr['fontsize'] = -2; + } + else { + $objattr['fontsize'] = -1; + } + } + else { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],($this->default_font_size/_MPDFK)); + $this->SetFontSize($mmsize*_MPDFK,false); + $objattr['fontsize'] = $this->FontSizePt; + } + } + // mPDF 5.5.23 + if(isset($attr['DIVIDER'])) { + $objattr['divider'] = strcode2utf($attr['DIVIDER']); + $objattr['divider'] = $this->lesser_entity_decode($objattr['divider']); + if ($this->onlyCoreFonts) + $objattr['divider'] = mb_convert_encoding($objattr['divider'], $this->mb_enc,'UTF-8'); + + } + + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + + $objattr['fontstyle'] = ''; + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $objattr['fontstyle'] .= 'B'; } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $objattr['fontstyle'] .= 'I'; } + } + + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + $objattr['fontfamily'] = $this->FontFamily; + + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { $objattr['bgcolor'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + else { $objattr['bgcolor'] = false; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + + $w = $objattr['r']*2; + $h = $w; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['type'] = 'textcircle'; + + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + break; + + +/*-- TABLES --*/ + + case 'TABLE': // TABLE-BEGIN + $this->tdbegin = false; + $this->lastoptionaltag = ''; + // Disable vertical justification in columns + if ($this->ColActive) { $this->colvAlign = ''; } // *COLUMNS* + if ($this->lastblocklevelchange == 1) { $blockstate = 1; } // Top margins/padding only + else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + // called from block after new div e.g.
    ... ... Outputs block top margin/border and padding + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange == 1 && !$this->tableLevel && !$this->kwt) { + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,1,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + } + else if (!$this->tableLevel && count($this->textbuffer)) { $this->printbuffer($this->textbuffer,$blockstate); } + + $this->textbuffer=array(); + $this->lastblocklevelchange = -1; + if ($this->tableLevel) { // i.e. now a nested table coming... + // Save current level table + // mPDF 5.4.10 + $this->cell['PARENTCELL'] = $this->saveInlineProperties(); + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['baseProperties']= $this->base_table_properties; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = $this->cell; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currrow'] = $this->row; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currcol'] = $this->col; + } + $this->tableLevel++; + $this->cssmgr->tbCSSlvl++; + + if ($this->tableLevel>1) { // inherit table properties from cell in which nested + $this->base_table_properties['FONT-KERNING'] = $this->kerning ; + $this->base_table_properties['LETTER-SPACING'] = $this->lSpacingCSS ; + $this->base_table_properties['WORD-SPACING'] = $this->wSpacingCSS ; + } + + if (isset($this->tbctr[$this->tableLevel])) { $this->tbctr[$this->tableLevel]++; } + else { $this->tbctr[$this->tableLevel] = 1; } + + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['level'] = $this->tableLevel; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['levelid'] = $this->tbctr[$this->tableLevel]; + + if ($this->tableLevel > $this->innermostTableLevel) { $this->innermostTableLevel = $this->tableLevel; } + if ($this->tableLevel > 1) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nestedpos'] = array($this->row,$this->col,$this->tbctr[($this->tableLevel-1)]); + } + //++++++++++++++++++++++++++++ + + $this->cell = array(); + $this->col=-1; //int + $this->row=-1; //int + $table = &$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]; + + // New table - any level + if ($this->cacheTables) { + $this->packTableData = true; // required for cacheTables + $this->simpleTables = false; // Cannot co-exist with cacheTables + $table['cache'] = _MPDF_TEMP_PATH.'_tempTblCache'.RAND(1,1000000).'.dat'; + $fh = fopen($table['cache'] , "wb") or $this->Error("When using cacheTables, you must have read/write access to cache files (".$table['cache'] .")"); + fwrite($fh, "\x00"); + fclose($fh); + $table['ptr'] = 1 ; // Must not be 0 + } + + $table['direction'] = $this->directionality; + $table['bgcolor'] = false; + $table['va'] = false; + $table['txta'] = false; + $table['topntail'] = false; + $table['thead-underline'] = false; + $table['border'] = false; + $table['border_details']['R']['w'] = 0; + $table['border_details']['L']['w'] = 0; + $table['border_details']['T']['w'] = 0; + $table['border_details']['B']['w'] = 0; + $table['border_details']['R']['style'] = ''; + $table['border_details']['L']['style'] = ''; + $table['border_details']['T']['style'] = ''; + $table['border_details']['B']['style'] = ''; + $table['max_cell_border_width']['R'] = 0; + $table['max_cell_border_width']['L'] = 0; + $table['max_cell_border_width']['T'] = 0; + $table['max_cell_border_width']['B'] = 0; + $table['padding']['L'] = false; + $table['padding']['R'] = false; + $table['padding']['T'] = false; + $table['padding']['B'] = false; + $table['margin']['L'] = false; + $table['margin']['R'] = false; + $table['margin']['T'] = false; + $table['margin']['B'] = false; + $table['a'] = false; + $table['border_spacing_H'] = false; + $table['border_spacing_V'] = false; + $table['decimal_align'] = false; // mPDF 5.6.13 + $this->Reset(); + $this->InlineProperties = array(); + $this->spanlvl = 0; + $table['nc'] = $table['nr'] = 0; + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->tabletheadjustfinished = false; + + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins && $this->tableLevel==1) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + + if ($this->tableLevel==1) { + $this->tableCJK = false; + $this->table_lineheight = $this->normalLineheight; + $table['headernrows'] = 0; + $table['footernrows'] = 0; + $this->base_table_properties = array(); + } + + // ADDED CSS FUNCIONS FOR TABLE + if ($this->cssmgr->tbCSSlvl==1) { + $properties = $this->cssmgr->MergeCSS('TOPTABLE',$tag,$attr); + } + else { + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + } + $w = ''; + if (isset($properties['WIDTH'])) { $w = $properties['WIDTH']; } + else if (isset($attr['WIDTH']) && $attr['WIDTH']) { $w = $attr['WIDTH']; } + + + if(isset($properties['DIRECTION']) && $properties['DIRECTION']) { $table['direction'] = strtolower($properties['DIRECTION']); } + else if(isset($attr['DIR']) && $attr['DIR']) { $table['direction'] = strtolower($attr['DIR']); } + else if (!isset($table['direction'])){ $table['direction'] = $this->blk[$this->blklvl]['direction']; } + + if (isset($properties['BACKGROUND-COLOR'])) { $table['bgcolor'][-1] = $properties['BACKGROUND-COLOR']; } + else if (isset($properties['BACKGROUND'])) { $table['bgcolor'][-1] = $properties['BACKGROUND']; } + else if (isset($attr['BGCOLOR'])) { $table['bgcolor'][-1] = $attr['BGCOLOR']; } + if (isset($properties['VERTICAL-ALIGN'])) { $table['va'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + if (isset($properties['TEXT-ALIGN'])) { $table['txta'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + if (isset($attr['ALIGN'])) { $table['a'] = $align[strtolower($attr['ALIGN'])]; } + if (!$table['a']) { + if ($table['direction'] == 'rtl' ) { $table['a'] = 'R'; } + else { $table['a'] = 'L'; } + } + + if (isset($properties['AUTOSIZE']) && $properties['AUTOSIZE'] && $this->tableLevel ==1) { + $this->shrink_this_table_to_fit = $properties['AUTOSIZE']; + if ($this->shrink_this_table_to_fit < 1) { $this->shrink_this_table_to_fit = 0; } + } + if (isset($properties['ROTATE']) && $properties['ROTATE'] && $this->tableLevel ==1) { + $this->table_rotate = $properties['ROTATE']; + } + if (isset($properties['TOPNTAIL'])) { $table['topntail'] = $properties['TOPNTAIL']; } + if (isset($properties['THEAD-UNDERLINE'])) { $table['thead-underline'] = $properties['THEAD-UNDERLINE']; } + + if (isset($properties['BORDER'])) { + $bord = $this->border_details($properties['BORDER']); + if ($bord['s']) { + $table['border'] = _BORDER_ALL; + $table['border_details']['R'] = $bord; + $table['border_details']['L'] = $bord; + $table['border_details']['T'] = $bord; + $table['border_details']['B'] = $bord; + } + } + if (isset($properties['BORDER-RIGHT'])) { + if ($table['direction'] == 'rtl') { // *RTL* + $table['border_details']['R'] = $this->border_details($properties['BORDER-LEFT']); // *RTL* + } // *RTL* + else { // *RTL* + $table['border_details']['R'] = $this->border_details($properties['BORDER-RIGHT']); + } // *RTL* + $this->setBorder($table['border'], _BORDER_RIGHT, $table['border_details']['R']['s']); + } + if (isset($properties['BORDER-LEFT'])) { + if ($table['direction'] == 'rtl') { // *RTL* + $table['border_details']['L'] = $this->border_details($properties['BORDER-RIGHT']); // *RTL* + } // *RTL* + else { // *RTL* + $table['border_details']['L'] = $this->border_details($properties['BORDER-LEFT']); + } // *RTL* + $this->setBorder($table['border'], _BORDER_LEFT, $table['border_details']['L']['s']); + } + if (isset($properties['BORDER-BOTTOM'])) { + $table['border_details']['B'] = $this->border_details($properties['BORDER-BOTTOM']); + $this->setBorder($table['border'], _BORDER_BOTTOM, $table['border_details']['B']['s']); + } + if (isset($properties['BORDER-TOP'])) { + $table['border_details']['T'] = $this->border_details($properties['BORDER-TOP']); + $this->setBorder($table['border'], _BORDER_TOP, $table['border_details']['T']['s']); + } + if ($table['border']){ + $this->table_border_css_set = 1; + } + else { + $this->table_border_css_set = 0; + } + + if (isset($properties['FONT-FAMILY'])) { + $this->default_font = $properties['FONT-FAMILY']; + $this->SetFont($this->default_font,'',0,false); + } + $this->base_table_properties['FONT-FAMILY'] = $this->FontFamily; // mPDF 5.4.10 + + if (isset($properties['FONT-SIZE'])) { + // mPDF 5.4.10 + if ($this->tableLevel>1) { $mmsize = $this->ConvertSize($properties['FONT-SIZE'], $this->base_table_properties['FONT-SIZE']); } + else { $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); } + if ($mmsize) { + $this->default_font_size = $mmsize*(_MPDFK); + $this->SetFontSize($this->default_font_size,false); + } + } + $this->base_table_properties['FONT-SIZE'] = $this->FontSize.'mm'; // mPDF 5.4.10 + + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->base_table_properties['FONT-WEIGHT'] = 'BOLD'; } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->base_table_properties['FONT-STYLE'] = 'ITALIC'; } + } + if (isset($properties['COLOR'])) { + $this->base_table_properties['COLOR'] = $properties['COLOR']; + } + if (isset($properties['FONT-KERNING'])) { + $this->base_table_properties['FONT-KERNING'] = $properties['FONT-KERNING']; + } + if (isset($properties['LETTER-SPACING'])) { + $this->base_table_properties['LETTER-SPACING'] = $properties['LETTER-SPACING']; + } + if (isset($properties['WORD-SPACING'])) { + $this->base_table_properties['WORD-SPACING'] = $properties['WORD-SPACING']; + } + + if (isset($properties['PADDING-LEFT'])) { + $table['padding']['L'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-RIGHT'])) { + $table['padding']['R'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-TOP'])) { + $table['padding']['T'] = $this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-BOTTOM'])) { + $table['padding']['B'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-TOP'])) { + if ($lastbottommargin) { + $tmp = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($tmp > $lastbottommargin) { $properties['MARGIN-TOP'] -= $lastbottommargin; } + else { $properties['MARGIN-TOP'] = 0; } + } + $table['margin']['T'] = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-BOTTOM'])) { + $table['margin']['B'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['MARGIN-LEFT'])) { + $table['margin']['L'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-RIGHT'])) { + $table['margin']['R'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['MARGIN-LEFT']) && isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT'])=='auto' && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $table['a'] = 'C'; + } + else if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $table['a'] = 'R'; + } + else if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $table['a'] = 'L'; + } + + if (isset($properties['LINE-HEIGHT']) && $this->tableLevel==1) { + $this->table_lineheight = $this->fixLineheight($properties['LINE-HEIGHT']); + if (!$this->table_lineheight) { $this->table_lineheight = $this->normalLineheight; } + } + + if (isset($properties['BORDER-COLLAPSE']) && strtoupper($properties['BORDER-COLLAPSE'])=='SEPARATE') { + $table['borders_separate'] = true; + } + else { + $table['borders_separate'] = false; + } + + if (!$table['borders_separate']) { $table['border_spacing_H'] = $table['border_spacing_V'] = 0; } + else if (isset($attr['CELLSPACING'])) { + $table['border_spacing_H'] = $table['border_spacing_V'] = $this->ConvertSize($attr['CELLSPACING'],$this->blk[$this->blklvl]['inner_width']); + } + if (isset($properties['BORDER-SPACING-H'])) { + $table['border_spacing_H'] = $this->ConvertSize($properties['BORDER-SPACING-H'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['BORDER-SPACING-V'])) { + $table['border_spacing_V'] = $this->ConvertSize($properties['BORDER-SPACING-V'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['EMPTY-CELLS'])) { + $table['empty_cells'] = strtolower($properties['EMPTY-CELLS']); // 'hide' or 'show' + } + else { $table['empty_cells'] = ''; } + + if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE'])=='AVOID' && $this->tableLevel==1 && !$this->writingHTMLfooter) { + $this->table_keep_together = true; + } + else if ($this->tableLevel==1) { + $this->table_keep_together = false; + } + if (isset($properties['PAGE-BREAK-AFTER']) && $this->tableLevel==1) { + $table['page_break_after'] = strtoupper($properties['PAGE-BREAK-AFTER']); + } + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT']) && !$this->kwt && !$this->ColActive) { $table['gradient'] = $properties['BACKGROUND-GRADIENT']; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $table['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + if (isset($properties['OVERFLOW'])) { + $table['overflow'] = strtolower($properties['OVERFLOW']); // 'hidden' 'wrap' or 'visible' or 'auto' + if (($this->ColActive || $this->tableLevel>1) && $table['overflow']=='visible') { unset($table['overflow']); } + } + + $properties = array(); + + + + if (isset($attr['CELLPADDING'])) { + $table['cell_padding'] = $attr['CELLPADDING']; + } + else { + $table['cell_padding'] = false; + } + + if (isset($attr['BORDER']) && $attr['BORDER']=='1') { // mPDF 5.5.08 + $this->table_border_attr_set = 1; // mPDF 5.5.08 + $bord = $this->border_details('#000000 1px solid'); + if ($bord['s']) { + $table['border'] = _BORDER_ALL; + $table['border_details']['R'] = $bord; + $table['border_details']['L'] = $bord; + $table['border_details']['T'] = $bord; + $table['border_details']['B'] = $bord; + } + } + else { + $this->table_border_attr_set = 0; + } + + if ($w) { + $maxwidth = $this->blk[$this->blklvl]['inner_width']; + if ($table['borders_separate']) { + $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['border_details']['L']['w']/2 + $table['border_details']['R']['w']/2; + } + else { + $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2; + } + if (strpos($w,'%') && $this->tableLevel == 1 && !$this->ignore_table_percents ) { + // % needs to be of inner box without table margins etc. + $maxwidth -= $tblblw ; + $wmm = $this->ConvertSize($w,$maxwidth,$this->FontSize,false); + $table['w'] = $wmm + $tblblw ; + } + if (strpos($w,'%') && $this->tableLevel > 1 && !$this->ignore_table_percents && $this->keep_table_proportions) { + $table['wpercent'] = $w + 0; // makes 80% -> 80 + } + if (!strpos($w,'%') && !$this->ignore_table_widths ) { + $wmm = $this->ConvertSize($w,$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $table['w'] = $wmm + $tblblw ; + } + if (!$this->keep_table_proportions) { + if (isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width']) { $table['w'] = $this->blk[$this->blklvl]['inner_width']; } + } + } + + if (isset($attr['AUTOSIZE']) && $this->tableLevel==1) { + $this->shrink_this_table_to_fit = $attr['AUTOSIZE']; + if ($this->shrink_this_table_to_fit < 1) { $this->shrink_this_table_to_fit = 1; } + } + if (isset($attr['ROTATE']) && $this->tableLevel==1) { + $this->table_rotate = $attr['ROTATE']; + } + + //++++++++++++++++++++++++++++ + // keeping block together on one page + // Autosize is now forced therefore keep block together disabled + if ($this->keep_block_together) { + $this->keep_block_together = 0; + $this->printdivbuffer(); + $this->blk[$this->blklvl]['keep_block_together'] = 0; + } + if ($this->table_rotate) { + $this->tbrot_Links = array(); + $this->tbrot_Annots = array(); + $this->tbrotForms = array(); + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + } + + if ($this->kwt) { + if ($this->table_rotate) { $this->table_keep_together = true; } + $this->kwt = false; + $this->kwt_saved = true; + } + + if ($this->tableLevel==1 && $this->useGraphs) { + if (isset($attr['ID']) && $attr['ID']) { $this->currentGraphId = strtoupper($attr['ID']); } + else { $this->currentGraphId = '0'; } + $this->graphs[$this->currentGraphId] = array(); + } + //++++++++++++++++++++++++++++ + $this->plainCell_properties = array(); + unset($table); + break; + + case 'THEAD': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->tablethead = 1; + $this->tabletfoot = 0; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->thead_font_weight = 'B'; } + else { $this->thead_font_weight = ''; } + } + + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->thead_font_style = 'I'; } + else { $this->thead_font_style = ''; } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->thead_font_smCaps = 'S'; } + else { $this->thead_font_smCaps = ''; } + } + + if (isset($properties['VERTICAL-ALIGN'])) { + $this->thead_valign_default = $properties['VERTICAL-ALIGN']; + } + if (isset($properties['TEXT-ALIGN'])) { + $this->thead_textalign_default = $properties['TEXT-ALIGN']; + } + $properties = array(); + break; + + case 'TFOOT': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->tabletfoot = 1; + $this->tablethead = 0; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->tfoot_font_weight = 'B'; } + else { $this->tfoot_font_weight = ''; } + } + + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->tfoot_font_style = 'I'; } + else { $this->tfoot_font_style = ''; } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->tfoot_font_smCaps = 'S'; } + else { $this->tfoot_font_smCaps = ''; } + } + + if (isset($properties['VERTICAL-ALIGN'])) { + $this->tfoot_valign_default = $properties['VERTICAL-ALIGN']; + } + if (isset($properties['TEXT-ALIGN'])) { + $this->tfoot_textalign_default = $properties['TEXT-ALIGN']; + } + $properties = array(); + break; + + + case 'TBODY': + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + break; + + + case 'TR': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->row++; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']++; + $this->col = -1; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + + if (!$this->simpleTables && (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['borders_separate']) || !$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['borders_separate'])) { + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-left'][$this->row] = $properties['BORDER-LEFT']; } + if (isset($properties['BORDER-RIGHT']) && $properties['BORDER-RIGHT']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-right'][$this->row] = $properties['BORDER-RIGHT']; } + if (isset($properties['BORDER-TOP']) && $properties['BORDER-TOP']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-top'][$this->row] = $properties['BORDER-TOP']; } + if (isset($properties['BORDER-BOTTOM']) && $properties['BORDER-BOTTOM']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-bottom'][$this->row] = $properties['BORDER-BOTTOM']; } + } + + if (isset($properties['BACKGROUND-COLOR'])) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$this->row] = $properties['BACKGROUND-COLOR']; } + else if (isset($attr['BGCOLOR'])) $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$this->row] = $attr['BGCOLOR']; + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT']) && !$this->kwt && !$this->ColActive) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$this->row] = $properties['BACKGROUND-GRADIENT']; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$this->row] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + + if (isset($properties['TEXT-ROTATE'])) { + $this->trow_text_rotate = $properties['TEXT-ROTATE']; + } + if (isset($attr['TEXT-ROTATE'])) $this->trow_text_rotate = $attr['TEXT-ROTATE']; + + if ($this->tablethead) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_thead'][$this->row] = true; } + if ($this->tabletfoot) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$this->row] = true; } + $properties = array(); + break; + + + case 'TH': + case 'TD': + $this->ignorefollowingspaces = true; + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->InlineProperties = array(); + $this->spanlvl = 0; + $this->tdbegin = true; + $this->col++; + while (isset($this->cell[$this->row][$this->col])) { $this->col++; } + + //Update number column + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] < $this->col+1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] = $this->col+1; } + + $table = &$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]; + + $c = array('a' => false, + 'R' => false, + 'nowrap' => false, + 'bgcolor' => false, + 'padding' => array('L' => false, + 'R' => false, + 'T' => false, + 'B' => false + ) + ); + + if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border'] = false; + $table['simple']['border_details']['R']['w'] = 0; + $table['simple']['border_details']['L']['w'] = 0; + $table['simple']['border_details']['T']['w'] = 0; + $table['simple']['border_details']['B']['w'] = 0; + $table['simple']['border_details']['R']['style'] = ''; + $table['simple']['border_details']['L']['style'] = ''; + $table['simple']['border_details']['T']['style'] = ''; + $table['simple']['border_details']['B']['style'] = ''; + } + else if (!$this->simpleTables) { + $c['border'] = false; + $c['border_details']['R']['w'] = 0; + $c['border_details']['L']['w'] = 0; + $c['border_details']['T']['w'] = 0; + $c['border_details']['B']['w'] = 0; + $c['border_details']['mbw']['BL'] = 0; + $c['border_details']['mbw']['BR'] = 0; + $c['border_details']['mbw']['RT'] = 0; + $c['border_details']['mbw']['RB'] = 0; + $c['border_details']['mbw']['TL'] = 0; + $c['border_details']['mbw']['TR'] = 0; + $c['border_details']['mbw']['LT'] = 0; + $c['border_details']['mbw']['LB'] = 0; + $c['border_details']['R']['style'] = ''; + $c['border_details']['L']['style'] = ''; + $c['border_details']['T']['style'] = ''; + $c['border_details']['B']['style'] = ''; + $c['border_details']['R']['s'] = 0; + $c['border_details']['L']['s'] = 0; + $c['border_details']['T']['s'] = 0; + $c['border_details']['B']['s'] = 0; + $c['border_details']['R']['c'] = $this->ConvertColor(0); + $c['border_details']['L']['c'] = $this->ConvertColor(0); + $c['border_details']['T']['c'] = $this->ConvertColor(0); + $c['border_details']['B']['c'] = $this->ConvertColor(0); + $c['border_details']['R']['dom'] = 0; + $c['border_details']['L']['dom'] = 0; + $c['border_details']['T']['dom'] = 0; + $c['border_details']['B']['dom'] = 0; + } + + + if ($table['va']) { $c['va'] = $table['va']; } + if ($table['txta']) { $c['a'] = $table['txta']; } + if ($this->table_border_attr_set) { + if ($table['border_details']) { + if (!$this->simpleTables){ + $c['border_details']['R'] = $table['border_details']['R']; + $c['border_details']['L'] = $table['border_details']['L']; + $c['border_details']['T'] = $table['border_details']['T']; + $c['border_details']['B'] = $table['border_details']['B']; + $c['border'] = $table['border']; + $c['border_details']['L']['dom'] = 1; + $c['border_details']['R']['dom'] = 1; + $c['border_details']['T']['dom'] = 1; + $c['border_details']['B']['dom'] = 1; + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border_details']['R'] = $table['border_details']['R']; + $table['simple']['border_details']['L'] = $table['border_details']['L']; + $table['simple']['border_details']['T'] = $table['border_details']['T']; + $table['simple']['border_details']['B'] = $table['border_details']['B']; + $table['simple']['border'] = $table['border']; + } + } + } + // INHERITED THEAD CSS Properties + if ($this->tablethead) { + if ($this->thead_valign_default) $c['va'] = $align[strtolower($this->thead_valign_default)]; + if ($this->thead_textalign_default) $c['a'] = $align[strtolower($this->thead_textalign_default)]; + if ($this->thead_font_weight == 'B') { $this->SetStyle('B',true); } + if ($this->thead_font_style == 'I') { $this->SetStyle('I',true); } + if ($this->thead_font_smCaps == 'S') { $this->SetStyle('S',true); } + } + + // INHERITED TFOOT CSS Properties + if ($this->tabletfoot) { + if ($this->tfoot_valign_default) $c['va'] = $align[strtolower($this->tfoot_valign_default)]; + if ($this->tfoot_textalign_default) $c['a'] = $align[strtolower($this->tfoot_textalign_default)]; + if ($this->tfoot_font_weight == 'B') { $this->SetStyle('B',true); } + if ($this->tfoot_font_style == 'I') { $this->SetStyle('I',true); } + if ($this->tfoot_font_style == 'S') { $this->SetStyle('S',true); } + } + + + if ($this->trow_text_rotate){ + $c['R'] = $this->trow_text_rotate; + } + + $this->cell_border_dominance_L = 0; + $this->cell_border_dominance_R = 0; + $this->cell_border_dominance_T = 0; + $this->cell_border_dominance_B = 0; + + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + $properties = $this->cssmgr->array_merge_recursive_unique($this->base_table_properties, $properties); + + if (isset($properties['FONT-KERNING']) && (strtoupper($properties['FONT-KERNING'])=='NORMAL' || strtoupper($properties['FONT-KERNING'])=='AUTO')) { + $this->kerning = true; + } + else { $this->kerning = false; } + + if (isset($properties['LETTER-SPACING']) && ($properties['LETTER-SPACING'] || $properties['LETTER-SPACING']==='0') && strtoupper($properties['LETTER-SPACING']) != 'NORMAL') { + $this->lSpacingCSS = strtoupper($properties['LETTER-SPACING']); + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + else { + $this->lSpacingCSS = ''; + $this->fixedlSpacing = false; + } + if (isset($properties['WORD-SPACING']) && strtoupper($properties['WORD-SPACING']) != 'NORMAL') { + $this->wSpacingCSS = strtoupper($properties['WORD-SPACING']); + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + else { + $this->minwSpacing = 0; + $this->wSpacingCSS = ''; + } + // mPDF 5.6.08 + if (isset($properties['HYPHENS']) && $properties['HYPHENS']) { + if (strtoupper($properties['HYPHENS']) == 'NONE') { $this->textparam['hyphens'] = 2; } + else if (strtoupper($properties['HYPHENS']) == 'AUTO') { $this->textparam['hyphens'] = 1; } + else if (strtoupper($properties['HYPHENS']) == 'MANUAL') { $this->textparam['hyphens'] = 0; } + } + + if (isset($properties['BACKGROUND-COLOR'])) { $c['bgcolor'] = $properties['BACKGROUND-COLOR']; } + else if (isset($properties['BACKGROUND'])) { $c['bgcolor'] = $properties['BACKGROUND']; } + else if (isset($attr['BGCOLOR'])) $c['bgcolor'] = $attr['BGCOLOR']; + + + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT'])) { $c['gradient'] = $properties['BACKGROUND-GRADIENT']; } + else { $c['gradient'] = false; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->keep_block_together) { + $ret = $this->SetBackground($properties, $this->blk[$this->blklvl]['inner_width']); + if ($ret) { $c['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + if (isset($properties['VERTICAL-ALIGN'])) { $c['va']=$align[strtolower($properties['VERTICAL-ALIGN'])]; } + else if (isset($attr['VALIGN'])) $c['va'] = $align[strtolower($attr['VALIGN'])]; + + + // mPDF 5.6.13 + if (isset($properties['TEXT-ALIGN']) && $properties['TEXT-ALIGN']) { + if (substr($properties['TEXT-ALIGN'],0,1)=='D') { $c['a'] = $properties['TEXT-ALIGN']; } + else { $c['a'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + } + // mPDF 5.6.13 + if (isset($attr['ALIGN']) && $attr['ALIGN']) { + if (strtolower($attr['ALIGN']) == 'char') { + if (isset($attr['CHAR']) && $attr['CHAR']) { + $char = html_entity_decode($attr['CHAR']); + $char = strcode2utf($char); + $d = array_search($char,$this->decimal_align); + if ($d !== false) { $c['a'] = $d.'R'; } + } + else { $c['a'] = 'DPR'; } + } + else { $c['a'] = $align[strtolower($attr['ALIGN'])]; } + } + + if (!$c['a']) { + if (isset($table['direction']) && $table['direction'] == 'rtl' ) { $c['a'] = 'R'; } + else { $c['a'] = 'L'; } + } + + + if (isset($properties['TEXT-ROTATE']) && ($properties['TEXT-ROTATE'] || $properties['TEXT-ROTATE']==="0")){ + $c['R'] = $properties['TEXT-ROTATE']; + } + if (isset($properties['BORDER'])) { + $bord = $this->border_details($properties['BORDER']); + if ($bord['s']) { + if (!$this->simpleTables){ + $c['border'] = _BORDER_ALL; + $c['border_details']['R'] = $bord; + $c['border_details']['L'] = $bord; + $c['border_details']['T'] = $bord; + $c['border_details']['B'] = $bord; + $c['border_details']['L']['dom'] = $this->cell_border_dominance_L; + $c['border_details']['R']['dom'] = $this->cell_border_dominance_R; + $c['border_details']['T']['dom'] = $this->cell_border_dominance_T; + $c['border_details']['B']['dom'] = $this->cell_border_dominance_B; + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border'] = _BORDER_ALL; + $table['simple']['border_details']['R'] = $bord; + $table['simple']['border_details']['L'] = $bord; + $table['simple']['border_details']['T'] = $bord; + $table['simple']['border_details']['B'] = $bord; + } + } + } + if (!$this->simpleTables){ + if (isset($properties['BORDER-RIGHT']) && $properties['BORDER-RIGHT']) { + $c['border_details']['R'] = $this->border_details($properties['BORDER-RIGHT']); + $this->setBorder($c['border'], _BORDER_RIGHT, $c['border_details']['R']['s']); + $c['border_details']['R']['dom'] = $this->cell_border_dominance_R; + } + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { + $c['border_details']['L'] = $this->border_details($properties['BORDER-LEFT']); + $this->setBorder($c['border'], _BORDER_LEFT, $c['border_details']['L']['s']); + $c['border_details']['L']['dom'] = $this->cell_border_dominance_L; + } + if (isset($properties['BORDER-BOTTOM']) && $properties['BORDER-BOTTOM']) { + $c['border_details']['B'] = $this->border_details($properties['BORDER-BOTTOM']); + $this->setBorder($c['border'], _BORDER_BOTTOM, $c['border_details']['B']['s']); + $c['border_details']['B']['dom'] = $this->cell_border_dominance_B; + } + if (isset($properties['BORDER-TOP']) && $properties['BORDER-TOP']) { + $c['border_details']['T'] = $this->border_details($properties['BORDER-TOP']); + $this->setBorder($c['border'], _BORDER_TOP, $c['border_details']['T']['s']); + $c['border_details']['T']['dom'] = $this->cell_border_dominance_T; + } + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { + $bord = $this->border_details($properties['BORDER-LEFT']); + if ($bord['s']) { $table['simple']['border'] = _BORDER_ALL; } + else { $table['simple']['border'] = 0; } + $table['simple']['border_details']['R'] = $bord; + $table['simple']['border_details']['L'] = $bord; + $table['simple']['border_details']['T'] = $bord; + $table['simple']['border_details']['B'] = $bord; + } + } + + if ($this->simpleTables && $this->row==0 && $this->col==0 && !$table['borders_separate'] && $table['simple']['border'] ){ + $table['border_details'] = $table['simple']['border_details']; + $table['border'] = $table['simple']['border']; + } + + // Border set on TR (if collapsed only) + if (!$table['borders_separate'] && !$this->simpleTables && isset($table['trborder-left'][$this->row])) { + if ($this->col==0) { + $left = $this->border_details($table['trborder-left'][$this->row]); + $c['border_details']['L'] = $left; + $this->setBorder($c['border'], _BORDER_LEFT, $c['border_details']['L']['s']); + } + $c['border_details']['B'] = $this->border_details($table['trborder-bottom'][$this->row]); + $this->setBorder($c['border'], _BORDER_BOTTOM, $c['border_details']['B']['s']); + $c['border_details']['T'] = $this->border_details($table['trborder-top'][$this->row]); + $this->setBorder($c['border'], _BORDER_TOP, $c['border_details']['T']['s']); + } + + if ($this->packTableData && !$this->simpleTables) { + $c['borderbin'] = $this->_packCellBorder($c); + unset($c['border']); + unset($c['border_details']); + } + + if (isset($properties['PADDING-LEFT'])) { + $c['padding']['L'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-RIGHT'])) { + $c['padding']['R'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-BOTTOM'])) { + $c['padding']['B'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-TOP'])) { + $c['padding']['T'] = $this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + $w = ''; + if (isset($properties['WIDTH'])) { $w = $properties['WIDTH']; } + else if (isset($attr['WIDTH'])) { $w = $attr['WIDTH']; } + if ($w) { + if (strpos($w,'%') && !$this->ignore_table_percents ) { $c['wpercent'] = $w + 0; } // makes 80% -> 80 + else if (!strpos($w,'%') && !$this->ignore_table_widths ) { $c['w'] = $this->ConvertSize($w,$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + } + + if (isset($properties['HEIGHT']) && !strpos($properties['HEIGHT'],'%')) { $c['h'] = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + else if (isset($attr['HEIGHT']) && !strpos($attr['HEIGHT'],'%')) $c['h'] = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + + if (isset($properties['COLOR'])) { + $cor = $this->ConvertColor($properties['COLOR']); + if ($cor) { + $this->colorarray = $cor; + $this->SetTColor($cor); + } + } + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],'',0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + if ($mmsize) { + $this->SetFontSize($mmsize*(_MPDFK),false); + } + } + $c['dfs'] = $this->FontSize; // Default Font size + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->SetStyle('B',true); } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->SetStyle('I',true); } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->SetStyle('S',true); } + } + if (isset($properties['TEXT-DECORATION'])) { + if (strtoupper($properties['TEXT-DECORATION']) == 'LINE-THROUGH') { $this->strike = true; } + else if (strtoupper($properties['TEXT-DECORATION']) == 'UNDERLINE') { $this->SetStyle('U',true); } + } + if (isset($properties['TEXT-SHADOW'])) { + $ts = $this->cssmgr->setCSStextshadow($properties['TEXT-SHADOW']); + if ($ts) { $this->textshadow = $ts; } + } + if (isset($properties['TEXT-TRANSFORM'])) { + if (strtoupper($properties['TEXT-TRANSFORM']) == 'CAPITALIZE') { $this->capitalize = true; } + else if (strtoupper($properties['TEXT-TRANSFORM']) == 'UPPERCASE') { $this->toupper = true; } + else if (strtoupper($properties['TEXT-TRANSFORM']) == 'LOWERCASE') { $this->tolower = true; } + } + if (isset($properties['WHITE-SPACE'])) { + if (strtoupper($properties['WHITE-SPACE']) == 'NOWRAP') { $c['nowrap']= 1; } + } + $properties = array(); + + if (isset($attr['TEXT-ROTATE'])) { + $c['R'] = $attr['TEXT-ROTATE']; + } + if (isset($attr['NOWRAP']) && $attr['NOWRAP']) $c['nowrap']= 1; + + $this->cell[$this->row][$this->col] = $c; + unset($c); + $this->cell[$this->row][$this->col]['s'] = 0 ; + + $cs = $rs = 1; + if (isset($attr['COLSPAN']) && $attr['COLSPAN']>1) $cs = $this->cell[$this->row][$this->col]['colspan'] = $attr['COLSPAN']; + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] < $this->col+$cs) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] = $this->col+$cs; + } // following code moved outside if... + for($l=$this->col; $l < $this->col+$cs ;$l++) { + if ($l-$this->col) $this->cell[$this->row][$l] = 0; + } + if (isset($attr['ROWSPAN']) && $attr['ROWSPAN']>1) $rs = $this->cell[$this->row][$this->col]['rowspan'] = $attr['ROWSPAN']; + for ($k=$this->row ; $k < $this->row+$rs ;$k++) { + for($l=$this->col; $l < $this->col+$cs ;$l++) { + if ($k-$this->row || $l-$this->col) $this->cell[$k][$l] = 0; + } + } + unset($table); + break; +/*-- END TABLES --*/ + + +/*-- LISTS --*/ + // *********** LISTS ******************** + case 'OL': + case 'UL': + $this->listjustfinished = false; + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + + $this->linebreakjustfinished=false; + $this->lastoptionaltag = ''; // Save current HTML specified optional endtag + $this->cssmgr->listCSSlvl++; + if((!$this->tableLevel) && ($this->listlvl == 0)) { + $blockstate = 0; + //if ($this->lastblocklevelchange == 1) { $blockstate = -1; } // Top margins/padding only + //else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + // called from block after new div e.g.
    ...
      ... Outputs block top margin/border and padding + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange == 1 && !$this->tableLevel && !$this->kwt) { + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,1,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + } + else if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer,$blockstate); } + $this->textbuffer=array(); + $this->lastblocklevelchange = -1; + } + // ol and ul types are mixed here + if ($this->listlvl == 0) { + $this->list_indent = array(); + $this->list_align = array(); + $this->list_lineheight = array(); + $this->InlineProperties['LIST'] = array(); + $this->InlineProperties['LISTITEM'] = array(); + } + +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->list_indent[$this->listlvl] = 0; // mm default indent for each level + if ($tag == 'OL') $this->listtype = '1'; + else if ($tag == 'UL') $this->listtype = 'disc'; + if ($this->listlvl > 0) { + $this->listlist[$this->listlvl]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + } + $this->listlvl++; + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + $this->listlist[$this->listlvl] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + break; + } +/*-- END TABLES --*/ + + + if (($this->PDFA || $this->PDFX) && $tag == 'UL') { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "List bullets cannot use core font Zapfdingbats in PDFA1-b or PDFX/1-a. (Substitute characters from current font used if available, otherwise substitutes hyphen '-')"; } + } + + if ($this->cssmgr->listCSSlvl==1) { + $properties = $this->cssmgr->MergeCSS('TOPLIST',$tag,$attr); + } + else { + $properties = $this->cssmgr->MergeCSS('LIST',$tag,$attr); + } + if (!empty($properties)) $this->setCSS($properties,'LIST'); + // List-type + + $this->listtype = ''; + if (isset($properties['LIST-STYLE-TYPE'])) { + $this->listtype = $this->_getListStyle($properties['LIST-STYLE-TYPE']); + } + else if (isset($properties['LIST-STYLE'])) { + $this->listtype = $this->_getListStyle($properties['LIST-STYLE']); + } + else if (isset($attr['TYPE']) && $attr['TYPE']) { $this->listtype = $attr['TYPE']; } + if (!$this->listtype) { + if ($tag == 'OL') $this->listtype = '1'; + if ($tag == 'UL') { + if ($this->listlvl % 3 == 0) $this->listtype = 'disc'; + elseif ($this->listlvl % 3 == 1) $this->listtype = 'circle'; + else $this->listtype = 'square'; + } + } + if ($this->listlvl == 0) { + $this->inherit_lineheight = 0; + $this->listlvl++; // first depth level + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + $this->listDir = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : null); + $occur = $this->listoccur[$this->listlvl] = 1; + $this->listlist[$this->listlvl][1] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + } + else { + if (!empty($this->textbuffer)) + { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + $this->listnum++; + } + // Save current lineheight to inherit + $this->textbuffer = array(); + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + $this->listlvl++; + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + + + if (!isset($this->listoccur[$this->listlvl]) || $this->listoccur[$this->listlvl] == 0) $this->listoccur[$this->listlvl] = 1; + else $this->listoccur[$this->listlvl]++; + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + } + + + // TOP LEVEL ONLY + if ($this->listlvl == 1) { + if (isset($properties['MARGIN-TOP'])) { + if ($lastbottommargin) { + $tmp = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($tmp > $lastbottommargin) { $properties['MARGIN-TOP'] -= $lastbottommargin; } + else { $properties['MARGIN-TOP'] = 0; } + } + $this->DivLn($this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false),$this->blklvl,true,1); // collapsible + } + if (isset($properties['MARGIN-BOTTOM'])) { + $this->list_margin_bottom = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($this->blk[$this->blklvl]['line_height'])) { + $this->list_lineheight[$this->listlvl][$occur] = $this->blk[$this->blklvl]['line_height']; + } + + if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { $this->listDir = strtolower($properties['DIRECTION']); } + else if (isset($attr['DIR']) && $attr['DIR']) { $this->listDir = strtolower($attr['DIR']); } + + } + $this->list_indent[$this->listlvl][$occur] = 5; // mm default indent for each level + if (isset($properties['TEXT-INDENT'])) { $this->list_indent[$this->listlvl][$occur] = $this->ConvertSize($properties['TEXT-INDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['TEXT-ALIGN'])) { + $this->list_align[$this->listlvl][$occur] = $align[strtolower($properties['TEXT-ALIGN'])]; + } + + + if (isset($properties['LINE-HEIGHT'])) { + $this->list_lineheight[$this->listlvl][$occur] = $this->fixLineheight($properties['LINE-HEIGHT']); + } + else if ($this->listlvl>1 && isset($this->list_lineheight[($this->listlvl - 1)][1])) { + $this->list_lineheight[$this->listlvl][$occur] = end($this->list_lineheight[($this->listlvl - 1)]); + } + if (!isset($this->list_lineheight[$this->listlvl][$occur]) || !$this->list_lineheight[$this->listlvl][$occur]) { + $this->list_lineheight[$this->listlvl][$occur] = $this->normalLineheight; + } + + $this->InlineProperties['LIST'][$this->listlvl][$occur] = $this->saveInlineProperties(); + $properties = array(); + break; + + + + case 'LI': + // Start Block + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->blockjustfinished=false; + + // If already something in the Cell + if ((isset($this->cell[$this->row][$this->col]['maxs']) && $this->cell[$this->row][$this->col]['maxs'] > 0 ) || $this->cell[$this->row][$this->col]['s'] > 0 ) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ; + } + if ($this->listlvl == 0) { //in case of malformed HTML code. Example:(...)

    1. Content
    2. Paragraph1

      (...) + $this->listlvl++; // first depth level + $this->listnum = 0; // reset + $this->listlist[$this->listlvl] = array('TYPE'=>'disc','MAXNUM'=>$this->listnum); + } + + $this->listnum++; + switch($this->listlist[$this->listlvl]['TYPE']) { + case 'A': + $blt = $this->dec2alpha($this->listnum,true).$this->list_number_suffix; + break; + case 'a': + $blt = $this->dec2alpha($this->listnum,false).$this->list_number_suffix; + break; + case 'I': + $blt = $this->dec2roman($this->listnum,true).$this->list_number_suffix; + break; + case 'i': + $blt = $this->dec2roman($this->listnum,false).$this->list_number_suffix; + break; + case '1': + $blt = $this->listnum.$this->list_number_suffix; + break; + default: + if ($this->listlvl % 3 == 1 && $this->_charDefined($this->CurrentFont['cw'],8226)) { $blt = "\xe2\x80\xa2"; } // • + else if ($this->listlvl % 3 == 2 && $this->_charDefined($this->CurrentFont['cw'],9900)) { $blt = "\xe2\x9a\xac"; } // ⚬ + else if ($this->listlvl % 3 == 0 && $this->_charDefined($this->CurrentFont['cw'],9642)) { $blt = "\xe2\x96\xaa"; } // ▪ + else { $blt = '-'; } + break; + } + + // change to   spaces + if ($this->usingCoreFont) { + $ls = str_repeat(chr(160).chr(160),($this->listlvl-1)*2) . $blt . ' '; + } + else { + $ls = str_repeat("\xc2\xa0\xc2\xa0",($this->listlvl-1)*2) . $blt . ' '; + } + + $this->_saveCellTextBuffer($ls, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($ls); + break; + } +/*-- END TABLES --*/ + //Observation: is ignored + if ($this->listlvl == 0) { //in case of malformed HTML code. Example:(...)

    3. Content
    4. Paragraph1

      (...) + //First of all, skip a line + $this->listlvl++; // first depth level + $this->listnum = 0; // reset + $this->listoccur[$this->listlvl] = 1; + $this->listlist[$this->listlvl][1] = array('TYPE'=>'disc','MAXNUM'=>$this->listnum); + } + if ($this->listnum == 0) { + $this->listnum++; + $this->textbuffer = array(); + } + else { + if (!empty($this->textbuffer)) { + if (!$this->listjustfinished) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + $this->listnum++; + } + else { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype, true); + } + } + $this->textbuffer = array(); + } + $this->listjustfinished = false; + + $this->cssmgr->listCSSlvl++; + $properties = $this->cssmgr->MergeCSS('LIST',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'LIST'); + $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listoccur[$this->listlvl]][$this->listnum] = $this->saveInlineProperties(); + + // List-type + if (isset($properties['LIST-STYLE-TYPE'])) { + $this->listitemtype = $this->_getListStyle($properties['LIST-STYLE-TYPE']); + } + else if (isset($properties['LIST-STYLE'])) { + $this->listitemtype = $this->_getListStyle($properties['LIST-STYLE']); + } + else if (isset($attr['TYPE']) && $attr['TYPE']) { $this->listitemtype = $attr['TYPE']; } + else $this->listitemtype = ''; + break; +/*-- END LISTS --*/ + + }//end of switch +} + +/*-- LISTS --*/ + +function _getListStyle($ls) { + if (stristr($ls,'decimal')) { return '1'; } +/* CSS3 list-styles numeric (selected) + I added tamil +arabic-indic | bengali | devanagari | gujarati | gurmukhi | kannada | malayalam | oriya | persian | telugu | thai | urdu +*/ + else if (preg_match('/(disc|circle|square|arabic-indic|bengali|devanagari|gujarati|gurmukhi|kannada|malayalam|oriya|persian|tamil|telugu|thai|urdu)/i',$ls,$m)) { + return strtolower(trim($m[1])); + } + else if (stristr($ls,'lower-roman')) { return 'i'; } + else if (stristr($ls,'upper-roman')) { return 'I'; } + else if (stristr($ls,'lower-latin')|| stristr($ls,'lower-alpha')) { return 'a'; } + else if (stristr($ls,'upper-latin') || stristr($ls,'upper-alpha')) { return 'A'; } + else if (stristr($ls,'none')) { return 'none'; } + else if (preg_match('/U\+([a-fA-F0-9]+)/i',$ls)) { return $ls; } + else { return ''; } +} +/*-- END LISTS --*/ + + + +function CloseTag($tag) +{ + $this->ignorefollowingspaces = false; //Eliminate exceeding left-side spaces + //Closing tag + if($tag=='OPTION') { $this->selectoption['ACTIVE'] = false; $this->lastoptionaltag = ''; } + + if($tag=='TTS' or $tag=='TTA' or $tag=='TTZ') { + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + $ltag = strtolower($tag); + $this->$ltag = false; + } + + + if($tag=='FONT' || $tag=='SPAN' || $tag=='CODE' || $tag=='KBD' || $tag=='SAMP' || $tag=='TT' || $tag=='VAR' + || $tag=='INS' || $tag=='STRONG' || $tag=='CITE' || $tag=='SUB' || $tag=='SUP' || $tag=='S' || $tag=='STRIKE' || $tag=='DEL' + || $tag=='Q' || $tag=='EM' || $tag=='B' || $tag=='I' || $tag=='U' | $tag=='SMALL' || $tag=='BIG' || $tag=='ACRONYM' + || $tag=='MARK' || $tag=='TIME' || $tag=='PROGRESS' || $tag=='METER' + ) { // mPDF 5.5.09 + + if ($tag == 'SPAN') { + if (isset($this->InlineProperties['SPAN'][$this->spanlvl]) && $this->InlineProperties['SPAN'][$this->spanlvl]) { $this->restoreInlineProperties($this->InlineProperties['SPAN'][$this->spanlvl]); } + unset($this->InlineProperties['SPAN'][$this->spanlvl]); + if (isset($this->InlineAnnots['SPAN'][$this->spanlvl]) && $this->InlineAnnots['SPAN'][$this->spanlvl]) { $annot = $this->InlineAnnots['SPAN'][$this->spanlvl]; } // *ANNOTATIONS* + unset($this->InlineAnnots['SPAN'][$this->spanlvl]); // *ANNOTATIONS* + $this->spanlvl--; + } + else { + if (isset($this->InlineProperties[$tag]) && $this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + if (isset($this->InlineAnnots[$tag]) && $this->InlineAnnots[$tag]) { $annot = $this->InlineAnnots[$tag]; } // *ANNOTATIONS* + unset($this->InlineAnnots[$tag]); // *ANNOTATIONS* + } + +/*-- ANNOTATIONS --*/ + if (isset($annot)) { + if($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['textbuffer'][] = array($annot); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($annot); + } // *TABLES* + } +/*-- END ANNOTATIONS --*/ + } + + if($tag=='METER' || $tag=='PROGRESS') { + $this->inMeter = false; // mPDF 5.5.09 + } + + + if($tag=='A') { + $this->HREF=''; + if (isset($this->InlineProperties['A'])) { $this->restoreInlineProperties($this->InlineProperties['A']); } + unset($this->InlineProperties['A']); + } + + if($tag=='LEGEND') { // mPDF 5.4.18 + if (count($this->textbuffer) && !$this->tableLevel) { + $leg = $this->textbuffer[(count($this->textbuffer)-1)]; + unset($this->textbuffer[(count($this->textbuffer)-1)]); + $this->textbuffer = array_values($this->textbuffer); + $this->blk[$this->blklvl]['border_legend'] = $leg; + $this->blk[$this->blklvl]['margin_top'] += ($leg[11]/2)/_MPDFK; + $this->blk[$this->blklvl]['padding_top'] += ($leg[11]/2)/_MPDFK; + } + if (isset($this->InlineProperties['LEGEND'])) { $this->restoreInlineProperties($this->InlineProperties['LEGEND']); } + unset($this->InlineProperties['LEGEND']); + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + } + + + +/*-- FORMS --*/ + // *********** FORM ELEMENTS ******************** + + if($tag=='TEXTAREA') { + $this->specialcontent = ''; + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + } + + + if($tag=='SELECT') { + $this->lastoptionaltag = ''; + $texto = ''; + if (isset($this->selectoption['SELECTED'])) { $texto = $this->selectoption['SELECTED']; } + + if ($this->useActiveForms) { $w = $this->selectoption['MAXWIDTH']; } + else { $w = $this->GetStringWidth($texto); } + if ($w == 0) { $w = 5; } + $objattr['type'] = 'select'; + $objattr['text'] = $texto; + if (isset($this->selectoption['NAME'])) { $objattr['fieldname'] = $this->selectoption['NAME']; } + if (isset($this->selectoption['READONLY'])) { $objattr['readonly'] = true; } + if (isset($this->selectoption['REQUIRED'])) { $objattr['required'] = true; } + if (isset($this->selectoption['SPELLCHECK'])) { $objattr['spellcheck'] = true; } + if (isset($this->selectoption['EDITABLE'])) { $objattr['editable'] = true; } + if (isset($this->selectoption['ONCHANGE'])) { $objattr['onChange'] = $this->selectoption['ONCHANGE']; } + if (isset($this->selectoption['ITEMS'])) { $objattr['items'] = $this->selectoption['ITEMS']; } + if (isset($this->selectoption['MULTIPLE'])) { $objattr['multiple'] = $this->selectoption['MULTIPLE']; } + if (isset($this->selectoption['DISABLED'])) { $objattr['disabled'] = $this->selectoption['DISABLED']; } + if (isset($this->selectoption['TITLE'])) { $objattr['title'] = $this->selectoption['TITLE']; } + if (isset($this->selectoption['COLOR'])) { $objattr['color'] = $this->selectoption['COLOR']; } + if (isset($this->selectoption['SIZE'])) { $objattr['size'] = $this->selectoption['SIZE']; } + if (isset($objattr['size']) && $objattr['size']>1) { $rows=$objattr['size']; } else { $rows = 1; } + + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + + $objattr['width'] = $w + ($this->form->form_element_spacing['select']['outer']['h']*2)+($this->form->form_element_spacing['select']['inner']['h']*2) + ($this->FontSize*1.4); + $objattr['height'] = ($this->FontSize*$rows) + ($this->form->form_element_spacing['select']['outer']['v']*2)+($this->form->form_element_spacing['select']['inner']['v']*2); + $e = "\xbb\xa4\xactype=select,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + + // Output it to buffers + if ($this->tableLevel) { // *TABLES* + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + $this->selectoption = array(); + $this->specialcontent = ''; + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + } +/*-- END FORMS --*/ + + + // *********** BLOCKS ******************** + // mPDF 5.4.18 + if($tag=='P' || $tag=='DIV' || $tag=='H1' || $tag=='H2' || $tag=='H3' || $tag=='H4' || $tag=='H5' || $tag=='H6' || $tag=='PRE' + || $tag=='FORM' || $tag=='ADDRESS' || $tag=='BLOCKQUOTE' || $tag=='CENTER' || $tag=='DT' || $tag=='DD' || $tag=='DL' + || $tag=='CAPTION' || $tag=='FIELDSET' + || $tag=='ARTICLE' || $tag=='ASIDE' || $tag=='FIGURE' || $tag=='FIGCAPTION' || $tag=='FOOTER' || $tag=='HEADER' || $tag=='HGROUP' + || $tag=='NAV' || $tag=='SECTION' || $tag=='DETAILS' || $tag=='SUMMARY' + ) { // mPDF 5.5.09 // mPDF 5.5.22 + + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + $this->blockjustfinished=true; + + $this->lastblockbottommargin = $this->blk[$this->blklvl]['margin_bottom']; +/*-- LISTS --*/ + if ($this->listlvl>0) { return; } +/*-- END LISTS --*/ + + // mPDF 5.6.34 + if (preg_match('/^H\d/',$tag) && !$this->tableLevel && !$this->writingToC) { // mPDF 5.6.38 + if (isset($this->h2toc[$tag]) || isset($this->h2bookmarks[$tag])) { + $content = ''; + if (count($this->textbuffer)==1) { $content = $this->textbuffer[0][0]; } + else { + for ($i=0;$itextbuffer);$i++) { + if (substr($this->textbuffer[$i][0],0,3) != "\xbb\xa4\xac") { //inline object + $content .= $this->textbuffer[$i][0]; + } + } + } +/*-- TOC --*/ + if (isset($this->h2toc[$tag])) { + $objattr = array(); + $objattr['type'] = 'toc'; + $objattr['toclevel'] = $this->h2toc[$tag]; + $objattr['CONTENT'] = htmlspecialchars($content); // mPDF 5.6.37 + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + array_unshift($this->textbuffer,array($e)); + } +/*-- END TOC --*/ +/*-- BOOKMARKS --*/ + if (isset($this->h2bookmarks[$tag])) { + $objattr = array(); + $objattr['type'] = 'bookmark'; + $objattr['bklevel'] = $this->h2bookmarks[$tag]; + $objattr['CONTENT'] = $content; + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + array_unshift($this->textbuffer,array($e)); + } +/*-- END BOOKMARKS --*/ + } + } + +/*-- TABLES --*/ + if($this->tableLevel) { + if ($this->linebreakjustfinished) { $this->blockjustfinished=false; } + if (isset($this->InlineProperties['BLOCKINTABLE'])) { + if ($this->InlineProperties['BLOCKINTABLE']) { $this->restoreInlineProperties($this->InlineProperties['BLOCKINTABLE']); } + unset($this->InlineProperties['BLOCKINTABLE']); + } + if($tag=='PRE') { $this->ispre=false; } + return; + } +/*-- END TABLES --*/ + $this->lastoptionaltag = ''; + $this->divbegin=false; + + $this->linebreakjustfinished=false; + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + +/*-- CSS-FLOAT --*/ + // If float contained in a float, need to extend bottom to allow for it + $currpos = $this->page*1000 + $this->y; + if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { + $old_page = $this->page; + $new_page = intval($this->blk[$this->blklvl]['float_endpos'] /1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + $this->ResetMargins(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + } + $this->y = (($this->blk[$this->blklvl]['float_endpos'] *1000) % 1000000)/1000; // mod changes operands to integers before processing + } +/*-- END CSS-FLOAT --*/ + + + //Print content + if ($this->lastblocklevelchange == 1) { $blockstate = 3; } // Top & bottom margins/padding + else if ($this->lastblocklevelchange == -1) { $blockstate = 2; } // Bottom margins/padding only + else { $blockstate = 0; } + // called from after e.g.
    ... Outputs block margin/border and padding + if (count($this->textbuffer) && $this->textbuffer[count($this->textbuffer)-1]) { + if (substr($this->textbuffer[count($this->textbuffer)-1][0],0,3) != "\xbb\xa4\xac") { // not special content + if ($this->usingCoreFont) { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/[ ]+$/', '', $this->textbuffer[count($this->textbuffer)-1][0]); + } + else { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/[ ]+$/u', '', $this->textbuffer[count($this->textbuffer)-1][0]); } + } + } + + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange != 0) { + //$this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,2,true, $this->blk[$this->blklvl]['direction']); + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,$blockstate,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + $this->PaintDivBB('',$blockstate); + } + else { + $this->printbuffer($this->textbuffer,$blockstate); + } + + + $this->textbuffer=array(); + + if ($this->blk[$this->blklvl]['keep_block_together']) { + $this->printdivbuffer(); + } + + if ($this->kwt) { + $this->kwt_height = $this->y - $this->kwt_y0; + } + +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + if($tag=='PRE') { $this->ispre=false; } + +/*-- CSS-FLOAT --*/ + if ($this->blk[$this->blklvl]['float'] == 'R') { + // If width not set, here would need to adjust and output buffer + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + + for($i=($this->blklvl-1); $i >= 0; $i--) { + if (isset($this->blk[$i]['float_endpos'])) { $this->blk[$i]['float_endpos'] = max($this->blk[$i]['float_endpos'], ($this->page*1000 + $this->y)); } + else { $this->blk[$i]['float_endpos'] = $this->page*1000 + $this->y; } + } + + $this->floatDivs[] = array( + 'side'=>'R', + 'startpage'=>$this->blk[$this->blklvl]['startpage'] , + 'y0'=>$this->blk[$this->blklvl]['float_start_y'] , + 'startpos'=> ($this->blk[$this->blklvl]['startpage']*1000 + $this->blk[$this->blklvl]['float_start_y']), + 'endpage'=>$this->page , + 'y1'=>$this->y , + 'endpos'=> ($this->page*1000 + $this->y), + 'w'=> $this->blk[$this->blklvl]['float_width'], + 'blklvl'=>$this->blklvl, + 'blockContext' => $this->blk[$this->blklvl-1]['blockContext'] + ); + + $this->y = $this->blk[$this->blklvl]['float_start_y'] ; + $this->page = $this->blk[$this->blklvl]['startpage'] ; + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + } + if ($this->blk[$this->blklvl]['float'] == 'L') { + // If width not set, here would need to adjust and output buffer + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + + for($i=($this->blklvl-1); $i >= 0; $i--) { + if (isset($this->blk[$i]['float_endpos'])) { $this->blk[$i]['float_endpos'] = max($this->blk[$i]['float_endpos'], ($this->page*1000 + $this->y)); } + else { $this->blk[$i]['float_endpos'] = $this->page*1000 + $this->y; } + } + + $this->floatDivs[] = array( + 'side'=>'L', + 'startpage'=>$this->blk[$this->blklvl]['startpage'] , + 'y0'=>$this->blk[$this->blklvl]['float_start_y'] , + 'startpos'=> ($this->blk[$this->blklvl]['startpage']*1000 + $this->blk[$this->blklvl]['float_start_y']), + 'endpage'=>$this->page , + 'y1'=>$this->y , + 'endpos'=> ($this->page*1000 + $this->y), + 'w'=> $this->blk[$this->blklvl]['float_width'], + 'blklvl'=>$this->blklvl, + 'blockContext' => $this->blk[$this->blklvl-1]['blockContext'] + ); + + $this->y = $this->blk[$this->blklvl]['float_start_y'] ; + $this->page = $this->blk[$this->blklvl]['startpage'] ; + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + } +/*-- END CSS-FLOAT --*/ + + if (isset($this->blk[$this->blklvl]['visibility']) && $this->blk[$this->blklvl]['visibility']!='visible') { + $this->SetVisibility('visible'); + } + + if (isset($this->blk[$this->blklvl]['page_break_after'])) { $page_break_after = $this->blk[$this->blklvl]['page_break_after']; } + else { $page_break_after = ''; } + + //Reset values + $this->Reset(); + + // mPDF 5.6.01 - LAYERS + if (isset($this->blk[$this->blklvl]['z-index']) && $this->blk[$this->blklvl]['z-index'] > 0) { + $this->EndLayer(); + } + + if ($this->blklvl > 0) { // ==0 SHOULDN'T HAPPEN - NOT XHTML + if ($this->blk[$this->blklvl]['tag'] == $tag) { + unset($this->blk[$this->blklvl]); + $this->blklvl--; + } + //else { echo $tag; exit; } // debug - forces error if incorrectly nested html tags + } + + $this->lastblocklevelchange = -1 ; + // Reset Inline-type properties + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']); } + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + + if ($page_break_after) { + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + $save_cols = false; + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + if ($page_break_after == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($page_break_after == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + if (!$this->restoreBlockPagebreaks) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl++; + $currblk =& $this->blk[$this->blklvl]; + $prevblk =& $this->blk[$this->blklvl-1]; + + $this->initialiseBlock($currblk); + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + } +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks && !$this->tableLevel && !$this->listlvl) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + } + + +/*-- TABLES --*/ + + if($tag=='TH') $this->SetStyle('B',false); + + if(($tag=='TH' or $tag=='TD') && $this->tableLevel) { + $this->lastoptionaltag = 'TR'; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + if (!$this->tdbegin) { return; } + $this->tdbegin = false; + // Added for correct calculation of cell column width - otherwise misses the last line if not end

    etc. + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + if (!is_array($this->cell[$this->row][$this->col])) { $this->Error("You may have an error in your HTML code e.g. </td></td>"); } + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + + // Remove last
    if at end of cell + if (isset($this->cell[$this->row][$this->col]['textbuffer'])) { $ntb = count($this->cell[$this->row][$this->col]['textbuffer']); } + else { $ntb = 0; } + if ($ntb>1 && $this->cell[$this->row][$this->col]['textbuffer'][$ntb-1][0] == "\n") { + unset($this->cell[$this->row][$this->col]['textbuffer'][$ntb-1]); + } + + if ($this->cacheTables) { + $clen = $this->_cacheCell($this->cell[$this->row][$this->col], $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache']); + $this->cell[$this->row][$this->col] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['ptr']; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['ptr'] += $clen; + } + + if ($this->tablethead) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_thead'][$this->row] = true; + if ($this->tableLevel==1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] = max($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] , ($this->row+1)); } + } + if ($this->tabletfoot) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$this->row] = true; + if ($this->tableLevel==1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['footernrows'] = max($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['footernrows'] , ($this->row+1 - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] )); } + } + $this->Reset(); + } + + if($tag=='TR' && $this->tableLevel) { + // If Border set on TR - Update right border + if (isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-left'][$this->row])) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->cell[$this->row][$this->col], $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache'], null); + } + else { $c =& $this->cell[$this->row][$this->col]; } + if ($c) { + if ($this->packTableData) { + $cell = $this->_unpackCellBorder($c['borderbin'] ); + } + else { $cell = $c; } + $cell['border_details']['R'] = $this->border_details($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-right'][$this->row]); + $this->setBorder($cell['border'], _BORDER_RIGHT, $cell['border_details']['R']['s']); + if ($this->packTableData) { + $c['borderbin'] = $this->_packCellBorder($cell); + unset($c['border']); + unset($c['border_details']); + } + else { $c = $cell; } + } + if ($this->cacheTables) { + $fh = fopen($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache'], "r+b"); + $this->_cacheUpdateBorder($c, $fh, $this->cell[$this->row][$this->col]); + fclose($fh); + } + } + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->trow_text_rotate = ''; + $this->tabletheadjustfinished = false; + } + + if($tag=='TBODY') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + } + + if($tag=='THEAD') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->tablethead = 0; + $this->tabletheadjustfinished = true; + $this->ResetStyles(); + $this->thead_font_weight = ''; + $this->thead_font_style = ''; + $this->thead_font_smCaps = ''; + + $this->thead_valign_default = ''; + $this->thead_textalign_default = ''; + } + + if($tag=='TFOOT') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->tabletfoot = 0; + $this->ResetStyles(); + $this->tfoot_font_weight = ''; + $this->tfoot_font_style = ''; + $this->tfoot_font_smCaps = ''; + + $this->tfoot_valign_default = ''; + $this->tfoot_textalign_default = ''; + } + + if($tag=='TABLE') { // TABLE-END ( + if ($this->progressBar) { $this->UpdateProgressBar(1,'','TABLE'); } // *PROGRESS-BAR* + if ($this->progressBar) { $this->UpdateProgressBar(7,0,''); } // *PROGRESS-BAR* + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = $this->cell; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['wc'] = array_pad(array(),$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'],array('miw'=>0,'maw'=>0)); + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['hr'] = array_pad(array(),$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr'],0); + + // Move table footer row to end of table + if (isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot']) && count($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'])) { + $tfrows = array(); + foreach($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'] AS $r=>$val) { + if ($val) { $tfrows[] = $r; } + } + $temp = array(); + $temptf = array(); + foreach($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] AS $k=>$row) { + if (in_array($k,$tfrows)) { + $temptf[] = $row; + } + else { + $temp[] = $row; + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'] = array(); + for($i=count($temp) ; $i<(count($temp)+count($temptf)); $i++) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$i] = true; + } + // Update nestedpos row references + if (count($this->table[($this->tableLevel+1)])) { + foreach($this->table[($this->tableLevel+1)] AS $nid=>$nested) { + $this->table[($this->tableLevel+1)][$nid]['nestedpos'][0] -= count($temptf); + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = array_merge($temp, $temptf); + + // Update other arays set on row number + // [trbackground-images] [trgradients] + $temptrbgi = array(); + $temptrbgg = array(); + $temptrbgc = array(); + $temptrbgc[-1] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][-1]; + for($k=0; $k<$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']; $k++) { + if (!in_array($k,$tfrows)) { + $temptrbgi[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$k]; + $temptrbgg[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$k]; + $temptrbgc[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$k]; + } + } + for($k=0; $k<$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']; $k++) { + if (in_array($k,$tfrows)) { + $temptrbgi[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$k]; + $temptrbgg[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$k]; + $temptrbgc[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$k]; + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'] = $temptrbgi; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'] = $temptrbgg; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'] = $temptrbgc ; + // Should Update all other arays set on row number, but cell properties have been set so not needed + // [bgcolor] [trborder-left] [trborder-right] [trborder-top] [trborder-bottom] + } + + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['direction']=='rtl') { + $this->_reverseTableDir($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]); + } + + // Fix Borders ********************************************* + $this->_fixTableBorders($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]); + + if ($this->progressBar) { $this->UpdateProgressBar(7,10,' '); } // *PROGRESS-BAR* + + if ($this->ColActive) { $this->table_rotate = 0; } // *COLUMNS* + if ($this->table_rotate <> 0) { + $this->tablebuffer = ''; + // Max width for rotated table + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 1); + $this->tbrot_maxh = $this->blk[$this->blklvl]['inner_width'] ; // Max width for rotated table + $this->tbrot_align = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['a'] ; + } + $this->shrin_k = 1; + + if ($this->shrink_tables_to_fit < 1) { $this->shrink_tables_to_fit = 1; } + if (!$this->shrink_this_table_to_fit) { $this->shrink_this_table_to_fit = $this->shrink_tables_to_fit; } + + if ($this->tableLevel>1) { + // deal with nested table + + $this->_tableColumnWidth($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]],true); + + $tmiw = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['miw']; + $tmaw = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['maw']; + $tl = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['tl']; + + // Go down to lower table level + $this->tableLevel--; + + // Reset lower level table + $this->base_table_properties = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['baseProperties']; + $this->cell = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells']; + // mPDF 5.4.10 + if (isset($this->cell['PARENTCELL'])) { + if ($this->cell['PARENTCELL']) { $this->restoreInlineProperties($this->cell['PARENTCELL']); } + unset($this->cell['PARENTCELL']); + } + $this->row = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currrow']; + $this->col = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currcol']; + $objattr = array(); + $objattr['type'] = 'nestedtable'; + $objattr['nestedcontent'] = $this->tbctr[($this->tableLevel+1)]; + $objattr['table'] = $this->tbctr[$this->tableLevel]; + $objattr['row'] = $this->row; + $objattr['col'] = $this->col; + $objattr['level'] = $this->tableLevel; + $e = "\xbb\xa4\xactype=nestedtable,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $this->_saveCellTextBuffer($e); + $this->cell[$this->row][$this->col]['s'] += $tl ; + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0;// reset + if ((isset($this->cell[$this->row][$this->col]['nestedmaw']) && $this->cell[$this->row][$this->col]['nestedmaw'] < $tmaw) || !isset($this->cell[$this->row][$this->col]['nestedmaw'])) { $this->cell[$this->row][$this->col]['nestedmaw'] = $tmaw ; } + if ((isset($this->cell[$this->row][$this->col]['nestedmiw']) && $this->cell[$this->row][$this->col]['nestedmiw'] < $tmiw) || !isset($this->cell[$this->row][$this->col]['nestedmiw'])) { $this->cell[$this->row][$this->col]['nestedmiw'] = $tmiw ; } + $this->tdbegin = true; + $this->nestedtablejustfinished = true; + $this->ignorefollowingspaces = true; + return; + } + $this->cMarginL = 0; + $this->cMarginR = 0; + $this->cMarginT = 0; + $this->cMarginB = 0; + $this->cellPaddingL = 0; + $this->cellPaddingR = 0; + $this->cellPaddingT = 0; + $this->cellPaddingB = 0; + + if (isset($this->table[1][1]['overflow']) && $this->table[1][1]['overflow']=='visible') { + if ($this->kwt || $this->table_rotate || $this->table_keep_together || $this->ColActive) { + $this->kwt = false; + $this->table_rotate = 0; + $this->table_keep_together = false; + //die("mPDF Warning: You cannot use CSS overflow:visible together with any of these functions: 'Keep-with-table', rotated tables, page-break-inside:avoid, or columns"); + } + $this->_tableColumnWidth($this->table[1][1],true); + $this->_tableWidth($this->table[1][1]); + } + else { + if (!$this->kwt_saved) { $this->kwt_height = 0; } + + list($check,$tablemiw) = $this->_tableColumnWidth($this->table[1][1],true); + $save_table = $this->table; + if ($this->cacheTables) { $this->_backupCacheFiles(); } + $reset_to_minimum_width = false; + $added_page = false; + + if ($check > 1) { + if ($check > $this->shrink_this_table_to_fit && $this->table_rotate) { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + //$check = $tablemiw/$this->tbrot_maxw; // undo any shrink + $check = 1; // undo any shrink + } + $reset_to_minimum_width = true; + } + + if ($reset_to_minimum_width) { + + $this->shrin_k = $check; + + $this->default_font_size /= $this->shrin_k; + $this->SetFontSize($this->default_font_size, false ); + + $this->shrinkTable($this->table[1][1],$this->shrin_k); + + $this->_tableColumnWidth($this->table[1][1],false); // repeat + + // Starting at $this->innermostTableLevel + // Shrink table values - and redo columnWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + $this->shrinkTable($this->table[$lvl][$nid],$this->shrin_k); + $this->_tableColumnWidth($this->table[$lvl][$nid],false); + } + } + } + + // Set table cell widths for top level table + // Use $shrin_k to resize but don't change again + $this->SetLineHeight('',$this->table_lineheight); + + // Top level table + $this->_tableWidth($this->table[1][1]); + + } + + + // Now work through any nested tables setting child table[w'] = parent cell['w'] + // Now do nested tables _tableWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + // HERE set child table width = cell width + + list($parentrow, $parentcol, $parentnid) = $this->table[$lvl][$nid]['nestedpos']; + + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol], $this->table[($lvl-1)][$parentnid]['cache'], null); + } + else + $c =& $this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol]; + + if (isset($c['colspan']) && $c['colspan']> 1) { + $parentwidth = 0; + for($cs=0;$cs<$c['colspan'] ; $cs++) { + $parentwidth += $this->table[($lvl-1)][$parentnid]['wc'][$parentcol+$cs]; + } + } + else { $parentwidth = $this->table[($lvl-1)][$parentnid]['wc'][$parentcol]; } + + + //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $br + $bl + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $br/2 + $bl/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w'] + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w']/2 + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w']/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + if (isset($this->table[$lvl][$nid]['wpercent']) && $this->table[$lvl][$nid]['wpercent'] && $lvl>1) { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + else if ($parentwidth > $this->table[$lvl][$nid]['maw']) { + $this->table[$lvl][$nid]['w'] = $this->table[$lvl][$nid]['maw']; + } + else { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + unset($c); + $this->_tableWidth($this->table[$lvl][$nid]); + } + } + + // Starting at $this->innermostTableLevel + // Cascade back up nested tables: setting heights back up the tree + for($lvl=$this->innermostTableLevel;$lvl>0;$lvl--) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + list($tableheight,$maxrowheight,$fullpage,$remainingpage, $maxfirstrowheight) = $this->_tableHeight($this->table[$lvl][$nid]); } + } + if ($this->progressBar) { $this->UpdateProgressBar(7,20,' '); } // *PROGRESS-BAR* + if ($this->table[1][1]['overflow']=='visible') { + if ($maxrowheight > $fullpage) { die("mPDF Warning: A Table row is greater than available height. You cannot use CSS overflow:visible"); } + if ($maxfirstrowheight > $remainingpage) { $this->AddPage($this->CurOrientation); } + $r = 0; $c = 0; $p = 0; $y = 0; + while (!$finished) { + list($finished,$r,$c,$p,$y,$y0) = $this->_tableWrite($this->table[1][1],true,$r,$c,$p,$y); + if (!$finished) { + $this->AddPage($this->CurOrientation); + // If printed something on first spread, set same y + if ($r==0 && $y0 > -1) { $this->y = $y0; } + } + } + } + else { + $recalculate = 1; + $forcerecalc = false; + // RESIZING ALGORITHM + if ($maxrowheight > $fullpage) { + $recalculate = $this->tbsqrt($maxrowheight / $fullpage, 1); + $forcerecalc = true; + } + else if ($this->table_rotate) { // NB $remainingpage == $fullpage == the width of the page + if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autsize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); + } + else if (!$added_page) { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + // 0.001 to force it to recalculate + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else { $recalculate = 1; } + } + else if ($this->table_keep_together || ($this->table[1][1]['nr']==1 && !$this->writingHTMLfooter)) { + if ($tableheight > $fullpage) { + if (($this->shrin_k * $this->tbsqrt($tableheight / $fullpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); + } + else if ($this->tableMinSizePriority) { + $this->table_keep_together = false; + $recalculate = 1.001; + } + else { + if ($this->y != $this->tMargin) { // mPDF 5.1 + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); + } + } + else if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autsize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); + } + else { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + $recalculate = 1.001; + } + } + else { $recalculate = 1; } + } + else { $recalculate = 1; } + + if ($recalculate > $this->shrink_this_table_to_fit && !$forcerecalc) { $recalculate = $this->shrink_this_table_to_fit; } + + $iteration = 1; + + // RECALCULATE + while($recalculate <> 1) { + $this->shrin_k1 = $recalculate ; + $this->shrin_k *= $recalculate ; + $this->default_font_size /= ($this->shrin_k1) ; + $this->SetFontSize($this->default_font_size, false ); + $this->SetLineHeight('',$this->table_lineheight); + $this->table = $save_table; + if ($this->cacheTables) { $this->_restoreCacheFiles(); } + if ($this->shrin_k <> 1) { $this->shrinkTable($this->table[1][1],$this->shrin_k); } + $this->_tableColumnWidth($this->table[1][1],false); // repeat + + // Starting at $this->innermostTableLevel + // Shrink table values - and redo columnWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + if ($this->shrin_k <> 1) { $this->shrinkTable($this->table[$lvl][$nid],$this->shrin_k); } + $this->_tableColumnWidth($this->table[$lvl][$nid],false); + } + } + // Set table cell widths for top level table + + // Top level table + $this->_tableWidth($this->table[1][1]); + + // Now work through any nested tables setting child table[w'] = parent cell['w'] + // Now do nested tables _tableWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + // HERE set child table width = cell width + + list($parentrow, $parentcol, $parentnid) = $this->table[$lvl][$nid]['nestedpos']; + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol], $this->table[($lvl-1)][$parentnid]['cache'], null); + } + else + $c =& $this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol]; + + if (isset($c['colspan']) && $c['colspan']> 1) { + $parentwidth = 0; + for($cs=0;$cs<$c['colspan'] ; $cs++) { + $parentwidth += $this->table[($lvl-1)][$parentnid]['wc'][$parentcol+$cs]; + } + } + else { $parentwidth = $this->table[($lvl-1)][$parentnid]['wc'][$parentcol]; } + + //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $br + $bl + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $br/2 + $bl/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w'] + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= ($this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w']) /2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + if (isset($this->table[$lvl][$nid]['wpercent']) && $this->table[$lvl][$nid]['wpercent'] && $lvl>1) { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + else if ($parentwidth > $this->table[$lvl][$nid]['maw']) { + $this->table[$lvl][$nid]['w'] = $this->table[$lvl][$nid]['maw'] ; + } + else { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + unset($c); + $this->_tableWidth($this->table[$lvl][$nid]); + } + } + + // Starting at $this->innermostTableLevel + // Cascade back up nested tables: setting heights back up the tree + for($lvl=$this->innermostTableLevel;$lvl>0;$lvl--) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + list($tableheight,$maxrowheight,$fullpage,$remainingpage, $maxfirstrowheight) = $this->_tableHeight($this->table[$lvl][$nid]); } + } + + // RESIZING ALGORITHM + + if ($maxrowheight > $fullpage) { $recalculate = $this->tbsqrt($maxrowheight / $fullpage, $iteration); $iteration++; } + else if ($this->table_rotate && $tableheight > $remainingpage && !$added_page) { + // If can fit on remainder of page whilst respecting autosize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); $iteration++; + } + else { + if (!$added_page) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + // 0.001 to force it to recalculate + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else if ($this->table_keep_together || ($this->table[1][1]['nr']==1 && !$this->writingHTMLfooter)) { + if ($tableheight > $fullpage) { + if (($this->shrin_k * $this->tbsqrt($tableheight / $fullpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + } + else if ($this->tableMinSizePriority) { + $this->table_keep_together = false; + $recalculate = (1 / $this->shrin_k) + 0.001; + } + else { + if (!$added_page && $this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + } + } + else if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autosize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); $iteration++; + } + else { + if (!$added_page) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + + //$recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else { $recalculate = 1; } + } + else { $recalculate = 1; } + } + + + if ($maxfirstrowheight > $remainingpage && !$added_page && !$this->table_rotate && !$this->ColActive && !$this->table_keep_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + + // keep-with-table: if page has advanced, print out buffer now, else done in fn. _Tablewrite() + if ($this->kwt_saved && $this->kwt_moved) { + $this->printkwtbuffer(); + $this->kwt_moved = false; + $this->kwt_saved = false; + } + + if ($this->progressBar) { $this->UpdateProgressBar(7,30,' '); } // *PROGRESS-BAR* + // Recursively writes all tables starting at top level + $this->_tableWrite($this->table[1][1]); + + if ($this->table_rotate && $this->tablebuffer) { + $this->PageBreakTrigger=$this->h-$this->bMargin; + $save_tr = $this->table_rotate; + $save_y = $this->y; + $this->table_rotate = 0; + $this->y = $this->tbrot_y0; + $h = $this->tbrot_w; + $this->DivLn($h,$this->blklvl,true); + + $this->table_rotate = $save_tr; + $this->y = $save_y; + + $this->printtablebuffer(); + } + $this->table_rotate = 0; + } + + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + + $this->maxPosR = max($this->maxPosR , ($this->x + $this->table[1][1]['w'])); + + $this->blockjustfinished=true; + $this->lastblockbottommargin = $this->table[1][1]['margin']['B']; + //Reset values + + if (isset($this->table[1][1]['page_break_after'])) { $page_break_after = $this->table[1][1]['page_break_after']; } + else { $page_break_after = ''; } + + // Keep-with-table + $this->kwt = false; + $this->kwt_y0 = 0; + $this->kwt_x0 = 0; + $this->kwt_height = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + + $this->shrin_k = 1; + $this->shrink_this_table_to_fit = 0; + + unset($this->table); + $this->table=array(); //array + $this->tableLevel=0; + $this->tbctr=array(); + $this->innermostTableLevel=0; + $this->cssmgr->tbCSSlvl = 0; + $this->cssmgr->tablecascadeCSS = array(); + + unset($this->cell); + $this->cell=array(); //array + + $this->col=-1; //int + $this->row=-1; //int + $this->Reset(); + + $this->cellPaddingL = 0; + $this->cellPaddingT = 0; + $this->cellPaddingR = 0; + $this->cellPaddingB = 0; + $this->cMarginL = 0; + $this->cMarginT = 0; + $this->cMarginR = 0; + $this->cMarginB = 0; + $this->default_font_size = $this->original_default_font_size; + $this->default_font = $this->original_default_font; + $this->SetFontSize($this->default_font_size, false); + $this->SetFont($this->default_font,'',0,false); + $this->SetLineHeight(); + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']);} + if ($this->progressBar) { $this->UpdateProgressBar(7,100,' '); } // *PROGRESS-BAR* + + if ($page_break_after) { + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + $save_cols = false; + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + if ($page_break_after == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($page_break_after == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + if (!$this->restoreBlockPagebreaks) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + } + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + } +/*-- END TABLES --*/ + +/*-- LISTS --*/ + // *********** LISTS ******************** + + if($tag=='LI') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->listcascadeCSS[$this->cssmgr->listCSSlvl]); + $this->cssmgr->listCSSlvl--; + if (isset($this->listoccur[$this->listlvl]) && isset($this->InlineProperties['LIST'][$this->listlvl][$this->listoccur[$this->listlvl]])) { $this->restoreInlineProperties($this->InlineProperties['LIST'][$this->listlvl][$this->listoccur[$this->listlvl]]); } + } + + + if(($tag=='UL') or ($tag=='OL')) { + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + unset($this->cssmgr->listcascadeCSS[$this->cssmgr->listCSSlvl]); + $this->cssmgr->listCSSlvl--; + + $this->lastoptionaltag = ''; +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->listlist[$this->listlvl]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + unset($this->listlist[$this->listlvl]); + $this->listlvl--; + if (isset($this->listlist[$this->listlvl]['MAXNUM'])) { $this->listnum = $this->listlist[$this->listlvl]['MAXNUM']; } // restore previous levels + if ($this->listlvl == 0) { $this->listjustfinished = true; } + return; + } +/*-- END TABLES --*/ + + if ($this->listlvl > 1) { // returning one level + $this->listjustfinished=true; + if (!empty($this->textbuffer)) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + } + else { + $this->listnum--; + } + + $this->textbuffer = array(); + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + $this->listlvl--; + $occur = $this->listoccur[$this->listlvl]; + $this->listnum = $this->listlist[$this->listlvl][$occur]['MAXNUM']; // recover previous level's number + $this->listtype = $this->listlist[$this->listlvl][$occur]['TYPE']; // recover previous level's type + if ($this->InlineProperties['LIST'][$this->listlvl][$occur]) { $this->restoreInlineProperties($this->InlineProperties['LIST'][$this->listlvl][$occur]); } + + } + else { // We are closing the last OL/UL tag + if (!empty($this->textbuffer)) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + } + else { + $this->listnum--; + } + + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; + $this->textbuffer = array(); + $this->listlvl--; + + $this->printlistbuffer(); + unset($this->InlineProperties['LIST']); + // SPACING AFTER LIST (Top level only) + $this->Ln(0); + if ($this->list_margin_bottom) { + $this->DivLn($this->list_margin_bottom,$this->blklvl,true,1); // collapsible + } + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']);} + $this->listjustfinished = true; + $this->cssmgr->listCSSlvl = 0; + $this->cssmgr->listcascadeCSS = array(); + $this->blockjustfinished=true; + $this->lastblockbottommargin = $this->list_margin_bottom; + } + } +/*-- END LISTS --*/ + + +} + + +/*-- TABLES --*/ +// This function determines the shrink factor when resizing tables +// val is the table_height / page_height_available +// returns a scaling factor used as $shrin_k to resize the table +// Overcompensating will be quicker but may unnecessarily shrink table too much +// Undercompensating means it will reiterate more times (taking more processing time) +function tbsqrt($val, $iteration=3) { + $k = 4; // Alters number of iterations until it returns $val itself - Must be > 2 + // Probably best guess and most accurate + if ($iteration==1) return sqrt($val); + // Faster than using sqrt (because it won't undercompensate), and gives reasonable results + //return 1+(($val-1)/2); + $x = 2-(($iteration-2)/($k-2)); + if ($x == 0) { $ret = $val+0.00001; } + else if ($x < 0) { $ret = 1 + ( pow(2, ($iteration-2-$k))/1000 ); } + else { $ret = 1+(($val-1)/$x); } + return $ret; +} +/*-- END TABLES --*/ + + +/*-- LISTS --*/ +function printlistbuffer() { + //Save x coordinate + $x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + $this->cMarginL = 0; + $this->cMarginR = 0; + $currIndentLvl = -1; + $lastIndent = array(); + $bak_page = $this->page; + $indent = 0; + foreach($this->listitem as $item) + { + // COLS + $oldcolumn = $this->CurrCol; + + $this->bulletarray = array(); + //Get list's buffered data + $this->listlvl = $lvl = $item[0]; + $num = $item[1]; + $this->textbuffer = $item[2]; + $occur = $item[3]; + if ($item[4]) { $type = $item[4]; } // listitemtype + else { $type = $this->listlist[$lvl][$occur]['TYPE']; } + $maxnum = $this->listlist[$lvl][$occur]['MAXNUM']; + $this->restoreInlineProperties($this->InlineProperties['LIST'][$lvl][$occur]); + $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); // force to write + $clh = $this->FontSize; + + $this->SetLineHeight($this->FontSizePt,$this->list_lineheight[$lvl][$occur]); + $this->listOcc = $occur; + $this->listnum = $num; + + if (isset($this->list_align[$this->listlvl][$occur])) { $this->divalign = $this->list_align[$this->listlvl][$occur]; } + else { + if (isset($this->blk[$this->blklvl]['direction']) && $this->blk[$this->blklvl]['direction']=='rtl') { $this->divalign = 'R'; } + else { $this->divalign = 'L'; } + } + + // Set the bullet fontsize + $bullfs = $this->InlineProperties['LISTITEM'][$lvl][$occur][$num]['size']; + + $space_width = $this->GetCharWidth(' ',false) * 1.5; + + //Set default width & height values + $this->divwidth = $this->blk[$this->blklvl]['inner_width']; + $this->divheight = $this->lineheight; + $typefont = $this->FontFamily; + if (preg_match('/U\+([a-fA-F0-9]+)/i',$type,$m)) { + if ($this->_charDefined($this->CurrentFont['cw'],hexdec($m[1]))) { $list_item_marker = codeHex2utf($m[1]); } + else { $list_item_marker = '-'; } + $blt_width = $this->GetStringWidth($list_item_marker); + $typefont = ''; + if (preg_match('/rgb\(.*?\)/',$type,$m)) { + $list_item_color = $this->ConvertColor($m[0]); + } + } + else { + $list_item_color = false; + + switch($type) //Format type + { + case '1': + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $num; } + else { $list_item_marker = $num . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('5',strlen($maxnum)).$this->list_number_suffix); + break; + case 'none': + $list_item_marker = ''; + $blt_width = 0; + break; + case 'A': + $anum = $this->dec2alpha($num,true); + $maxnum = $this->dec2alpha($maxnum,true); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('W',strlen($maxnum)).$this->list_number_suffix); + break; + case 'a': + $anum = $this->dec2alpha($num,false); + $maxnum = $this->dec2alpha($maxnum,false); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('m',strlen($maxnum)).$this->list_number_suffix); + break; + case 'I': + $anum = $this->dec2roman($num,true); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + + if ($maxnum>87) { $bbit = 87; } + else if ($maxnum>86) { $bbit = 86; } + else if ($maxnum>37) { $bbit = 38; } + else if ($maxnum>36) { $bbit = 37; } + else if ($maxnum>27) { $bbit = 28; } + else if ($maxnum>26) { $bbit = 27; } + else if ($maxnum>17) { $bbit = 18; } + else if ($maxnum>16) { $bbit = 17; } + else if ($maxnum>7) { $bbit = 8; } + else if ($maxnum>6) { $bbit = 7; } + else if ($maxnum>3) { $bbit = 4; } + else { $bbit = $maxnum; } + $maxlnum = $this->dec2roman($bbit,true); + $blt_width = $this->GetStringWidth($maxlnum.$this->list_number_suffix); + break; + case 'i': + $anum = $this->dec2roman($num,false); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + + if ($maxnum>87) { $bbit = 87; } + else if ($maxnum>86) { $bbit = 86; } + else if ($maxnum>37) { $bbit = 38; } + else if ($maxnum>36) { $bbit = 37; } + else if ($maxnum>27) { $bbit = 28; } + else if ($maxnum>26) { $bbit = 27; } + else if ($maxnum>17) { $bbit = 18; } + else if ($maxnum>16) { $bbit = 17; } + else if ($maxnum>7) { $bbit = 8; } + else if ($maxnum>6) { $bbit = 7; } + else if ($maxnum>3) { $bbit = 4; } + else { $bbit = $maxnum; } + $maxlnum = $this->dec2roman($bbit,false); + + $blt_width = $this->GetStringWidth($maxlnum.$this->list_number_suffix); + break; + case 'disc': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],8226)) { $list_item_marker = "\xe2\x80\xa2"; } // • + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(108); // bullet disc in Zapfdingbats 'l' + $typefont = 'czapfdingbats'; + $blt_width = (0.791 * $this->FontSize/2.5); + break; + case 'circle': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],9900)) { $list_item_marker = "\xe2\x9a\xac"; } // ⚬ + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(109); // circle in Zapfdingbats 'm' + $typefont = 'czapfdingbats'; + $blt_width = (0.873 * $this->FontSize/2.5); + break; + case 'square': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],9642)) { $list_item_marker = "\xe2\x96\xaa"; } // ▪ + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(110); //black square in Zapfdingbats font 'n' + $typefont = 'czapfdingbats'; + $blt_width = (0.761 * $this->FontSize/2.5); + break; + +/* CSS3 list-styles numeric + I added tamil +arabic-indic | bengali | cambodian | devanagari | gujarati | gurmukhi | kannada | khmer | lao | malayalam | mongolian | myanmar | oriya | persian | telugu | tibetan | thai | urdu +*/ + case 'arabic-indic': + $cp = 0x0660; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $this->list_number_suffix . $rnum; // RTL + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'persian': + case 'urdu': + $cp = 0x06F0; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $this->list_number_suffix . $rnum; // RTL + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'bengali': + $cp = 0x09E6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'devanagari': + $cp = 0x0966; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'gujarati': + $cp = 0x0AE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'gurmukhi': + $cp = 0x0A66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'kannada': + $cp = 0x0CE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'malayalam': + $cp = 0x0D66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(6, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'oriya': + $cp = 0x0B66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'telugu': + $cp = 0x0C66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'tamil': + $cp = 0x0BE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(9, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'thai': + $cp = 0x0E50; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(5, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + default: + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $num; } + else { $list_item_marker = $num . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('5',strlen($maxnum)).$this->list_number_suffix); + break; + } + } + + if (isset($item[5]) && $item[5]) { $list_item_marker = ''; } + + if ($currIndentLvl < $lvl) { + if ($lvl > 1 || $this->list_indent_first_level) { + $indent += $this->list_indent[$lvl][$occur]; + $lastIndent[$lvl] = $this->list_indent[$lvl][$occur]; + } + } + else if ($currIndentLvl > $lvl) { + while ($currIndentLvl > $lvl) { + $indent -= $lastIndent[$currIndentLvl]; + $currIndentLvl--; + } + } + $currIndentLvl = $lvl; + + +/*-- RTL --*/ + + if ($this->listDir == 'rtl') { + // list_align_style Determines alignment of numbers in numbered lists + if ($this->list_align_style == 'L') { $lalign = 'R'; } + else { $lalign = 'L'; } + $this->divwidth = $this->blk[$this->blklvl]['width'] - ($indent + $blt_width + $space_width) ; + $xb = $this->blk[$this->blklvl]['inner_width'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left'] - $indent - $blt_width; //Bullet position (relative) + //Output bullet + $this->bulletarray = array('w'=>$blt_width,'h'=>$clh,'txt'=>$list_item_marker,'x'=>$xb,'align'=>$lalign,'font'=>$typefont,'level'=>$lvl, 'occur'=>$occur, 'num'=>$num, 'fontsize'=>$bullfs, 'col'=>$list_item_color ); + $this->x = $x; + } + else { +/*-- END RTL --*/ + + if ($this->list_align_style == 'L') { $lalign = 'L'; } + else { $lalign = 'R'; } + $this->divwidth = $this->blk[$this->blklvl]['width'] - ($indent + $blt_width + $space_width) ; + $xb = $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] - $blt_width - $space_width; + //Output bullet + $this->bulletarray = array('w'=>$blt_width,'h'=>$clh,'txt'=>$list_item_marker,'x'=>$xb,'align'=>$lalign,'font'=>$typefont,'level'=>$lvl, 'occur'=>$occur, 'num'=>$num, 'fontsize'=>$bullfs, 'col'=>$list_item_color ); + $this->x = $x + $indent + $blt_width + $space_width; + } // *RTL* + + //Print content + $this->printbuffer($this->textbuffer,'',false,true); + $this->textbuffer=array(); + + // Added to correct for OddEven Margins + if ($this->page != $bak_page) { + if (($this->page-$bak_page) % 2 == 1) { + $x += $this->MarginCorrection; + } + $bak_page = $this->page; + } +/*-- COLUMNS --*/ + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $oldcolumn = $this->CurrCol; + } +/*-- END COLUMNS --*/ + + } + + //Reset all used values + $this->listoccur = array(); + $this->listitem = array(); + $this->listlist = array(); + $this->listlvl = 0; + $this->listnum = 0; + $this->listtype = ''; + $this->textbuffer = array(); + $this->divwidth = 0; + $this->divheight = 0; + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; +} +/*-- END LISTS --*/ + +function _saveTextBuffer($t, $link = '', $intlink = '') { +// $this->textbuffer[] = array($t,$link,$this->currentfontstyle,$this->colorarray,$this->currentfontfamily,$this->SUP,$this->SUB,$intlink,$this->strike,$this->textparam,$this->spanbgcolorarray,$this->currentfontsize,$this->ReqFontStyle,$this->kerning,$this->lSpacingCSS,$this->wSpacingCSS,$this->spanborddet, $this->textshadow); + // mPDF 5.6.14 + $arr = array(); + $arr[0] = $t; + if (isset($link) && $link) $arr[1] = $link; + $arr[2] = $this->currentfontstyle; + if (isset($this->colorarray) && $this->colorarray) $arr[3] = $this->colorarray; + $arr[4] = $this->currentfontfamily; + if (isset($this->SUP) && $this->SUP) $arr[5] = $this->SUP; + if (isset($this->SUB) && $this->SUB) $arr[6] = $this->SUB; + if (isset($intlink) && $intlink) $arr[7] = $intlink; + if (isset($this->strike) && $this->strike) $arr[8] = $this->strike; + if (isset($this->textparam) && $this->textparam) $arr[9] = $this->textparam; + if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) $arr[10] = $this->spanbgcolorarray; + $arr[11] = $this->currentfontsize; + if (isset($this->ReqFontStyle) && $this->ReqFontStyle) $arr[12] = $this->ReqFontStyle; + if (isset($this->kerning) && $this->kerning) $arr[13] = $this->kerning; + if (isset($this->lSpacingCSS) && $this->lSpacingCSS) $arr[14] = $this->lSpacingCSS; + if (isset($this->wSpacingCSS) && $this->wSpacingCSS) $arr[15] = $this->wSpacingCSS; + if (isset($this->spanborddet) && $this->spanborddet) $arr[16] = $this->spanborddet; + if (isset($this->textshadow) && $this->textshadow) $arr[17] = $this->textshadow; + $this->textbuffer[] = $arr; +} + +function _saveCellTextBuffer($t, $link = '', $intlink = '') { +// $this->cell[$this->row][$this->col]['textbuffer'][] = array($t,$link,$this->currentfontstyle,$this->colorarray,$this->currentfontfamily,$this->SUP,$this->SUB,$intlink,$this->strike,$this->textparam,$this->spanbgcolorarray,$this->currentfontsize,$this->ReqFontStyle,$this->kerning,$this->lSpacingCSS,$this->wSpacingCSS,$this->spanborddet, $this->textshadow); + // mPDF 5.6.14 + $arr = array(); + $arr[0] = $t; + if (isset($link) && $link) $arr[1] = $link; + $arr[2] = $this->currentfontstyle; + if (isset($this->colorarray) && $this->colorarray) $arr[3] = $this->colorarray; + $arr[4] = $this->currentfontfamily; + if (isset($this->SUP) && $this->SUP) $arr[5] = $this->SUP; + if (isset($this->SUB) && $this->SUB) $arr[6] = $this->SUB; + if (isset($intlink) && $intlink) $arr[7] = $intlink; + if (isset($this->strike) && $this->strike) $arr[8] = $this->strike; + if (isset($this->textparam) && $this->textparam) $arr[9] = $this->textparam; + if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) $arr[10] = $this->spanbgcolorarray; + $arr[11] = $this->currentfontsize; + if (isset($this->ReqFontStyle) && $this->ReqFontStyle) $arr[12] = $this->ReqFontStyle; + if (isset($this->kerning) && $this->kerning) $arr[13] = $this->kerning; + if (isset($this->lSpacingCSS) && $this->lSpacingCSS) $arr[14] = $this->lSpacingCSS; + if (isset($this->wSpacingCSS) && $this->wSpacingCSS) $arr[15] = $this->wSpacingCSS; + if (isset($this->spanborddet) && $this->spanborddet) $arr[16] = $this->spanborddet; + if (isset($this->textshadow) && $this->textshadow) $arr[17] = $this->textshadow; + $this->cell[$this->row][$this->col]['textbuffer'][] = $arr; +} + + +function printbuffer($arrayaux,$blockstate=0,$is_table=false,$is_list=false) +{ +// $blockstate = 0; // NO margins/padding +// $blockstate = 1; // Top margins/padding only +// $blockstate = 2; // Bottom margins/padding only +// $blockstate = 3; // Top & bottom margins/padding + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + $paint_ht_corr = 0; + +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if (($this->blk[$this->blklvl]['inner_width']-$l_width-$r_width) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($this->blk[$this->blklvl]['inner_width']-$r_width) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl); + } + else if ($r_max < $l_max && ($this->blk[$this->blklvl]['inner_width']-$l_width) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl); + } + else { $this->ClearFloats('BOTH', $this->blklvl); } + } + } +/*-- END CSS-FLOAT --*/ + $bak_y = $this->y; + $bak_x = $this->x; + $align = ''; + if (!$is_table && !$is_list) { + if (isset($this->blk[$this->blklvl]['align']) && $this->blk[$this->blklvl]['align']) { $align = $this->blk[$this->blklvl]['align']; } + // Block-align is set by e.g. <.. align="center"> Takes priority for this block but not inherited + if (isset($this->blk[$this->blklvl]['block-align']) && $this->blk[$this->blklvl]['block-align']) { $align = $this->blk[$this->blklvl]['block-align']; } + if (isset($this->blk[$this->blklvl]['direction'])) $blockdir = $this->blk[$this->blklvl]['direction']; + else $blockdir = ""; + $this->divwidth = $this->blk[$this->blklvl]['width']; + } + else { + $align = $this->divalign; + if ($is_table) { $blockdir = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['direction']; } + else { $blockdir = $this->listDir; } + } + $oldpage = $this->page; + + // ADDED for Out of Block now done as Flowing Block + if ($this->divwidth == 0) { + $this->divwidth = $this->pgwidth; + } + + if (!$is_table && !$is_list) { $this->SetLineHeight($this->FontSizePt,$this->blk[$this->blklvl]['line_height']); } + $this->divheight = $this->lineheight; + $old_height = $this->divheight; + + // As a failsafe - if font has been set but not output to page + $this->SetFont($this->default_font,'',$this->default_font_size,true,true); // force output to page + + $array_size = count($arrayaux); + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,true,$blockdir); + + // Added - Otherwise

    did not output top margins/padding for 1st/2nd div + if ($array_size == 0) { $this->finishFlowingBlock(true); } // true = END of flowing block + + for($i=0;$i < $array_size; $i++) + { + // COLS + $oldcolumn = $this->CurrCol; + + $vetor = $arrayaux[$i]; + if ($i == 0 and $vetor[0] != "\n" and !$this->ispre) { + $vetor[0] = ltrim($vetor[0]); + } + + // FIXED TO ALLOW IT TO SHOW '0' + if (empty($vetor[0]) && !($vetor[0]==='0') && empty($vetor[7])) { //Ignore empty text and not carrying an internal link + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { $this->finishFlowingBlock(true); } // true = END of flowing block + continue; + } + + + //Activating buffer properties + if(isset($vetor[11]) and $vetor[11] != '') { // Font Size + if ($is_table && $this->shrin_k) { + $this->SetFontSize($vetor[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($vetor[11],false); + } + } + + if(isset($vetor[17]) && !empty($vetor[17])) { //TextShadow + $this->textshadow = $vetor[17]; + } + if(isset($vetor[16]) && !empty($vetor[16])) { //Border + $this->spanborddet = $vetor[16]; + $this->spanborder = true; + } + + if(isset($vetor[15])) { // Word spacing + $this->wSpacingCSS = $vetor[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($vetor[14])) { // Letter spacing + $this->lSpacingCSS = $vetor[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($vetor[13])) { // Font Kerning + $this->kerning = $vetor[13]; + } + + + if(isset($vetor[10]) and !empty($vetor[10])) //Background color + { + $this->spanbgcolorarray = $vetor[10]; + $this->spanbgcolor = true; + } + if(isset($vetor[9]) and !empty($vetor[9])) // Text parameters - Outline + hyphens + { + $this->textparam = $vetor[9] ; // mPDF 5.6.14 + $this->SetTextOutline($this->textparam); // mPDF 5.6.07 + } + if(isset($vetor[8]) and $vetor[8] === true) // strike-through the text + { + $this->strike = true; + } + if(isset($vetor[7]) and $vetor[7] != '') // internal target: + { + $ily = $this->y; + if ($this->keep_block_together) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "kt"=>true ); } + else if ($this->table_rotate) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "tbrot"=>true ); } + else if ($this->kwt) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "kwt"=>true ); } + else if ($this->ColActive) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "col"=>$this->CurrCol ); } + else + $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page ); + if (empty($vetor[0])) { //Ignore empty text + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { $this->finishFlowingBlock(true); } // true = END of flowing block + continue; + } + } + if(isset($vetor[6]) and $vetor[6] === true) // Subscript + { + $this->SUB = true; + } + if(isset($vetor[5]) and $vetor[5] === true) // Superscript + { + $this->SUP = true; + } + if(isset($vetor[4]) and $vetor[4] != '') { // Font Family + $font = $this->SetFont($vetor[4],$this->FontStyle,0,false); + } + if (!empty($vetor[3])) //Font Color + { + $cor = $vetor[3]; + $this->SetTColor($cor); + } + if(isset($vetor[2]) and $vetor[2] != '') //Bold,Italic,Underline styles + { + $this->SetStyles($vetor[2]); + } + + if(isset($vetor[12]) and $vetor[12] != '') { //Requested Bold,Italic,Underline + $this->ReqFontStyle = $vetor[12]; + } + if(isset($vetor[1]) and $vetor[1] != '') //LINK + { + if (strpos($vetor[1],".") === false && strpos($vetor[1],"@") !== 0) //assuming every external link has a dot indicating extension (e.g: .html .txt .zip www.somewhere.com etc.) + { + //Repeated reference to same anchor? + while(array_key_exists($vetor[1],$this->internallink)) $vetor[1]="#".$vetor[1]; + $this->internallink[$vetor[1]] = $this->AddLink(); + $vetor[1] = $this->internallink[$vetor[1]]; + } + $this->HREF = $vetor[1]; // HREF link style set here ****** + } + + // SPECIAL CONTENT - IMAGES & FORM OBJECTS + //Print-out special content + + if (substr($vetor[0],0,3) == "\xbb\xa4\xac") { //identifier has been identified! + + $objattr = $this->_getObjAttr($vetor[0]); + +/*-- TABLES --*/ + if ($objattr['type'] == 'nestedtable') { + if ($objattr['nestedcontent']) { + $level = $objattr['level']; + $table = &$this->table[$level][$objattr['table']]; + if ($this->cacheTables) { + $fh = fopen($table['cache'], "r+b"); + $cell = $this->_uncacheCell($table['cells'][$objattr['row']][$objattr['col']], '', $fh); + } + else { + $fh = null; + $cell = &$table['cells'][$objattr['row']][$objattr['col']]; + } + $this->finishFlowingBlock(false,'nestedtable'); + $save_dw = $this->divwidth ; + $save_buffer = $this->cellBorderBuffer; + $this->cellBorderBuffer = array(); + $ncx = $this->x; + list($dummyx,$w) = $this->_tableGetWidth($table, $objattr['row'], $objattr['col'], $fh); + $ntw = $this->table[($level+1)][$objattr['nestedcontent']]['w']; // nested table width + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cell['borderbin']); + } + else { + $br = $cell['border_details']['R']['w']; + $bl = $cell['border_details']['L']['w']; + } + if ($table['borders_separate']) { + $innerw = $w - $bl - $br - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; + } + else { + $innerw = $w - $bl/2 - $br/2 - $cell['padding']['L'] - $cell['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($table['borders_separate']) { + $innerw = $w - $table['simple']['border_details']['L']['w'] - $table['simple']['border_details']['R']['w'] - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; + } + else { + $innerw = $w - $table['simple']['border_details']['L']['w']/2 - $table['simple']['border_details']['R']['w']/2 - $cell['padding']['L'] - $cell['padding']['R']; + } + } + if ($cell['a']=='C' || $this->table[($level+1)][$objattr['nestedcontent']]['a']=='C') { + $ncx += ($innerw-$ntw)/2; + } + elseif ($cell['a']=='R' || $this->table[($level+1)][$objattr['nestedcontent']]['a']=='R') { + $ncx += $innerw- $ntw; + } + $this->x = $ncx ; + if ($this->cacheTables) { fclose($fh); } + + $this->_tableWrite($this->table[($level+1)][$objattr['nestedcontent']]); + $this->cellBorderBuffer = $save_buffer; + $this->x = $bak_x ; + $this->divwidth = $save_dw; + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + } + else { +/*-- END TABLES --*/ + if ($is_table) { // *TABLES* + $maxWidth = $this->divwidth; // *TABLES* + } // *TABLES* + else { // *TABLES* + $maxWidth = $this->divwidth - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w']); + } // *TABLES* + +/*-- CSS-IMAGE-FLOAT --*/ + // If float (already) exists at this level + if (isset($this->floatmargins['R']) && $this->y <= $this->floatmargins['R']['y1'] && $this->y >= $this->floatmargins['R']['y0']) { $maxWidth -= $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $this->y <= $this->floatmargins['L']['y1'] && $this->y >= $this->floatmargins['L']['y0']) { $maxWidth -= $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + list($skipln) = $this->inlineObject($objattr['type'], '', $this->y, $objattr,$this->lMargin, ($this->flowingBlockAttr['contentWidth']/_MPDFK), $maxWidth, $this->flowingBlockAttr['height'], false, $is_table); + // 1 -> New line needed because of width + // -1 -> Will fit width on line but NEW PAGE REQUIRED because of height + // -2 -> Will not fit on line therefore needs new line but thus NEW PAGE REQUIRED + $iby = $this->y; + $oldpage = $this->page; + $oldcol = $this->CurrCol; + if (($skipln == 1 || $skipln == -2) && !isset($objattr['float'])) { + $this->finishFlowingBlock(false,$objattr['type']); + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + $thispage = $this->page; + if ($this->CurrCol!=$oldcol) { $changedcol = true; } + else { $changedcol=false; } + + // the previous lines can already have triggered page break or column change + if (!$changedcol && $skipln <0 && $this->AcceptPageBreak() && $thispage==$oldpage) { + + $this->AddPage($this->CurOrientation); + + // Added to correct Images already set on line before page advanced + // i.e. if second inline image on line is higher than first and forces new page + if (count($this->objectbuffer)) { + $yadj = $iby - $this->y; + foreach($this->objectbuffer AS $ib=>$val) { + if ($this->objectbuffer[$ib]['OUTER-Y'] ) $this->objectbuffer[$ib]['OUTER-Y'] -= $yadj; + if ($this->objectbuffer[$ib]['BORDER-Y']) $this->objectbuffer[$ib]['BORDER-Y'] -= $yadj; + if ($this->objectbuffer[$ib]['INNER-Y']) $this->objectbuffer[$ib]['INNER-Y'] -= $yadj; + } + } + } + + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + $this->x = $bak_x; +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + +/*-- CSS-IMAGE-FLOAT --*/ + if ($objattr['type'] == 'image' && isset($objattr['float'])) { + $fy = $this->y; + + // DIV TOP MARGIN/BORDER/PADDING + if ($this->flowingBlockAttr['newblock'] && ($this->flowingBlockAttr['blockstate']==1 || $this->flowingBlockAttr['blockstate']==3) && $this->flowingBlockAttr['lineCount']== 0) { + $fy += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } + + if ($objattr['float']=='R') { + $fx = $this->w - $this->rMargin - $objattr['width'] - ($this->blk[$this->blklvl]['outer_right_margin'] + $this->blk[$this->blklvl]['border_right']['w'] + $this->blk[$this->blklvl]['padding_right']); + + + } + else if ($objattr['float']=='L') { + $fx = $this->lMargin + ($this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']); + } + $w = $objattr['width']; + $h = abs($objattr['height']); + + $widthLeft = $maxWidth - ($this->flowingBlockAttr['contentWidth']/_MPDFK); + $maxHeight = $this->h - ($this->tMargin + $this->margin_header + $this->bMargin + 10) ; + // For Images + $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left']+ $objattr['margin_right']); + $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top']+ $objattr['margin_bottom']); + + if ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg') { + $file = $objattr['file']; + $info=$this->formobjects[$file]; + } + else { + $file = $objattr['file']; + $info=$this->images[$file]; + } + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + if ($objattr['border_left']['w']) { + $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w'] + $objattr['border_right']['w'])/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w'] + $objattr['border_bottom']['w'])/2) ; + $objattr['BORDER-X'] = $fx + $objattr['margin_left'] + (($objattr['border_left']['w'])/2) ; + $objattr['BORDER-Y'] = $fy + $objattr['margin_top'] + (($objattr['border_top']['w'])/2) ; + } + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $fx + $objattr['margin_left'] + ($objattr['border_left']['w']); + $objattr['INNER-Y'] = $fy + $objattr['margin_top'] + ($objattr['border_top']['w']) ; + $objattr['ID'] = $info['i']; + $objattr['OUTER-WIDTH'] = $w; + $objattr['OUTER-HEIGHT'] = $h; + $objattr['OUTER-X'] = $fx; + $objattr['OUTER-Y'] = $fy; + if ($objattr['float']=='R') { + // If R float already exists at this level + $this->floatmargins['R']['skipline'] = false; + if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { + $this->WriteFlowingBlock($vetor[0]); + } + // If L float already exists at this level + else if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { + // Final check distance between floats is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['L']['w']) < $mw) { + $this->WriteFlowingBlock($vetor[0]); + } + else { + $this->floatmargins['R']['x'] = $fx; + $this->floatmargins['R']['w'] = $w; + $this->floatmargins['R']['y0'] = $fy; + $this->floatmargins['R']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['R']['skipline'] = true; + $this->floatmargins['R']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else { + $this->floatmargins['R']['x'] = $fx; + $this->floatmargins['R']['w'] = $w; + $this->floatmargins['R']['y0'] = $fy; + $this->floatmargins['R']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['R']['skipline'] = true; + $this->floatmargins['R']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else if ($objattr['float']=='L') { + // If L float already exists at this level + $this->floatmargins['L']['skipline'] = false; + if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { + $this->floatmargins['L']['skipline'] = false; + $this->WriteFlowingBlock($vetor[0]); + } + // If R float already exists at this level + else if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { + // Final check distance between floats is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['R']['w']) < $mw) { + $this->WriteFlowingBlock($vetor[0]); + } + else { + $this->floatmargins['L']['x'] = $fx + $w; + $this->floatmargins['L']['w'] = $w; + $this->floatmargins['L']['y0'] = $fy; + $this->floatmargins['L']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['L']['skipline'] = true; + $this->floatmargins['L']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else { + $this->floatmargins['L']['x'] = $fx + $w; + $this->floatmargins['L']['w'] = $w; + $this->floatmargins['L']['y0'] = $fy; + $this->floatmargins['L']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['L']['skipline'] = true; + $this->floatmargins['L']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + } + else { +/*-- END CSS-IMAGE-FLOAT --*/ + $this->WriteFlowingBlock($vetor[0]); +/*-- CSS-IMAGE-FLOAT --*/ + } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + } // END If special content + else { //THE text + if ($this->tableLevel) { $paint_ht_corr = 0; } // To move the y up when new column/page started if div border needed + else { $paint_ht_corr = $this->blk[$this->blklvl]['border_top']['w']; } + + if ($vetor[0] == "\n") { //We are reading a
    now turned into newline ("\n") + if ($this->flowingBlockAttr['content']) { + $this->finishFlowingBlock(false,'br'); + } + else if ($is_table) { + $this->y+= $this->_computeLineheight($this->table_lineheight); + } + else if (!$is_table) { + $this->DivLn($this->lineheight); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + $this->x = $bak_x; +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + else { + $this->WriteFlowingBlock( $vetor[0]); + + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + $this->x = $bak_x; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + } + + + } + + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { + $this->finishFlowingBlock(true); // true = END of flowing block + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + $this->x = $bak_x; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + + } + + // RESETTING VALUES + $this->SetTColor($this->ConvertColor(0)); + $this->SetDColor($this->ConvertColor(0)); + $this->SetFColor($this->ConvertColor(255)); + $this->colorarray = ''; + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + $this->HREF = ''; + $this->textparam = array(); + $this->SetTextOutline(); + $this->SUP = false; + $this->SUB = false; + + $this->strike = false; + $this->textshadow = ''; + + $this->currentfontfamily = ''; + $this->currentfontsize = ''; + $this->currentfontstyle = ''; +/*-- TABLES --*/ + if ($this->tableLevel) { + $this->SetLineHeight('',$this->table_lineheight); // *TABLES* + } + else +/*-- END TABLES --*/ +/*-- LISTS --*/ + if ($is_list && $this->list_lineheight[$this->listlvl][$this->listOcc]) { + $this->SetLineHeight('',$this->list_lineheight[$this->listlvl][$this->listOcc]); // sets default line height + } + else +/*-- END LISTS --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + $this->SetLineHeight('',$this->blk[$this->blklvl]['line_height']); // sets default line height + } + $this->ResetStyles(); + $this->toupper = false; + $this->tolower = false; + $this->capitalize = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + $this->SetDash(); + $this->dash_on = false; + $this->dotted_on = false; + + }//end of for(i=0;iblk[$this->blklvl]['border']) || isset($this->blk[$this->blklvl]['bgcolor']) || isset($this->blk[$this->blklvl]['box_shadow'])) && $blockstate && ($this->y != $this->oldy)) { + $bottom_y = $this->y; // Does not include Bottom Margin + if (isset($this->blk[$this->blklvl]['startpage']) && $this->blk[$this->blklvl]['startpage'] != $this->page && $blockstate != 1) { + $this->PaintDivBB('pagetop',$blockstate); + } + + else if ($blockstate != 1) { + $this->PaintDivBB('',$blockstate); + } + $this->y = $bottom_y; + $this->x = $bak_x; + } + + // Reset Font + $this->SetFontSize($this->default_font_size,false); + + +} + +function _setDashBorder($style, $div, $cp, $side) { + if ($style == 'dashed' && (($side=='L' || $side=='R') || ($side=='T' && $div != 'pagetop' && !$cp) || ($side=='B' && $div!='pagebottom') )) { + $dashsize = 2; // final dash will be this + 1*linewidth + $dashsizek = 1.5; // ratio of Dash/Blank + $this->SetDash($dashsize,($dashsize/$dashsizek)+($this->LineWidth*2)); + } + else if ($style == 'dotted' || ($side=='T' && ($div == 'pagetop' || $cp)) || ($side=='B' && $div == 'pagebottom')) { + //Round join and cap + $this->SetLineJoin(1); + $this->SetLineCap(1); + $this->SetDash(0.001,($this->LineWidth*3)); + } +} + +function _setBorderLine($b, $k=1) { + $this->SetLineWidth($b['w']/$k); + $this->SetDColor($b['c']); + if ($b['c'][0]==5) { // RGBa + $this->SetAlpha($b['c'][4], 'Normal', false, 'S')."\n"; + } + else if ($b['c'][0]==6) { // CMYKa + $this->SetAlpha($b['c'][5], 'Normal', false, 'S')."\n"; + } +} + +// mPDF 5.6.52 +function PaintDivBB($divider='',$blockstate=0,$blvl=0) { + // Borders & backgrounds are done elsewhere for columns - messes up the repositioning in printcolumnbuffer + if ($this->ColActive) { return ; } // *COLUMNS* + $save_y = $this->y; + if (!$blvl) { $blvl = $this->blklvl; } + $x0 = $x1 = $y0 = $y1 = 0; + + // Added mPDF 3.0 Float DIV + if (isset($this->blk[$blvl]['bb_painted'][$this->page]) && $this->blk[$blvl]['bb_painted'][$this->page]) { return; } // *CSS-FLOAT* + + if (isset($this->blk[$blvl]['x0'])) { $x0 = $this->blk[$blvl]['x0']; } // left + if (isset($this->blk[$blvl]['y1'])) { $y1 = $this->blk[$blvl]['y1']; } // bottom + + // Added mPDF 3.0 Float DIV - ensures backgrounds/borders are drawn to bottom of page + if ($y1==0) { + if ($divider=='pagebottom') { $y1 = $this->h-$this->bMargin; } + else { $y1 = $this->y; } + } + + if (isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page) { $continuingpage = true; } else { $continuingpage = false; } + + if (isset($this->blk[$blvl]['y0'])) { $y0 = $this->blk[$blvl]['y0']; } + $h = $y1 - $y0; + $w = $this->blk[$blvl]['width']; + $x1 = $x0 + $w; + + // Set border-widths as used here + $border_top = $this->blk[$blvl]['border_top']['w']; + $border_bottom = $this->blk[$blvl]['border_bottom']['w']; + $border_left = $this->blk[$blvl]['border_left']['w']; + $border_right = $this->blk[$blvl]['border_right']['w']; + if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { + $border_top = 0; + } + if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { + $border_bottom = 0; + } + + $brTL_H = 0; + $brTL_V = 0; + $brTR_H = 0; + $brTR_V = 0; + $brBL_H = 0; + $brBL_V = 0; + $brBR_H = 0; + $brBR_V = 0; + + $brset = false; +/*-- BORDER-RADIUS --*/ + if (isset($this->blk[$blvl]['border_radius_TL_H'])) { $brTL_H = $this->blk[$blvl]['border_radius_TL_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TL_V'])) { $brTL_V = $this->blk[$blvl]['border_radius_TL_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TR_H'])) { $brTR_H = $this->blk[$blvl]['border_radius_TR_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TR_V'])) { $brTR_V = $this->blk[$blvl]['border_radius_TR_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BR_H'])) { $brBR_H = $this->blk[$blvl]['border_radius_BR_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BR_V'])) { $brBR_V = $this->blk[$blvl]['border_radius_BR_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BL_H'])) { $brBL_H = $this->blk[$blvl]['border_radius_BL_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BL_V'])) { $brBL_V = $this->blk[$blvl]['border_radius_BL_V']; $brset = true; } + + // mPDF 5.4.17 + //if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage || $this->keep_block_together) { + if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { + $brTL_H = 0; + $brTL_V = 0; + $brTR_H = 0; + $brTR_V = 0; + } + // mPDF 5.4.17 + //if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom' || $this->keep_block_together) { + if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { + $brBL_H = 0; + $brBL_V = 0; + $brBR_H = 0; + $brBR_V = 0; + } + + // Disallow border-radius if it is smaller than the border width. + if ($brTL_H < min($border_left, $border_top)) { $brTL_H = $brTL_V = 0; } + if ($brTL_V < min($border_left, $border_top)) { $brTL_V = $brTL_H = 0; } + if ($brTR_H < min($border_right, $border_top)) { $brTR_H = $brTR_V = 0; } + if ($brTR_V < min($border_right, $border_top)) { $brTR_V = $brTR_H = 0; } + if ($brBL_H < min($border_left, $border_bottom)) { $brBL_H = $brBL_V = 0; } + if ($brBL_V < min($border_left, $border_bottom)) { $brBL_V = $brBL_H = 0; } + if ($brBR_H < min($border_right, $border_bottom)) { $brBR_H = $brBR_V = 0; } + if ($brBR_V < min($border_right, $border_bottom)) { $brBR_V = $brBR_H = 0; } + + // CHECK FOR radii that sum to > width or height of div ******** + $f = min($h/($brTL_V + $brBL_V + 0.001), $h/($brTR_V + $brBR_V + 0.001), $w/($brTL_H + $brTR_H + 0.001), $w/($brBL_H + $brBR_H + 0.001)); + if ($f < 1) { + $brTL_H *= $f; + $brTL_V *= $f; + $brTR_H *= $f; + $brTR_V *= $f; + $brBL_H *= $f; + $brBL_V *= $f; + $brBR_H *= $f; + $brBR_V *= $f; + } +/*-- END BORDER-RADIUS --*/ + + $tbcol = $this->ConvertColor(255); + for($l=0; $l <= $blvl; $l++) { + if ($this->blk[$l]['bgcolor']) { + $tbcol = $this->blk[$l]['bgcolorarray']; + } + } + + // BORDERS + if (isset($this->blk[$blvl]['y0']) && $this->blk[$blvl]['y0']) { $y0 = $this->blk[$blvl]['y0']; } + $h = $y1 - $y0; + $w = $this->blk[$blvl]['width']; + + //if ($this->blk[$blvl]['border_top']) { + // Reinstate line above for dotted line divider when block border crosses a page + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $tbd = $this->blk[$blvl]['border_top']; + + // mPDF 5.4.18 + $legend = ''; + if (isset($this->blk[$blvl]['border_legend']) && $this->blk[$blvl]['border_legend']) { + $legend = $this->blk[$blvl]['border_legend']; // Same structure array as textbuffer + $txt = ltrim($legend[0]); + + //Set font, size, style, color + $this->SetFont($legend[4],$legend[2],$legend[11]); + if ($legend[3]) { + $cor = $legend[3]; + $this->SetTColor($cor); + } + $stringWidth = $this->GetStringWidth($txt ); + $save_x = $this->x; + $save_y = $this->y; + $save_currentfontfamily = $this->FontFamily; + $save_currentfontsize = $this->FontSizePt; + $save_currentfontstyle = $this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->y = $y0 - $this->FontSize/2 + $this->blk[$blvl]['border_top']['w']/2; + $this->x = $x0 + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_left']['w']; + + // Set the distance from the border line to the text ? make configurable variable + $gap = 0.2 * $this->FontSize; + + $legbreakL = $this->x - $gap; + $legbreakR = $this->x + $stringWidth + $gap; + + $this->Cell( $stringWidth, $this->FontSize, $txt , '', 0, 'C', $fill, '', 0, 0,0,'M', $fill); + // Reset + $this->x = $save_x; + $this->y = $save_y; + $this->SetFont($save_currentfontfamily,$save_currentfontstyle,$save_currentfontsize); + $this->SetTColor($this->ConvertColor(0)); + } + + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $legbreakL -= $border_top/2; // because line cap different + $legbreakR += $border_top/2; + $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'T'); + } +/*-- BORDER-RADIUS --*/ + else if (($brTL_V && $brTL_H) || ($brTR_V && $brTR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brTR_H && $brTR_V) { + $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_top/2 , $brTR_V - $border_top/2 , 1, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brTL_H && $brTL_V ) { + // mPDF 5.4.18 + if ($legend) { + if ($legbreakR < ($x0 + $w - $brTR_H)) { + $s .= (sprintf('%.3F %.3F l ', $legbreakR*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + if ($legbreakL > ($x0 + $brTL_H )) { + $s .= (sprintf('%.3F %.3F m ',$legbreakL*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + $s .= (sprintf('%.3F %.3F l ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK)."\n"); + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_top/2 , $brTL_V - $border_top/2 , 2, 1))."\n"; + } + else { +/*-- END BORDER-RADIUS --*/ + // mPDF 5.4.18 + if ($legend) { + if ($legbreakR < ($x0 + $w)) { + $s .= (sprintf('%.3F %.3F l ',$legbreakR*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + if ($legbreakL > ($x0)) { + $s .= (sprintf('%.3F %.3F m ',$legbreakL*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ', ($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ', ($x0 + $border_top/2)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + } +/*-- END BORDER-RADIUS --*/ + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + //if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1) { + // Reinstate line above for dotted line divider when block border crosses a page + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $tbd = $this->blk[$blvl]['border_bottom']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'B'); } +/*-- BORDER-RADIUS --*/ + else if (($brBL_V && $brBL_H) || ($brBR_V && $brBR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brBL_H && $brBL_V) { + $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_bottom/2 , $brBL_V - $border_bottom/2 , 3, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_bottom/2))*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brBR_H && $brBR_V ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_bottom/2) - $brBR_H )*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_bottom/2 , $brBR_V - $border_bottom/2 , 4, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_bottom/2))*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_left']) { + $tbd = $this->blk[$blvl]['border_left']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0+$border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'L'); } +/*-- BORDER-RADIUS --*/ + else if (($brTL_V && $brTL_H) || ($brBL_V && $brBL_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brTL_V && $brTL_H) { + $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_left/2 , $brTL_V - $border_left/2, 2, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + ($border_left/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brBL_V && $brBL_H ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h - ($border_left/2)- $brBL_V) )*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_left/2 , $brBL_V - $border_left/2, 3, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h) )*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h - ($border_left/2)) )*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_right']) { + $tbd = $this->blk[$blvl]['border_right']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0 + $w)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0+$border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'R'); } +/*-- BORDER-RADIUS --*/ + else if (($brTR_V && $brTR_H) || ($brBR_V && $brBR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brBR_V && $brBR_H) { + $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_right/2 , $brBR_V - $border_right/2, 4, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + $h))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + $h - ($border_right/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brTR_V && $brTR_H ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + ($border_right/2) + $brTR_V) )*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_right/2 , $brTR_V - $border_right/2, 1, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0) )*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + ($border_right/2)) )*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + + + $this->SetDash(); + $this->y = $save_y; + + + // BACKGROUNDS are disabled in columns/kbt/headers - messes up the repositioning in printcolumnbuffer + if ($this->ColActive || $this->kwt || $this->keep_block_together) { return ; } + + + $bgx0 = $x0; + $bgx1 = $x1; + $bgy0 = $y0; + $bgy1 = $y1; + + // Defined br values represent the radius of the outer curve - need to take border-width/2 from each radius for drawing the borders + if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'padding-box') { + $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w']); + $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w']); + $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w']); + $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w']); + $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w']); + $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w']); + $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w']); + $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w']); + $bgx0 += $this->blk[$blvl]['border_left']['w']; + $bgx1 -= $this->blk[$blvl]['border_right']['w']; + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bgy0 += $this->blk[$blvl]['border_top']['w']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bgy1 -= $this->blk[$blvl]['border_bottom']['w']; + } + } + // mPDF 5.6.09 + else if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'content-box') { + $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); + $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); + $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); + $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); + $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); + $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); + $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); + $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); + $bgx0 += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $bgx1 -= $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']; + if (($this->blk[$blvl]['border_top']['w'] || $this->blk[$blvl]['padding_top']) && $divider != 'pagetop' && !$continuingpage) { + $bgy0 += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + if (($this->blk[$blvl]['border_bottom']['w'] || $this->blk[$blvl]['padding_bottom']) && $blockstate != 1 && $divider != 'pagebottom') { + $bgy1 -= $this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']; + } + } + else { + $brbgTL_H = $brTL_H; + $brbgTL_V = $brTL_V; + $brbgTR_H = $brTR_H; + $brbgTR_V = $brTR_V; + $brbgBL_H = $brBL_H; + $brbgBL_V = $brBL_V; + $brbgBR_H = $brBR_H; + $brbgBR_V = $brBR_V; + } + + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($bgx0+$brbgTL_H )*_MPDFK, ($this->h-$bgy0)*_MPDFK); // start point TL before the arc +/*-- BORDER-RADIUS --*/ + if ($brbgTL_H || $brbgTL_V) { + $s .= $this->_EllipseArc($bgx0+$brbgTL_H, $bgy0+$brbgTL_V, $brbgTL_H , $brbgTL_V , 2); // segment 2 TL + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx0)*_MPDFK, ($this->h-($bgy1-$brbgBL_V ))*_MPDFK); // line to BL +/*-- BORDER-RADIUS --*/ + if ($brbgBL_H || $brbgBL_V) { + $s .= $this->_EllipseArc($bgx0+$brbgBL_H, $bgy1-$brbgBL_V, $brbgBL_H , $brbgBL_V , 3); // segment 3 BL + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx1-$brbgBR_H )*_MPDFK, ($this->h-($bgy1))*_MPDFK); // line to BR +/*-- BORDER-RADIUS --*/ + if ($brbgBR_H || $brbgBR_V) { + $s .= $this->_EllipseArc($bgx1-$brbgBR_H, $bgy1-$brbgBR_V, $brbgBR_H , $brbgBR_V , 4); // segment 4 BR + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx1)*_MPDFK, ($this->h-($bgy0+$brbgTR_V))*_MPDFK); // line to TR +/*-- BORDER-RADIUS --*/ + if ($brbgTR_H || $brbgTR_V) { + $s .= $this->_EllipseArc($bgx1-$brbgTR_H, $bgy0+$brbgTR_V, $brbgTR_H , $brbgTR_V , 1); // segment 1 TR + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx0+$brbgTL_H )*_MPDFK, ($this->h-$bgy0)*_MPDFK); // line to TL + + + // Box Shadow + $shadow = ''; + if (isset($this->blk[$blvl]['box_shadow']) && $this->blk[$blvl]['box_shadow'] && $h > 0) { + foreach($this->blk[$blvl]['box_shadow'] AS $sh) { + // Colors + if ($sh['col']{0}==1) { + $colspace = 'Gray'; + if ($sh['col']{2}==1) { $col1 = '1'.$sh['col'][1].'1'.$sh['col'][3]; } + else { $col1 = '1'.$sh['col'][1].'1'.chr(100); } + $col2 = '1'.$sh['col'][1].'1'.chr(0); + } + else if ($sh['col']{0}==4) { // CMYK + $colspace = 'CMYK'; + $col1 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(100); + $col2 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(0); + } + else if ($sh['col']{0}==5) { // RGBa + $colspace = 'RGB'; + $col1 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4]; + $col2 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(0); + } + else if ($sh['col']{0}==6) { // CMYKa + $colspace = 'CMYK'; + $col1 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].$sh['col'][5]; + $col2 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(0); + } + else { + $colspace = 'RGB'; + $col1 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(100); + $col2 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(0); + } + + // Use clipping path as set above (and rectangle around page) to clip area outside box + $shadow .= $s; // Use the clipping path with W* + $shadow .= sprintf('0 %.3F m %.3F %.3F l ', $this->h*_MPDFK, $this->w*_MPDFK, $this->h*_MPDFK); + $shadow .= sprintf('%.3F 0 l 0 0 l 0 %.3F l ', $this->w*_MPDFK, $this->h*_MPDFK); + $shadow .= 'W n'."\n"; + + $sh['blur'] = abs($sh['blur']); // cannot have negative blur value + // Ensure spread/blur do not make effective shadow width/height < 0 + // Could do more complex things but this just adjusts spread value + if (-$sh['spread'] + $sh['blur']/2 > min($w/2, $h/2)) { + $sh['spread'] = $sh['blur']/2 - min($w/2, $h/2) + 0.01; + } + // Shadow Offset + if ($sh['x'] || $sh['y']) $shadow .= sprintf(' q 1 0 0 1 %.4F %.4F cm', $sh['x']*_MPDFK, -$sh['y']*_MPDFK)."\n"; + + // Set path for INNER shadow + $shadow .= ' q 0 w '; + $shadow .= $this->SetFColor($col1, true)."\n"; + if ($col1{0}==5 && ord($col1{4})<100) { // RGBa + $shadow .= $this->SetAlpha(ord($col1{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($col1{0}==6 && ord($col1{5})<100) { // CMYKa + $shadow .= $this->SetAlpha(ord($col1{5})/100, 'Normal', true, 'F')."\n"; + } + else if ($col1{0}==1 && $col1{2}==1 && ord($col1{3})<100) { // Gray + $shadow .= $this->SetAlpha(ord($col1{3})/100, 'Normal', true, 'F')."\n"; + } + + // Blur edges + $mag = 0.551784; // Bezier Control magic number for 4-part spline for circle/ellipse + $mag2 = 0.551784; // Bezier Control magic number to fill in edge of blurred rectangle + $d1 = $sh['spread']+$sh['blur']/2; + $d2 = $sh['spread']-$sh['blur']/2; + $bl = $sh['blur']; + $x00 = $x0 - $d1; + $y00 = $y0 - $d1; + $w00 = $w + $d1*2; + $h00 = $h + $d1*2; + + // If any border-radius is greater width-negative spread(inner edge), ignore radii for shadow or screws up + $flatten = false; + if (max($brbgTR_H, $brbgTL_H, $brbgBR_H, $brbgBL_H) >= $w+$d2) { $flatten = true; } + if (max($brbgTR_V, $brbgTL_V, $brbgBR_V, $brbgBL_V) >= $h+$d2) { $flatten = true; } + + + // TOP RIGHT corner + $p1x = $x00+$w00-$d1-$brbgTR_H; $p1c2x = $p1x +($d2+$brbgTR_H)*$mag; + $p1y = $y00+$bl; + $p2x = $x00+$w00-$d1-$brbgTR_H; $p2c2x = $p2x + ($d1+$brbgTR_H)*$mag; + $p2y = $y00; $p2c1y = $p2y + $bl/2; + $p3x = $x00+$w00; $p3c2x = $p3x - $bl/2; + $p3y = $y00+$d1+$brbgTR_V; $p3c1y = $p3y - ($d1+$brbgTR_V)*$mag; + $p4x = $x00+$w00-$bl; + $p4y = $y00+$d1+$brbgTR_V; $p4c2y = $p4y - ($d2+$brbgTR_V)*$mag; + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p1x = $x00+$w00-$bl; $p1c2x = $p1x; + $p2x = $x00+$w00-$bl; $p2c2x = $p2x + $bl*$mag2; + $p3y = $y00+$bl; $p3c1y = $p3y - $bl*$mag2; + $p4y = $y00+$bl; $p4c2y = $p4y ; + } + + $shadow .= sprintf('%.3F %.3F m ', ($p1x )*_MPDFK, ($this->h-($p1y ))*_MPDFK); + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x)*_MPDFK, ($this->h-($p1y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4c2y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[0]['f']=0; + $patch_array[0]['points']=array($p1x,$p1y, $p1x,$p1y, + $p2x,$p2c1y, $p2x,$p2y, $p2c2x,$p2y, + $p3x,$p3c1y, $p3x,$p3y, $p3c2x,$p3y, + $p4x,$p4y, $p4x,$p4y, $p4x,$p4c2y, + $p1c2x,$p1y); + $patch_array[0]['colors'] = array($col1,$col2,$col2,$col1); + + + // RIGHT + $p1x = $x00+$w00; // control point only matches p3 preceding + $p1y = $y00+$d1+$brbgTR_V; + $p2x = $x00+$w00-$bl; // control point only matches p4 preceding + $p2y = $y00+$d1+$brbgTR_V; + $p3x = $x00+$w00-$bl; + $p3y = $y00+$h00-$d1-$brbgBR_V; + $p4x = $x00+$w00; $p4c1x = $p4x-$bl/2; + $p4y = $y00+$h00-$d1-$brbgBR_V; + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p1y = $y00+$bl; + $p2y = $y00+$bl; + } + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p3y = $y00+$h00-$bl; + $p4y = $y00+$h00-$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[1]['f']=2; + $patch_array[1]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4c1x,$p4y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[1]['colors'] = array($col1,$col2); + + + // BOTTOM RIGHT corner + $p1x = $x00+$w00-$bl; // control points only matches p3 preceding + $p1y = $y00+$h00-$d1-$brbgBR_V; $p1c2y = $p1y + ($d2+$brbgBR_V)*$mag; + $p2x = $x00+$w00; // control point only matches p4 preceding + $p2y = $y00+$h00-$d1-$brbgBR_V; $p2c2y = $p2y + ($d1+$brbgBR_V)*$mag; + $p3x = $x00+$w00-$d1-$brbgBR_H; $p3c1x = $p3x + ($d1+$brbgBR_H)*$mag; + $p3y = $y00+$h00; $p3c2y = $p3y - $bl/2; + $p4x = $x00+$w00-$d1-$brbgBR_H; $p4c2x = $p4x + ($d2+$brbgBR_H)*$mag; + $p4y = $y00+$h00-$bl; + + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p1y = $y00+$h00-$bl; $p1c2y = $p1y; + $p2y = $y00+$h00-$bl; $p2c2y = $p2y + $bl*$mag2; + $p3x = $x00+$w00-$bl; $p3c1x = $p3x + $bl*$mag2; + $p4x = $x00+$w00-$bl; $p4c2x = $p4x; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x)*_MPDFK, ($this->h-($p1c2y))*_MPDFK, ($p4c2x)*_MPDFK, ($this->h-($p4y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[2]['f']=2; + $patch_array[2]['points']=array($p2x,$p2c2y, + $p3c1x,$p3y, $p3x,$p3y, $p3x,$p3c2y, + $p4x,$p4y, $p4x,$p4y, $p4c2x,$p4y, + $p1x,$p1c2y); + $patch_array[2]['colors'] = array($col2,$col1); + + + + // BOTTOM + $p1x = $x00+$w00-$d1-$brbgBR_H; // control point only matches p3 preceding + $p1y = $y00+$h00; + $p2x = $x00+$w00-$d1-$brbgBR_H; // control point only matches p4 preceding + $p2y = $y00+$h00-$bl; + $p3x = $x00+$d1+$brbgBL_H; + $p3y = $y00+$h00-$bl; + $p4x = $x00+$d1+$brbgBL_H; + $p4y = $y00+$h00; $p4c1y = $p4y - $bl/2; + + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p1x = $x00+$w00-$bl; + $p2x = $x00+$w00-$bl; + } + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p3x = $x00+$bl; + $p4x = $x00+$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[3]['f']=2; + $patch_array[3]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4x,$p4c1y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[3]['colors'] = array($col1,$col2); + + // BOTTOM LEFT corner + $p1x = $x00+$d1+$brbgBL_H; $p1c2x = $p1x - ($d2+$brbgBL_H)*$mag; // control points only matches p3 preceding + $p1y = $y00+$h00-$bl; + $p2x = $x00+$d1+$brbgBL_H; $p2c2x = $p2x - ($d1+$brbgBL_H)*$mag; // control point only matches p4 preceding + $p2y = $y00+$h00; + $p3x = $x00; $p3c2x = $p3x + $bl/2; + $p3y = $y00+$h00-$d1-$brbgBL_V; $p3c1y = $p3y + ($d1+$brbgBL_V)*$mag; + $p4x = $x00+$bl; + $p4y = $y00+$h00-$d1-$brbgBL_V; $p4c2y = $p4y + ($d2+$brbgBL_V)*$mag; + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p1x = $x00+$bl; $p1c2x = $p1x; + $p2x = $x00+$bl; $p2c2x = $p2x - $bl*$mag2; + $p3y = $y00+$h00-$bl; $p3c1y = $p3y + $bl*$mag2; + $p4y = $y00+$h00-$bl; $p4c2y = $p4y; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x)*_MPDFK, ($this->h-($p1y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4c2y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[4]['f']=2; + $patch_array[4]['points']=array($p2c2x,$p2y, + $p3x,$p3c1y, $p3x,$p3y, $p3c2x,$p3y, + $p4x,$p4y, $p4x,$p4y, $p4x,$p4c2y, + $p1c2x,$p1y); + $patch_array[4]['colors'] = array($col2,$col1); + + + // LEFT - joins on the right (C3-C4 of previous): f = 2 + $p1x = $x00; // control point only matches p3 preceding + $p1y = $y00+$h00-$d1-$brbgBL_V; + $p2x = $x00+$bl; // control point only matches p4 preceding + $p2y = $y00+$h00-$d1-$brbgBL_V; + $p3x = $x00+$bl; + $p3y = $y00+$d1+$brbgTL_V; + $p4x = $x00; $p4c1x = $p4x + $bl/2; + $p4y = $y00+$d1+$brbgTL_V; + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p1y = $y00+$h00-$bl; + $p2y = $y00+$h00-$bl; + } + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p3y = $y00+$bl; + $p4y = $y00+$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[5]['f']=2; + $patch_array[5]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4c1x,$p4y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[5]['colors'] = array($col1,$col2); + + // TOP LEFT corner + $p1x = $x00+$bl; // control points only matches p3 preceding + $p1y = $y00+$d1+$brbgTL_V; $p1c2y = $p1y - ($d2+$brbgTL_V)*$mag; + $p2x = $x00; // control point only matches p4 preceding + $p2y = $y00+$d1+$brbgTL_V; $p2c2y = $p2y - ($d1+$brbgTL_V)*$mag; + $p3x = $x00+$d1+$brbgTL_H; $p3c1x = $p3x - ($d1+$brbgTL_H)*$mag; + $p3y = $y00; $p3c2y = $p3y + $bl/2; + $p4x = $x00+$d1+$brbgTL_H; $p4c2x = $p4x - ($d2+$brbgTL_H)*$mag; + $p4y = $y00+$bl; + + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p1y = $y00+$bl; $p1c2y = $p1y; + $p2y = $y00+$bl; $p2c2y = $p2y - $bl*$mag2; + $p3x = $x00+$bl; $p3c1x = $p3x - $bl*$mag2; + $p4x = $x00+$bl; $p4c2x = $p4x ; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x)*_MPDFK, ($this->h-($p1c2y))*_MPDFK, ($p4c2x)*_MPDFK, ($this->h-($p4y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[6]['f']=2; + $patch_array[6]['points']=array($p2x,$p2c2y, + $p3c1x,$p3y, $p3x,$p3y, $p3x,$p3c2y, + $p4x,$p4y, $p4x,$p4y, $p4c2x,$p4y, + $p1x,$p1c2y); + $patch_array[6]['colors'] = array($col2,$col1); + + + // TOP - joins on the right (C3-C4 of previous): f = 2 + $p1x = $x00+$d1+$brbgTL_H; // control point only matches p3 preceding + $p1y = $y00; + $p2x = $x00+$d1+$brbgTL_H; // control point only matches p4 preceding + $p2y = $y00+$bl; + $p3x = $x00+$w00-$d1-$brbgTR_H; + $p3y = $y00+$bl; + $p4x = $x00+$w00-$d1-$brbgTR_H; + $p4y = $y00; $p4c1y = $p4y + $bl/2; + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p1x = $x00+$bl; + $p2x = $x00+$bl; + } + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p3x = $x00+$w00-$bl; + $p4x = $x00+$w00-$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[7]['f']=2; + $patch_array[7]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4x,$p4c1y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[7]['colors'] = array($col1,$col2); + + $shadow .= ' h f Q '."\n"; // Close path and Fill the inner solid shadow + + if ($bl) $shadow .= $this->grad->CoonsPatchMesh($x00,$y00,$w00,$h00,$patch_array,$x00,$x00+$w00,$y00,$y00+$h00, $colspace, true); + + if ($sh['x'] || $sh['y']) $shadow .= ' Q'."\n"; // Shadow Offset + $shadow .= ' Q'."\n"; // Ends path no-op & Sets the clipping path + + } + } + + $s .= ' W n '; // Ends path no-op & Sets the clipping path + + if ($this->blk[$blvl]['bgcolor']) { + $this->pageBackgrounds[$blvl][] = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h, 'col'=>$this->blk[$blvl]['bgcolorarray'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'shadow'=>$shadow, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + else if ($shadow) { + $this->pageBackgrounds[$blvl][] = array('shadowonly'=>true, 'col'=>'', 'clippath'=>'', 'visibility'=>$this->visibility, 'shadow'=>$shadow, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + +/*-- BACKGROUNDS --*/ + if (isset($this->blk[$blvl]['gradient'])) { + $g = $this->grad->parseBackgroundGradient($this->blk[$blvl]['gradient']); + if ($g) { + $gx = $x0; + $gy = $y0; + $this->pageBackgrounds[$blvl][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$w, 'h'=>$h, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + } + if (isset($this->blk[$blvl]['background-image'])) { + if ($this->blk[$blvl]['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->blk[$blvl]['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $this->blk[$blvl]['background-image']['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y0; + // mPDF 5.6.11 + // origin specifies the background-positioning-area (bpa) + if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { + $gx += $this->blk[$blvl]['border_left']['w']; + $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $gy += $this->blk[$blvl]['border_top']['w']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $gy1 = $y1 - $this->blk[$blvl]['border_bottom']['w']; + } + else { $gy1 = $y1; } + $h = $gy1 - $gy; + } + else if ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { + $gx += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $gy += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $gy1 = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); + } + else { $gy1 = $y1 - $this->blk[$blvl]['padding_bottom']; } + $h = $gy1 - $gy; + } + + if (isset($this->blk[$blvl]['background-image']['size']['w']) && $this->blk[$blvl]['background-image']['size']['w']) { + $size = $this->blk[$blvl]['background-image']['size']; + if ($size['w']!='contain' && $size['w']!='cover') { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $w *= $size['w']; + } + else if ($size['w']!='auto') { + $w = $size['w']; + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $h *= $size['h']; + } + else if ($size['h']!='auto') { + $h = $size['h']; + } + } + } + $this->pageBackgrounds[$blvl][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$w, 'h'=>$h, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + } + else { + $image_id = $this->blk[$blvl]['background-image']['image_id']; + $orig_w = $this->blk[$blvl]['background-image']['orig_w']; + $orig_h = $this->blk[$blvl]['background-image']['orig_h']; + $x_pos = $this->blk[$blvl]['background-image']['x_pos']; + $y_pos = $this->blk[$blvl]['background-image']['y_pos']; + $x_repeat = $this->blk[$blvl]['background-image']['x_repeat']; + $y_repeat = $this->blk[$blvl]['background-image']['y_repeat']; + $resize = $this->blk[$blvl]['background-image']['resize']; + $opacity = $this->blk[$blvl]['background-image']['opacity']; + $itype = $this->blk[$blvl]['background-image']['itype']; + $size = $this->blk[$blvl]['background-image']['size']; // mPDF 5.6.10 + // mPDF 5.6.10 + // origin specifies the background-positioning-area (bpa) + $bpa = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h); + if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { + $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w']; + $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w']; + } + else { $bpa['y'] = $y0; } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bpay = $y1 - $this->blk[$blvl]['border_bottom']['w']; + } + else { $bpay = $y1; } + $bpa['h'] = $bpay - $bpa['y']; + } + // mPDF 5.6.09 + else if ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { + $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + else { $bpa['y'] = $y0 + $this->blk[$blvl]['padding_top']; } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bpay = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); + } + else { $bpay = $y1 - $this->blk[$blvl]['padding_bottom']; } + $bpa['h'] = $bpay - $bpa['y']; + } + $this->pageBackgrounds[$blvl][] = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer, 'size'=>$size, 'bpa'=>$bpa ); // mPDF 5.6.01 5.6.10 + } + } +/*-- END BACKGROUNDS --*/ + + // Float DIV + $this->blk[$blvl]['bb_painted'][$this->page] = true; + +} + +/*-- BORDER-RADIUS --*/ + +function _EllipseArc($x0, $y0, $rx, $ry, $seg = 1, $part=false, $start=false) { // Anticlockwise segment 1-4 TR-TL-BL-BR (part=1 or 2) + $s = ''; + if ($rx<0) { $rx = 0; } + if ($ry<0) { $ry = 0; } + $rx *= _MPDFK; + $ry *= _MPDFK; + $astart = 0; + if ($seg == 1) { // Top Right + $afinish = 90; + $nSeg = 4; + } + else if ($seg == 2) { // Top Left + $afinish = 180; + $nSeg = 8; + } + else if ($seg == 3) { // Bottom Left + $afinish = 270; + $nSeg = 12; + } + else { // Bottom Right + $afinish = 360; + $nSeg = 16; + } + $astart = deg2rad((float) $astart); + $afinish = deg2rad((float) $afinish); + $totalAngle = $afinish - $astart; + $dt = $totalAngle / $nSeg; // segment angle + $dtm = $dt/3; + $x0 *= _MPDFK; + $y0 = ($this->h - $y0) * _MPDFK; + $t1 = $astart; + $a0 = $x0 + ($rx * cos($t1)); + $b0 = $y0 + ($ry * sin($t1)); + $c0 = -$rx * sin($t1); + $d0 = $ry * cos($t1); + $op = false; + for ($i = 1; $i <= $nSeg; $i++) { + // Draw this bit of the total curve + $t1 = ($i * $dt) + $astart; + $a1 = $x0 + ($rx * cos($t1)); + $b1 = $y0 + ($ry * sin($t1)); + $c1 = -$rx * sin($t1); + $d1 = $ry * cos($t1); + if ($i>($nSeg-4) && (!$part || ($part == 1 && $i<=$nSeg-2) || ($part == 2 && $i>$nSeg-2))) { + if ($start && !$op) { + $s .= sprintf('%.3F %.3F m ', $a0, $b0); + } + $s .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($a0 + ($c0 * $dtm)), ($b0 + ($d0 * $dtm)), ($a1 - ($c1 * $dtm)) , ($b1 - ($d1 * $dtm)), $a1 , $b1 ); + $op = true; + } + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + return $s; +} +/*-- END BORDER-RADIUS --*/ + + + +function PaintDivLnBorder($state=0,$blvl=0,$h) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h; + + $save_y = $this->y; + + $w = $this->blk[$blvl]['width']; + $x0 = $this->x; // left + $y0 = $this->y; // top + $x1 = $this->x + $w; // bottom + $y1 = $this->y + $h; // bottom + + if ($this->blk[$blvl]['border_top'] && ($state==1 || $state==3)) { + $tbd = $this->blk[$blvl]['border_top']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + $this->y = $y0 + ($tbd['w']/2); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->_setDashBorder($tbd['style'],'',$continuingpage,'T'); + $this->Line($x0 + ($tbd['w']/2) , $this->y , $x0 + $w - ($tbd['w']/2), $this->y); + } + else { + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0, $this->y , $x0 + $w, $this->y); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_left']) { + $tbd = $this->blk[$blvl]['border_left']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->y = $y0 + ($tbd['w']/2); + $this->_setDashBorder($tbd['style'],'',$continuingpage,'L'); + $this->Line($x0 + ($tbd['w']/2), $this->y, $x0 + ($tbd['w']/2), $y0 + $h -($tbd['w']/2)); + } + else { + $this->y = $y0; + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0 + ($tbd['w']/2), $this->y, $x0 + ($tbd['w']/2), $y0 + $h); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_right']) { + $tbd = $this->blk[$blvl]['border_right']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->y = $y0 + ($tbd['w']/2); + $this->_setDashBorder($tbd['style'],'',$continuingpage,'R'); + $this->Line($x0 + $w - ($tbd['w']/2), $this->y, $x0 + $w - ($tbd['w']/2), $y0 + $h - ($tbd['w']/2)); + } + else { + $this->y = $y0; + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0 + $w - ($tbd['w']/2), $this->y, $x0 + $w - ($tbd['w']/2), $y0 + $h); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_bottom'] && $state > 1) { + $tbd = $this->blk[$blvl]['border_bottom']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + $this->y = $y0 + $h - ($tbd['w']/2); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->_setDashBorder($tbd['style'],'',$continuingpage,'B'); + $this->Line($x0 + ($tbd['w']/2) , $this->y, $x0 + $w - ($tbd['w']/2), $this->y); + } + else { + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0, $this->y, $x0 + $w, $this->y); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + $this->SetDash(); + $this->y = $save_y; +} + + +function PaintImgBorder($objattr,$is_table) { + // Borders are disabled in columns - messes up the repositioning in printcolumnbuffer + if ($this->ColActive) { return ; } // *COLUMNS* + if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } + $h = (isset($objattr['BORDER-HEIGHT']) ? $objattr['BORDER-HEIGHT'] : 0); + $w = (isset($objattr['BORDER-WIDTH']) ? $objattr['BORDER-WIDTH'] : 0); + $x0 = (isset($objattr['BORDER-X']) ? $objattr['BORDER-X'] : 0); + $y0 = (isset($objattr['BORDER-Y']) ? $objattr['BORDER-Y'] : 0); + + // BORDERS + if ($objattr['border_top']) { + $tbd = $objattr['border_top']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','T'); } + $this->Line($x0, $y0, $x0 + $w, $y0); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_left']) { + $tbd = $objattr['border_left']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','L'); } + $this->Line($x0, $y0, $x0, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_right']) { + $tbd = $objattr['border_right']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','R'); } + $this->Line($x0 + $w, $y0, $x0 + $w, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_bottom']) { + $tbd = $objattr['border_bottom']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','B'); } + $this->Line($x0, $y0 + $h, $x0 + $w, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + $this->SetDash(); + $this->SetAlpha(1); +} + +/*-- END HTML-CSS --*/ + + + + +function Reset() { + $this->SetTColor($this->ConvertColor(0)); + $this->SetDColor($this->ConvertColor(0)); + $this->SetFColor($this->ConvertColor(255)); + $this->SetAlpha(1); + $this->colorarray = ''; + + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + + $this->ResetStyles(); + + $this->HREF = ''; + $this->textparam = array(); + $this->SetTextOutline(); + + $this->SUP = false; + $this->SUB = false; + $this->strike = false; + $this->textshadow = ''; + + $this->SetFont($this->default_font,'',0,false); + $this->SetFontSize($this->default_font_size,false); + + $this->currentfontfamily = ''; + $this->currentfontsize = ''; + +/*-- TABLES --*/ + if ($this->tableLevel) { + $this->SetLineHeight('',$this->table_lineheight); // *TABLES* + } + else +/*-- END TABLES --*/ +/*-- LISTS --*/ + + if ($this->listlvl && $this->list_lineheight[$this->listlvl][$this->bulletarray['occur']]) { + $this->SetLineHeight('',$this->list_lineheight[$this->listlvl][$this->bulletarray['occur']]); // sets default line height + } + else +/*-- END LISTS --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + $this->SetLineHeight('',$this->blk[$this->blklvl]['line_height']); // sets default line height + } + + $this->toupper = false; + $this->tolower = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + $this->capitalize = false; + $this->SetDash(); //restore to no dash + $this->dash_on = false; + $this->dotted_on = false; + $this->divwidth = 0; + $this->divheight = 0; + $this->divalign = ''; + $this->divrevert = false; + $this->oldy = -1; + + $bodystyle = array(); + if (isset($this->cssmgr->CSS['BODY']['FONT-STYLE'])) { $bodystyle['FONT-STYLE'] = $this->cssmgr->CSS['BODY']['FONT-STYLE']; } + if (isset($this->cssmgr->CSS['BODY']['FONT-WEIGHT'])) { $bodystyle['FONT-WEIGHT'] = $this->cssmgr->CSS['BODY']['FONT-WEIGHT']; } + if (isset($this->cssmgr->CSS['BODY']['COLOR'])) { $bodystyle['COLOR'] = $this->cssmgr->CSS['BODY']['COLOR']; } + if (isset($bodystyle)) { $this->setCSS($bodystyle,'BLOCK','BODY'); } + +} + +/*-- HTML-CSS --*/ +function ReadMetaTags($html) { + // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) + $regexp = '/ (\\w+?)=([^\\s>"]+)/si'; + $html = preg_replace($regexp," \$1=\"\$2\"",$html); + if (preg_match('/(.*?)<\/title>/si',$html,$m)) { + $this->SetTitle($m[1]); + } + preg_match_all('/<meta [^>]*?(name|content)="([^>]*?)" [^>]*?(name|content)="([^>]*?)".*?>/si',$html,$aux); + $firstattr = $aux[1]; + $secondattr = $aux[3]; + for( $i = 0 ; $i < count($aux[0]) ; $i++) { + + $name = ( strtoupper($firstattr[$i]) == "NAME" )? strtoupper($aux[2][$i]) : strtoupper($aux[4][$i]); + $content = ( strtoupper($firstattr[$i]) == "CONTENT" )? $aux[2][$i] : $aux[4][$i]; + switch($name) { + case "KEYWORDS": $this->SetKeywords($content); break; + case "AUTHOR": $this->SetAuthor($content); break; + case "DESCRIPTION": $this->SetSubject($content); break; + } + } +} + + +function ReadCharset($html) { + // Charset conversion + if ($this->allow_charset_conversion) { + if (preg_match('/<head.*charset=([^\'\"\s]*).*<\/head>/si',$html,$m)) { + if (strtoupper($m[1]) != 'UTF-8') { + $this->charset_in = strtoupper($m[1]); + } + } + } +} + +function setCSS($arrayaux,$type='',$tag='') { // type= INLINE | BLOCK | LIST // tag= BODY + if (!is_array($arrayaux)) return; //Removes PHP Warning + // Set font size first so that e.g. MARGIN 0.83em works on font size for this element + if (isset($arrayaux['FONT-SIZE'])) { + $v = $arrayaux['FONT-SIZE']; + if(is_numeric($v[0])) { + if ($type == 'BLOCK' && $this->blklvl>0 && isset($this->blk[$this->blklvl-1]['InlineProperties']) && isset($this->blk[$this->blklvl-1]['InlineProperties']['size'])) { + $mmsize = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['InlineProperties']['size']); + } + else { + $mmsize = $this->ConvertSize($v,$this->FontSize); + } + $this->SetFontSize( $mmsize*(_MPDFK),false ); //Get size in points (pt) + } + else{ + $v = strtoupper($v); + if (isset($this->fontsizes[$v])) { + $this->SetFontSize( $this->fontsizes[$v]* $this->default_font_size,false); + } + } + if ($tag == 'BODY') { $this->SetDefaultFontSize($this->FontSizePt); } + } + + + if ($this->useLang && !$this->usingCoreFont) { + if (isset($arrayaux['LANG']) && $arrayaux['LANG'] && $arrayaux['LANG'] != $this->default_lang && ((strlen($arrayaux['LANG']) == 5 && $arrayaux['LANG'] != 'UTF-8') || strlen($arrayaux['LANG']) == 2)) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($arrayaux['LANG'], $this->useAdobeCJK); + if ($mpdf_pdf_unifonts) { $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); } + else { $this->RestrictUnicodeFonts($this->default_available_fonts ); } + if ($tag == 'BODY') { + $this->currentLang = $arrayaux['LANG']; + $this->default_lang = $arrayaux['LANG']; + if ($mpdf_pdf_unifonts) { $this->default_available_fonts = $mpdf_pdf_unifonts; } + } + } + else { + $this->RestrictUnicodeFonts($this->default_available_fonts ); + } + } + + // FOR INLINE and BLOCK OR 'BODY' + if (isset($arrayaux['FONT-FAMILY'])) { + $v = $arrayaux['FONT-FAMILY']; + //If it is a font list, get all font types + $aux_fontlist = explode(",",$v); + $found = 0; + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } + if ((!$this->onlyCoreFonts && in_array($v,$this->available_unifonts)) || + in_array($v,array('ccourier','ctimes','chelvetica')) || + ($this->onlyCoreFonts && in_array($v,array('courier','times','helvetica','arial'))) || + in_array($v, array('sjis','uhc','big5','gb'))) { + $fonttype = $v; + $found = 1; + break; + } + } + if (!$found) { + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } + if (in_array($v,$this->sans_fonts) || in_array($v,$this->serif_fonts) || in_array($v,$this->mono_fonts) ) { + $fonttype = $v; + break; + } + } + } + + if ($tag == 'BODY') { + $this->SetDefaultFont($fonttype); + } + $this->SetFont($fonttype,$this->currentfontstyle,0,false); + } + else { + $this->SetFont($this->currentfontfamily,$this->currentfontstyle,0,false); + } + + foreach($arrayaux as $k => $v) { + if ($type != 'INLINE' && $tag != 'BODY' && $type != 'LIST') { + switch($k){ + // BORDERS + case 'BORDER-TOP': + $this->blk[$this->blklvl]['border_top'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_top']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-BOTTOM': + $this->blk[$this->blklvl]['border_bottom'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_bottom']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-LEFT': + $this->blk[$this->blklvl]['border_left'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_left']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-RIGHT': + $this->blk[$this->blklvl]['border_right'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_right']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + + // PADDING + case 'PADDING-TOP': + $this->blk[$this->blklvl]['padding_top'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-BOTTOM': + $this->blk[$this->blklvl]['padding_bottom'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-LEFT': + $this->blk[$this->blklvl]['padding_left'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-RIGHT': + $this->blk[$this->blklvl]['padding_right'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + + // MARGINS + case 'MARGIN-TOP': + $tmp = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + if (isset($this->blk[$this->blklvl]['lastbottommargin'])) { + if ($tmp > $this->blk[$this->blklvl]['lastbottommargin']) { + $tmp -= $this->blk[$this->blklvl]['lastbottommargin']; + } + else { + $tmp = 0; + } + } + $this->blk[$this->blklvl]['margin_top'] = $tmp; + break; + case 'MARGIN-BOTTOM': + $this->blk[$this->blklvl]['margin_bottom'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'MARGIN-LEFT': + $this->blk[$this->blklvl]['margin_left'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'MARGIN-RIGHT': + $this->blk[$this->blklvl]['margin_right'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + +/*-- BORDER-RADIUS --*/ + case 'BORDER-TOP-LEFT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_TL_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-LEFT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_TL_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-RIGHT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_TR_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-RIGHT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_TR_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-LEFT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_BL_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-LEFT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_BL_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-RIGHT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_BR_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-RIGHT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_BR_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; +/*-- END BORDER-RADIUS --*/ + + case 'BOX-SHADOW': + $bs = $this->cssmgr->setCSSboxshadow($v); + if ($bs) { $this->blk[$this->blklvl]['box_shadow'] = $bs; } + break; + + case 'BACKGROUND-CLIP': + if (strtoupper($v) == 'PADDING-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'padding-box'; } + else if (strtoupper($v) == 'CONTENT-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'content-box'; } // mPDF 5.6.09 + break; + + case 'PAGE-BREAK-AFTER': + if (strtoupper($v) == 'AVOID') { $this->blk[$this->blklvl]['page_break_after_avoid'] = true; } + else if (strtoupper($v) == 'ALWAYS' || strtoupper($v) == 'LEFT' || strtoupper($v) == 'RIGHT') { $this->blk[$this->blklvl]['page_break_after'] = strtoupper($v) ; } + break; + + case 'WIDTH': + if (strtoupper($v) != 'AUTO') { + $this->blk[$this->blklvl]['css_set_width'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + } + break; + + case 'TEXT-INDENT': + // Left as raw value (may include 1% or 2em) + $this->blk[$this->blklvl]['text_indent'] = $v; + break; + + }//end of switch($k) + } + + + if ($type != 'INLINE' && $type != 'LIST') { // includes BODY tag + switch($k){ + + case 'MARGIN-COLLAPSE': // Custom tag to collapse margins at top and bottom of page + if (strtoupper($v) == 'COLLAPSE') { $this->blk[$this->blklvl]['margin_collapse'] = true; } + break; + + case 'LINE-HEIGHT': + $this->blk[$this->blklvl]['line_height'] = $this->fixLineheight($v); + if (!$this->blk[$this->blklvl]['line_height'] ) { $this->blk[$this->blklvl]['line_height'] = $this->normalLineheight; } + break; + + case 'TEXT-ALIGN': //left right center justify + switch (strtoupper($v)) { + case 'LEFT': + $this->blk[$this->blklvl]['align']="L"; + break; + case 'CENTER': + $this->blk[$this->blklvl]['align']="C"; + break; + case 'RIGHT': + $this->blk[$this->blklvl]['align']="R"; + break; + case 'JUSTIFY': + $this->blk[$this->blklvl]['align']="J"; + break; + } + break; + +/*-- BACKGROUNDS --*/ + case 'BACKGROUND-GRADIENT': + if ($type == 'BLOCK') { + $this->blk[$this->blklvl]['gradient'] = $v; + } + break; +/*-- END BACKGROUNDS --*/ + + case 'DIRECTION': + if ($v) { $this->blk[$this->blklvl]['direction'] = strtolower($v); } + break; + + }//end of switch($k) + } + + // FOR INLINE ONLY + if ($type == 'INLINE' || $type == 'LIST') { + switch($k){ + case 'DISPLAY': // Custom tag to collapse margins at top and bottom of page + if (strtoupper($v) == 'NONE') { $this->inlineDisplayOff = true; } + break; + case 'DIRECTION': + break; + }//end of switch($k) + } + // FOR INLINE ONLY + if ($type == 'INLINE') { + switch($k){ + // BORDERS + case 'BORDER-TOP': + $this->spanborddet['T'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-BOTTOM': + $this->spanborddet['B'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-LEFT': + $this->spanborddet['L'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-RIGHT': + $this->spanborddet['R'] = $this->border_details($v); + $this->spanborder = true; + break; + // mPDF 5.6.26 + case 'VISIBILITY': // block is set in OpenTag + $v = strtolower($v); + if ($v == 'visible' || $v == 'hidden' || $v == 'printonly' || $v == 'screenonly') { + $this->textparam['visibility'] = $v; + } + break; + }//end of switch($k) + } + + + // FOR INLINE and BLOCK + switch($k){ + case 'TEXT-ALIGN': //left right center justify + if (strtoupper($v) == 'NOJUSTIFY' && $this->blk[$this->blklvl]['align']=="J") { + $this->blk[$this->blklvl]['align']=""; + } + break; + // bgcolor only - to stay consistent with original html2fpdf + case 'BACKGROUND': + case 'BACKGROUND-COLOR': + $cor = $this->ConvertColor($v); + if ($cor) { + if ($tag == 'BODY') { + $this->bodyBackgroundColor = $cor; + } + else if ($type == 'INLINE' || $type == 'LIST') { + $this->spanbgcolorarray = $cor; + $this->spanbgcolor = true; + } + else { + $this->blk[$this->blklvl]['bgcolorarray'] = $cor; + $this->blk[$this->blklvl]['bgcolor'] = true; + } + } + else if ($type != 'INLINE' && $type != 'LIST') { + if ($this->ColActive || $this->keep_block_together) { + $this->blk[$this->blklvl]['bgcolorarray'] = $this->blk[$this->blklvl-1]['bgcolorarray'] ; + $this->blk[$this->blklvl]['bgcolor'] = $this->blk[$this->blklvl-1]['bgcolor'] ; + } + } + break; + + // auto | normal | none + case 'FONT-KERNING': + if ((strtoupper($v) == 'NORMAL' || strtoupper($v) == 'AUTO') && $this->useKerning) { $this->kerning = true; } + else if (strtoupper($v) == 'NONE') { $this->kerning = false; } + break; + + + // normal | <length> + case 'LETTER-SPACING': + $this->lSpacingCSS = $v; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + break; + + // normal | <length> + case 'WORD-SPACING': + $this->wSpacingCSS = $v; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + break; + + case 'FONT-STYLE': // italic normal oblique + switch (strtoupper($v)) { + case 'ITALIC': + case 'OBLIQUE': + $this->SetStyle('I',true); + break; + case 'NORMAL': + $this->SetStyle('I',false); + break; + } + break; + + case 'FONT-WEIGHT': // normal bold //Does not support: bolder, lighter, 100..900(step value=100) + switch (strtoupper($v)) { + case 'BOLD': + $this->SetStyle('B',true); + break; + case 'NORMAL': + $this->SetStyle('B',false); + break; + } + break; + + case 'VERTICAL-ALIGN': //super and sub only dealt with here e.g. <SUB> and <SUP> + switch (strtoupper($v)) { + case 'SUPER': + $this->SUP=true; + $this->SUB=false; // mPDF 5.6.07 + break; + case 'SUB': + $this->SUB=true; + $this->SUP=false; // mPDF 5.6.07 + break; + case 'BASELINE': // mPDF 5.6.07 + $this->SUB=false; + $this->SUP=false; + break; + } + break; + + case 'TEXT-DECORATION': // none underline line-through (strikeout) //Does not support: overline, blink + if (stristr($v,'LINE-THROUGH')) { + $this->strike = true; + } + else if (stristr($v,'UNDERLINE')) { + $this->SetStyle('U',true); + } + else if (stristr($v,'NONE')) { + $this->SetStyle('U',false); + $this->strike = false; // mPDF 5.6.07 + } + break; + + case 'FONT-VARIANT': + switch (strtoupper($v)) { + case 'SMALL-CAPS': + $this->SetStyle('S',true); + break; + case 'NORMAL': + $this->SetStyle('S',false); + break; + } + break; + + case 'TEXT-TRANSFORM': // none uppercase lowercase //Does support: capitalize + switch (strtoupper($v)) { //Not working 100% + case 'CAPITALIZE': + $this->capitalize=true; + break; + case 'UPPERCASE': + $this->toupper=true; + break; + case 'LOWERCASE': + $this->tolower=true; + break; + case 'NONE': break; + } + break; + + case 'TEXT-SHADOW': + $ts = $this->cssmgr->setCSStextshadow($v); + if ($ts) { $this->textshadow = $ts; } + break; + + case 'HYPHENS': // mPDF 5.6.08 + if (strtoupper($v)=='NONE') { + $this->textparam['hyphens'] = 2; + } + else if (strtoupper($v)=='AUTO') { + $this->textparam['hyphens'] = 1; + } + else if (strtoupper($v)=='MANUAL') { + $this->textparam['hyphens'] = 0; + } + break; + + case 'TEXT-OUTLINE': // mPDF 5.6.07 + if (strtoupper($v)=='NONE') { + $this->textparam['outline-s'] = false; + } + break; + + case 'TEXT-OUTLINE-WIDTH': // mPDF 5.6.07 + case 'OUTLINE-WIDTH': + switch(strtoupper($v)) { + case 'THIN': $v = '0.03em'; break; + case 'MEDIUM': $v = '0.05em'; break; + case 'THICK': $v = '0.07em'; break; + } + $w = $this->ConvertSize($v,$this->blk[$this->blklvl]['inner_width'],$this->FontSize); + if ($w) { + $this->textparam['outline-WIDTH'] = $w; + $this->textparam['outline-s'] = true; + } + else { $this->textparam['outline-s'] = false; } + break; + + case 'TEXT-OUTLINE-COLOR': // mPDF 5.6.07 + case 'OUTLINE-COLOR': + if (strtoupper($v) == 'INVERT') { + if ($this->colorarray) { + $cor = $this->colorarray; + $this->textparam['outline-COLOR'] = $this->_invertColor($cor); + } + else { + $this->textparam['outline-COLOR'] = $this->ConvertColor(255); + } + } + else { + $cor = $this->ConvertColor($v); + if ($cor) { $this->textparam['outline-COLOR'] = $cor ; } + } + break; + + case 'COLOR': // font color + $cor = $this->ConvertColor($v); + if ($cor) { + $this->colorarray = $cor; + $this->SetTColor($cor); + } + break; + + + }//end of switch($k) + + + }//end of foreach +} + +/*-- END HTML-CSS --*/ + + +function SetStyle($tag,$enable) { + $this->$tag=$enable; + $style=''; + foreach(array('B','I','U','S') as $s) { + if($this->$s) { + $style.=$s; + } + } + if ($this->S && empty($this->upperCase)) { @include(_MPDF_PATH.'includes/upperCase.php'); } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +// Set multiple styles at one $str e.g. "BIS" +function SetStylesArray($arr) { + $style=''; + foreach(array('B','I','U','S') as $s) { + if (isset($arr[$s])) { + if ($arr[$s]) { + $this->$s = true; + $style.=$s; + } + else { $this->$s = false; } + } + else if ($this->$s) { $style.=$s; } + } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +// Set multiple styles at one $str e.g. "BIS" +function SetStyles($str) { + $style=''; + foreach(array('B','I','U','S') as $s) { + if (strpos($str,$s) !== false) { + $this->$s = true; + $style.=$s; + } + else { $this->$s = false; } + } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +function ResetStyles() { + foreach(array('B','I','U','S') as $s) { + $this->$s = false; + } + $this->currentfontstyle=''; + $this->SetFont('','',0,false); +} + + +function DisableTags($str='') +{ + if ($str == '') //enable all tags + { + //Insert new supported tags in the long string below. + $this->enabledtags = "<span><s><strike><del><bdo><big><small><ins><cite><acronym><font><sup><sub><b><u><i><a><strong><em><code><samp><tt><kbd><var><q><table><thead><tfoot><tbody><tr><th><td><ol><ul><li><dl><dt><dd><form><input><select><textarea><option><div><p><h1><h2><h3><h4><h5><h6><pre><center><blockquote><address><hr><img><br><indexentry><indexinsert><bookmark><watermarktext><watermarkimage><tts><ttz><tta><column_break><columnbreak><newcolumn><newpage><page_break><pagebreak><formfeed><columns><toc><tocentry><tocpagebreak><pageheader><pagefooter><setpageheader><setpagefooter><sethtmlpageheader><sethtmlpagefooter><annotation><template><jpgraph><barcode><dottab><caption><textcircle><fieldset><legend><article><aside><figure><figcaption><footer><header><hgroup><nav><section><mark><details><summary><meter><progress><time>"; // mPDF 5.5.09 + } + else + { + $str = explode(",",$str); + foreach($str as $v) $this->enabledtags = str_replace(trim($v),'',$this->enabledtags); + } +} + + +/*-- TABLES --*/ + +function finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight) { + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + if ($lhxt['BS']) { + $af = max($af, ($lhxt['BS'] - ($maxfontsize * (0.5 + $this->baselineC)))); + } + if ($lhxt['M']) { + $af = max($af, ($lhxt['M'] - $maxfontsize)/2); + $bf = max($bf, ($lhxt['M'] - $maxfontsize)/2); + } + if ($lhxt['TT']) { + $bf = max($bf, ($lhxt['TT'] - $maxfontsize)); + } + if ($lhxt['TB']) { + $af = max($af, ($lhxt['TB'] - $maxfontsize)); + } + if ($lhxt['T']) { + $mta = max($mta, $lhxt['T']); + } + if ($lhxt['B']) { + $mba = max($mba, $lhxt['B']); + } + if ((!$lhfixed || !$forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + return $maxlineHeight; +} + +function TableWordWrap($maxwidth, $forcewrap = 0, $textbuffer = '', $def_fontsize, $returnarray=false) { // NB ** returnarray used in flowchart + $biggestword=0; + $toonarrow=false; + + $textbuffer[0][0] = preg_replace('/^[ ]*/','',$textbuffer[0][0]); + if ((count($textbuffer) == 0) or ((count($textbuffer) == 1) && ($textbuffer[0][0] == ''))) { return 0; } + + $text = ''; + $lhfixed = false; + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight)) { $lhfixed = true; } + if ($lhfixed) { $def_lineheight = $this->_computeLineheight($this->table_lineheight, $def_fontsize);} + else { $def_lineheight = 0; } + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ch = 0; + $width = 0; + $ln = 1; // Counts line number + $mxw = $this->GetCharWidth('W',false); + for($cctr=0;$cctr<count($textbuffer);$cctr++) { // mPDF 5.6.22 + $chunk = $textbuffer[$cctr]; // mPDF 5.6.22 + $line = $chunk[0]; + //IMAGE + if (substr($line,0,3) == "\xbb\xa4\xac") { //identifier has been identified! + $objattr = $this->_getObjAttr($line); + if ($objattr['type'] == 'nestedtable') { + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + $level = $objattr['level']; + $ih = $this->table[($level+1)][$objattr['nestedcontent']]['h']; // nested table width + $ch += $ih; + // START OF NEW LINE + // Initialise lineheight variables + $ln++; + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $width = 0; + $text = ""; + continue; + } + + list($skipln,$iw,$ih) = $this->inlineObject((isset($specialcontent['type']) ? $specialcontent['type'] : null),0,0, $objattr, $this->lMargin,$width,$maxwidth,$maxlineHeight,false,true); + if ($objattr['type'] == 'hr') { + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // Add HR height + $ch += $ih; + // START OF NEW LINE + // Initialise lineheight variables + $ln++; + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $width = 0; + $text = ""; + continue; + } + + if ($skipln==1 || $skipln==-2) { + // Finish last line + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ln++; + $width = 0; + $text = ""; + } + $va = (isset($objattr['vertical-align']) ? $objattr['vertical-align'] : null); + if ($va) { + $lhxt[$va] = max($lhxt[$va], $ih); + } + if ($lhfixed && $ih > $def_fontsize) { $forceExactLineheight = false; } + $maxlineHeight = max($maxlineHeight ,$ih); + $width += $iw; + continue; + } + + // SET FONT SIZE/STYLE from $chunk[n] + // FONTSIZE + if(isset($chunk[11]) and $chunk[11] != '') { + if ($this->shrin_k) { + $this->SetFontSize($chunk[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($chunk[11],false); + } + } + if ($line == "\n") { + // END OF LINE + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $text = ""; + $width = 0; + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + continue; + } + + $lbw = $rbw = 0; // Border widths + if(isset($chunk[16]) && !empty($chunk[16])) { //Border + $this->spanborddet = $chunk[16]; + if (isset($this->spanborddet['L'])) $lbw = $this->spanborddet['L']['w']; + if (isset($this->spanborddet['R'])) $rbw = $this->spanborddet['R']['w']; + } + if(isset($chunk[15])) { // Word spacing + $this->wSpacingCSS = $chunk[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[14])) { // Letter spacing + $this->lSpacingCSS = $chunk[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[13])) { // Font Kerning + $this->kerning = $chunk[13]; + } + if(isset($chunk[9])) { // Text params - Outline, hyphens // mPDF 5.6.08 + $this->textparam = $chunk[9]; + } + // FONTFAMILY + if(isset($chunk[4]) and $chunk[4] != '') { $font = $this->SetFont($chunk[4],$this->FontStyle,0,false); } + + // FONT STYLE B I U + if(isset($chunk[2]) and $chunk[2] != '') { + $this->SetStyles($chunk[2]); + } + + $space = $this->GetCharWidth(' ',false); + + if (mb_substr($line,0,1,$this->mb_enc ) == ' ') { // line (chunk) starts with a space + $width += $space; + $text .= ' '; + } + + if (mb_substr($line,(mb_strlen($line,$this->mb_enc )-1),1,$this->mb_enc ) == ' ') { $lsend = true; } // line (chunk) ends with a space + else { $lsend = false; } + $line= trim($line); + if ($line == '') { continue; } + + // mPDF ITERATION + if ($this->iterationCounter) $line = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/','\\1', $line); + + $words = explode(' ', $line); + + foreach ($words as $k=>$word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + if ($k==0) { $wordwidth += $lbw; } + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + //maxwidth is insufficient for one word + if ($wordwidth > $maxwidth + 0.0001) { + $firstchunk=true; + while($wordwidth > $maxwidth + 0.0001) { + $chw = 0; // check width + $oneCJKorphan = false; + $mlen = mb_strlen($word, $this->mb_enc ); + for ( $i = 0; $i < $mlen; $i++ ) { + $chw = $this->GetStringWidth(mb_substr($word,0,$i+1,$this->mb_enc )); + if ($k==0) { $chw += $lbw; } + if ($k==(count($words)-1)) { $chw += $rbw; } + if ($chw > $maxwidth) { + if ($i==0 && $firstchunk) { + // If first letter of line does not fit + $wordwidth = $maxwidth - 0.0001; + if ($this->debug) { $this->Error("Table cell width calculated less than that needed for one character!"); } + break; + } +/*-- CJK-FONTS --*/ + // mPDF 5.6.40 mPDF 5.6.44 + if ($this->checkCJK && !$this->usingCoreFont && preg_match("/[".$this->pregCJKchars."]/u", $word)) { // mPDF 5.6.44 + if (!$oneCJKorphan && preg_match('/['.$this->CJKoverflow.']$/u',mb_substr($word,0,$i+1,$this->mb_enc )) && $this->allowCJKorphans) { + $wordwidth = $maxwidth - 0.0001; + $oneCJKorphan = true; + continue; + } + $cjkfix = 0; + // Last character that fits is not allowed to end a line - move lastchar(s) to start of next line + if ($i>0 && preg_match("/[".$this->CJKleading."$]/u", mb_substr($word,0,$i,$this->mb_enc ))) { + $cjkfix = 1; + } + // Next character is not allowed to start a new line + else if (preg_match("/[".$this->CJKfollowing."]/u", mb_substr($word,$i,1,$this->mb_enc ))) { + // try squeezing another character(s) onto this line = Oikomi + if ($this->allowCJKorphans && !$oneCJKorphan) { + //if lookahead is not another following char + if ($i==($mlen-1) || ($i<($mlen-1) && !preg_match("/[".$this->CJKfollowing."]/u", mb_substr($word,$i+1,1,$this->mb_enc )))) { + $wordwidth = $maxwidth - 0.0001; + $oneCJKorphan = true; + continue; + } + } + // or move lastchar(s) to next line + $cjkfix = 2; + } + // mPDF 5.6.42 + // CJK numerals kept together + else if (preg_match("/([".$this->pregCJKchars."]+[0-9\x{ff10}-\x{ff19}]+$)/u", mb_substr($word,0,$i,$this->mb_enc )) && preg_match("/^([0-9\x{ff10}-\x{ff19}]+[".$this->pregCJKchars."]+)/u", mb_substr($word,$i,16,$this->mb_enc ))) { + $cjkfix = 3; + } + if ($cjkfix) { + //move lastchar(s) to next line + $m0 = mb_substr($word,$i-1,1,$this->mb_enc ); // chars to move + $m1 = mb_substr($word,0,$i-1,$this->mb_enc ); // str after stripped chars to move + $mi = $i - 1; + if ($cjkfix == 3) { $match = "0-9\x{ff10}-\x{ff19}"; } + else { $match = $this->CJKleading; } + while(preg_match("/[".$match."$]/u", $m1) && mb_strlen($m1, $this->mb_enc)>2) { + $m0 = mb_substr($m1,$mi-1,1,$this->mb_enc ).$m0; // chars to move + $m1 = mb_substr($m1,0,$mi-1,$this->mb_enc ); // str after stripped chars to move + $mi--; + } + // Insert $m0 into $word at $i + $word = mb_substr($word,0,$i,$this->mb_enc ) . $m0 . mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $mlen = mb_strlen($word, $this->mb_enc ); // increment max for loop counter + } + + + + } +/*-- END CJK-FONTS --*/ + + if ($text && $firstchunk) { + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + } + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $mxw = $maxwidth; + $text = mb_substr($word,0,$i,$this->mb_enc ); + $word = mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $wordwidth = $this->GetStringWidth($word); + $width = 0; + $firstchunk=false; + break; + } + } + if (mb_strlen($word, $this->mb_enc )<2 && $wordwidth > $maxwidth + 0.0001) { + $wordwidth = $maxwidth - 0.0001; + if ($this->debug) { $this->Error("Table cell width calculated less than that needed for single character!"); } + } + $firstchunk=false; + } + } + // Word fits on line... + if ($width + $wordwidth < $maxwidth + 0.0001) { + $mxw = max($mxw, ($width+$wordwidth)); + $width += $wordwidth + $space; + $text .= $word.' '; + } + // Word does not fit on line... + else { + // mPDF 5.6.21 hard hyphens + if ($this->textparam['hyphens'] != 2 && preg_match('/\-/',$word)) { + list($hardsuccess,$pre,$post,$prelength) = $this->hardHyphenate($word, ($maxwidth - $width)-$this->GetCharWidth("-", false)); + if ($hardsuccess) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } +/*-- HYPHENATION --*/ + // Soft Hyphens chr(173) + else if ($this->textparam['hyphens'] != 2 && (!$this->usingCoreFont && preg_match("/\xc2\xad/",$word)) || ($this->usingCoreFont && preg_match("/".chr(173)."/",$word) && ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats')) ) { // mPDF 5.6.06 5.6.08 + list($success,$pre,$post,$prelength) = $this->softHyphenate($word, ($maxwidth - $width)); + if ($success) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } + else if ($this->textparam['hyphens'] == 1) { // mPDF 5.6.06 5.6.08 + list($success,$pre,$post,$prelength) = $this->hyphenateWord($word, ($maxwidth - $width)); + if ($success) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } +/*-- END HYPHENATION --*/ + + + // mPDF 5.6.22 + if ( count($textbuffer)>1 && $cctr > 0 && $k==0 + && (substr($textbuffer[$cctr][0],0,3) != "\xbb\xa4\xac") + && (substr($textbuffer[$cctr-1][0],0,3) != "\xbb\xa4\xac") + && substr($textbuffer[$cctr-1][0],-1,1) != ' ' + && substr($textbuffer[$cctr][0],0,1) != ' ' + ) { + // Go back to find a space in a previous chunk of content + $found = false; + for ($ix=$cctr-1;$ix>=0;$ix--) { + if (preg_match('/[ ]/',$textbuffer[$ix][0])) { $found = $ix; break; } + } + if ($found !== false) { + $charpos = strrpos($textbuffer[$found][0],' '); + // mPDF 5.6.24 + $a1 = $a2 = $textbuffer[$found]; + $a1[0] = "\n"; + $a2[0] = substr($textbuffer[$found][0], $charpos+1, strlen($textbuffer[$found][0])-$charpos); + $textbuffer[$found][0] = substr($textbuffer[$found][0], 0, $charpos); + array_insert($textbuffer, $a1, $found+1); + array_insert($textbuffer, $a2, $found+2); + // Initialise all variables + $biggestword=0; + $toonarrow=false; + $lhfixed = false; + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight)) { $lhfixed = true; } + if ($lhfixed) { $def_lineheight = $this->_computeLineheight($this->table_lineheight, $def_fontsize);} + else { $def_lineheight = 0; } + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ch = 0; + $width = 0; + $ln = 1; // Counts line number + $mxw = $this->GetCharWidth('W',false); + $text = ''; + + $cctr = -1; + break; + } + } + + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + $mxw = $maxwidth; + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $width = $wordwidth + $space; + $text = $word.' '; + } + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + } + + // End of textbuffer chunk + if (!$lsend) { + $width -= $space; + $text = rtrim($text); + } + + // RESET FONT SIZE/STYLE + // RESETTING VALUES + //Now we must deactivate what we have used + if(isset($chunk[2]) and $chunk[2] != '') { + $this->ResetStyles(); + } + if(isset($chunk[4]) and $chunk[4] != '') { + $this->SetFont($this->default_font,$this->FontStyle,0,false); + } + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + $this->spanborddet = array(); + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + } + // Finalise lineheight if something output on line and add + if ($width) { + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + } + if ($returnarray) { return array($ch,$ln,$mxw); } + else { return $ch; } + +} + + +function TableCheckMinWidth($maxwidth, $forcewrap = 0, $textbuffer) { + $biggestword=0; + $toonarrow=false; + if ((count($textbuffer) == 0) or ((count($textbuffer) == 1) && ($textbuffer[0][0] == ''))) { return 0; } + + foreach ($textbuffer as $chunk) { + + $line = $chunk[0]; + // mPDF ITERATION + if ($this->iterationCounter) $line = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/','\\1', $line); + + // IMAGES & FORM ELEMENTS + if (substr($line,0,3) == "\xbb\xa4\xac") { //inline object - FORM element or IMAGE! + $objattr = $this->_getObjAttr($line); + if ($objattr['type']!='hr' && isset($objattr['width']) && ($objattr['width']/$this->shrin_k) > ($maxwidth + 0.0001) ) { + if (($objattr['width']/$this->shrin_k) > $biggestword) { $biggestword = ($objattr['width']/$this->shrin_k); } + $toonarrow=true; + } + continue; + } + + if ($line == "\n") { + continue; + } + $line = trim($line ); + // SET FONT SIZE/STYLE from $chunk[n] + + // FONTSIZE + if(isset($chunk[11]) and $chunk[11] != '') { + if ($this->shrin_k) { + $this->SetFontSize($chunk[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($chunk[11],false); + } + } + // FONTFAMILY + if(isset($chunk[4]) and $chunk[4] != '') { $font = $this->SetFont($chunk[4],$this->FontStyle,0,false); } + // B I U + if(isset($chunk[2]) and $chunk[2] != '') { + $this->SetStyles($chunk[2]); + } + + $lbw = $rbw = 0; // Border widths + if(isset($chunk[16]) && !empty($chunk[16])) { //Border + $this->spanborddet = $chunk[16]; + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if(isset($chunk[15])) { // Word spacing + $this->wSpacingCSS = $chunk[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[14])) { // Letter spacing + $this->lSpacingCSS = $chunk[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[13])) { // Font Kerning + $this->kerning = $chunk[13]; + } + + $words = explode(' ', $line); + foreach ($words as $k=>$word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + if ($k==0) { $wordwidth += $lbw; } + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + + //Warn user that maxwidth is insufficient + if ($wordwidth > $maxwidth + 0.0001) { + if ($wordwidth > $biggestword) { $biggestword = $wordwidth; } + $toonarrow=true; + } + } + + // RESET FONT SIZE/STYLE + // RESETTING VALUES + //Now we must deactivate what we have used + if(isset($chunk[2]) and $chunk[2] != '') { + $this->ResetStyles(); + } + if(isset($chunk[4]) and $chunk[4] != '') { + $this->SetFont($this->default_font,$this->FontStyle,0,false); + } + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + $this->spanborddet = array(); + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + } + + //Return -(wordsize) if word is bigger than maxwidth + // ADDED + if (($toonarrow) && ($this->table_error_report)) { + $this->Error("Word is too long to fit in table - ".$this->table_error_report_param); + } + if ($toonarrow) return -$biggestword; + else return 1; +} + +function shrinkTable(&$table,$k) { + $table['border_spacing_H'] /= $k; + $table['border_spacing_V'] /= $k; + + $table['padding']['T'] /= $k; + $table['padding']['R'] /= $k; + $table['padding']['B'] /= $k; + $table['padding']['L'] /= $k; + + $table['margin']['T'] /= $k; + $table['margin']['R'] /= $k; + $table['margin']['B'] /= $k; + $table['margin']['L'] /= $k; + + $table['border_details']['T']['w'] /= $k; + $table['border_details']['R']['w'] /= $k; + $table['border_details']['B']['w'] /= $k; + $table['border_details']['L']['w'] /= $k; + + if (isset($table['max_cell_border_width']['T'])) $table['max_cell_border_width']['T'] /= $k; + if (isset($table['max_cell_border_width']['R'])) $table['max_cell_border_width']['R'] /= $k; + if (isset($table['max_cell_border_width']['B'])) $table['max_cell_border_width']['B'] /= $k; + if (isset($table['max_cell_border_width']['L'])) $table['max_cell_border_width']['L'] /= $k; + + if ($this->simpleTables){ + $table['simple']['border_details']['T']['w'] /= $k; + $table['simple']['border_details']['R']['w'] /= $k; + $table['simple']['border_details']['B']['w'] /= $k; + $table['simple']['border_details']['L']['w'] /= $k; + } + + $table['miw'] /= $k; + $table['maw'] /= $k; + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + + for($j = 0 ; $j < $table['nc'] ; $j++ ) { //columns + + $table['wc'][$j]['miw'] /= $k; + $table['wc'][$j]['maw'] /= $k; + + // mPDF 5.6.13 + if (isset($table['decimal_align'][$j]['maxs0']) && $table['decimal_align'][$j]['maxs0']) { $table['decimal_align'][$j]['maxs0'] /= $k; } + if (isset($table['decimal_align'][$j]['maxs1']) && $table['decimal_align'][$j]['maxs1']) { $table['decimal_align'][$j]['maxs1'] /= $k; } + + if (isset($table['wc'][$j]['absmiw']) && $table['wc'][$j]['absmiw'] ) $table['wc'][$j]['absmiw'] /= $k; + + for($i = 0 ; $i < $table['nr']; $i++ ) { //rows + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$table['cells'][$i][$j]; + if (isset($c) && $c) { + if (!$this->simpleTables){ + if ($this->packTableData) { + $cell = $this->_unpackCellBorder($c['borderbin'] ); + $cell['border_details']['T']['w'] /= $k; + $cell['border_details']['R']['w'] /= $k; + $cell['border_details']['B']['w'] /= $k; + $cell['border_details']['L']['w'] /= $k; + $cell['border_details']['mbw']['TL'] /= $k; + $cell['border_details']['mbw']['TR'] /= $k; + $cell['border_details']['mbw']['BL'] /= $k; + $cell['border_details']['mbw']['BR'] /= $k; + $cell['border_details']['mbw']['LT'] /= $k; + $cell['border_details']['mbw']['LB'] /= $k; + $cell['border_details']['mbw']['RT'] /= $k; + $cell['border_details']['mbw']['RB'] /= $k; + $c['borderbin'] = $this->_packCellBorder($cell); + } + else { + $c['border_details']['T']['w'] /= $k; + $c['border_details']['R']['w'] /= $k; + $c['border_details']['B']['w'] /= $k; + $c['border_details']['L']['w'] /= $k; + $c['border_details']['mbw']['TL'] /= $k; + $c['border_details']['mbw']['TR'] /= $k; + $c['border_details']['mbw']['BL'] /= $k; + $c['border_details']['mbw']['BR'] /= $k; + $c['border_details']['mbw']['LT'] /= $k; + $c['border_details']['mbw']['LB'] /= $k; + $c['border_details']['mbw']['RT'] /= $k; + $c['border_details']['mbw']['RB'] /= $k; + } + } + $c['padding']['T'] /= $k; + $c['padding']['R'] /= $k; + $c['padding']['B'] /= $k; + $c['padding']['L'] /= $k; + $c['maxs'] /= $k; + if (isset($c['w'])) { $c['w'] /= $k; } + $c['s'] /= $k; + $c['maw'] /= $k; + $c['miw'] /= $k; + if (isset($c['absmiw'])) $c['absmiw'] /= $k; + if (isset($c['nestedmaw'])) $c['nestedmaw'] /= $k; + if (isset($c['nestedmiw'])) $c['nestedmiw'] /= $k; + if (isset($c['textbuffer'])) { + foreach($c['textbuffer'] AS $n=>$tb) { + if (!empty($tb[16])) { + $c['textbuffer'][$n][16]['T']['w'] /= $k; + $c['textbuffer'][$n][16]['B']['w'] /= $k; + $c['textbuffer'][$n][16]['L']['w'] /= $k; + $c['textbuffer'][$n][16]['R']['w'] /= $k; + } + } + } + if ($this->cacheTables) { + $this->_cacheCell($c, '', "W", $fh, $table['cells'][$i][$j]); + } + unset($c); + } + }//rows + }//columns + if ($this->cacheTables) { fclose($fh); } +} + +function _cacheCell($c, $file, $mode="A", $fh=null, $offset=0) { // mode = Append or (over)Write (needs offset and fh) + // Requires either $file OR $fh (file_handle) + if (!is_array($c) || !isset($c)) { return ''; } + + if(isset($c['w'])) { $cw = $c['w']; } else { $cw = -1; } + if(isset($c['w0'])) { $cw0 = $c['w0']; } else { $cw0 = -1; } + if(isset($c['h0'])) { $ch0 = $c['h0']; } else { $ch0 = -1; } + + $data = pack("n2d19A1A1n2sA32A128", + $c['colspan'], /* n (16 bit; 2 bytes) [pos 0] */ + $c['rowspan'], /* n (16 bit; 2 bytes) [pos 2] */ + $c['s'], /* d NB machine-dependent size (64 bit; 8 bytes on test winOS) [pos 4] */ + $c['maxs'], /* d NB machine-dependent size [pos 4 + 1*D] */ + $c['nestedmaw'], /* d NB machine-dependent size [pos 4 + 2*D] */ + $c['nestedmiw'], /* d NB machine-dependent size [pos 4 + 3*D] */ + $c['padding']['L'], /* d NB machine-dependent size [pos 4 + 4*D] */ + $c['padding']['R'], /* d NB machine-dependent size [pos 4 + 5*D] */ + $c['padding']['T'], /* d NB machine-dependent size [pos 4 + 6*D] */ + $c['padding']['B'], /* d NB machine-dependent size [pos 4 + 7*D] */ + $c['dfs'], /* d NB machine-dependent size [pos 4 + 8*D] */ + $cw, /* d NB machine-dependent size [pos 4 + 9*D] */ + $c['h'], /* d NB machine-dependent size [pos 4 + 10*D] */ + $c['absmiw'], /* d NB machine-dependent size [pos 4 + 11*D] */ + $c['maw'], /* d NB machine-dependent size [pos 4 + 12*D] */ + $c['miw'], /* d NB machine-dependent size [pos 4 + 13*D] */ + $c['mih'], /* d NB machine-dependent size [pos 4 + 14*D] */ + $c['x0'], /* d NB machine-dependent size [pos 4 + 15*D] */ + $cw0, /* d NB machine-dependent size [pos 4 + 16*D] */ + $c['y0'], /* d NB machine-dependent size [pos 4 + 17*D] */ + $ch0, /* d NB machine-dependent size [pos 4 + 18*D] */ + $c['a'], /* A1 (1 byte) [pos 4 + 19*D] */ + $c['va'], /* A1 (1 byte) [pos 5 + 19*D] */ + $c['nowrap'], /* 1 or blank n (16 bit; 2 bytes) [pos 6 + 19*D] */ + $c['wpercent'], /* 0 - 100 n (16 bit; 2 bytes) [pos 8 + 19*D] */ + $c['R'], /* 90 or -90 s (16 bit; 2 bytes) [pos 10 + 19*D] */ + $c['bgcolor'], /* A32 (32 bytes) [pos 12 + 19*D] */ + $c['gradient'] /* A128 (128 bytes) [pos 44 + 19*D] */ + ); + + if ($c['background-image']) { + $data .= pack("n2d2A6A6n3dA4A128", + strlen($data), /* offset in main data to start of bgimage data */ + $c['background-image']['image_id'], /* n */ + $c['background-image']['orig_w'], /* d NB machine-dependent size */ + $c['background-image']['orig_h'], /* d NB machine-dependent size */ + $c['background-image']['x_pos'], /* A6 calc size or "50%" */ + $c['background-image']['y_pos'], /* A6 calc size or "50%" */ + $c['background-image']['x_repeat'], /* n true or false*/ + $c['background-image']['y_repeat'], /* n true or false */ + $c['background-image']['resize'], /* n 0 - 6 */ + $c['background-image']['opacity'], /* d 0-1 */ + $c['background-image']['itype'], /* A4 jpg etc */ + $c['background-image']['gradient'] /* A128 CSS string */ + ); + } + else $data .= pack("n",0); + $tb_offset = 2 + 186 + 2 + strlen($data); + $stb = serialize($c['textbuffer']).' '; // buffer to allow updating in reverseTableDir + $lentb = strlen($stb); + $data2 = pack("nA".$lentb, $lentb, $stb); + + $tempfh = true; + if ($mode=="W" && $offset) { + if (!$fh) { $fh = fopen($file, "r+b"); } // Overwrite (but not truncate) + else $tempfh = false; + fseek($fh, $offset); + } + else { + $fh = fopen($file, "ab"); // APPEND + } + fwrite($fh, pack("n",$tb_offset)); // Offset to Text buffer 2 bytes + fwrite($fh, $c['borderbin']); // border details 186 bytes + fwrite($fh, pack("n",strlen($data))); // Length of Main data + fwrite($fh, $data); // Main data + fwrite($fh, $data2); // Text buffer (starts with "n" length of text buffer) + if ($tempfh) fclose($fh); + return ($tb_offset + 2 + $lentb); +} + +function _cacheUpdateTxB($c, $fh, $offset) { + fseek($fh, $offset); + $tb_offset = $this->read_short($fh); // First entry = Offset to Text buffer 2 bytes + fseek($fh, ($tb_offset-2), SEEK_CUR); + $lentb = $this->read_short($fh); // First entry in textbuffer = Length of serialized textbuffer - do not update + $stb = serialize($c['textbuffer']); + fwrite($fh, pack("A".$lentb, $stb)); +} + +function _cacheUpdateBorder($c, $fh, $offset) { + $offset += 2; + fseek($fh, $offset); + fwrite($fh, $c['borderbin']); +} + +function _cacheUpdateMtx($c, $fh, $offset, $var) { + if ($var=='mih') { $offset += (2 + 186 + 2 + 4 + 14*_DSIZE); } + else if ($var=='x0') { $offset += (2 + 186 + 2 + 4 + 15*_DSIZE); } // x0 and w0 + else if ($var=='y0') { $offset += (2 + 186 + 2 + 4 + 17*_DSIZE); } // y0 and h0 + fseek($fh, $offset); + if ($var=='mih') { fwrite($fh, pack("d",$c['mih'])); } + else if ($var=='x0') { fwrite($fh, pack("d2",$c['x0'],$c['w0'])); } + else if ($var=='y0') { fwrite($fh, pack("d2",$c['y0'],$c['h0'])); } +} + +function _uncacheCell($ptr, $file, $fh) { + // Requires either $file or $fh (file_handle) + if ($ptr==0) { return null; } + if (is_array($ptr)) { $this->Error("Probable cause - missing end tag </td>. You may be able to change the configurable variable: allow_html_optional_endtags "); } + $tempfh = true; + if (!$fh) { $fh = fopen($file, "rb"); } + else $tempfh = false; + fseek($fh, $ptr); + $c = array(); + $tb_offset = $this->read_short($fh); // First entry = Offset to Text buffer 2 bytes + $c['borderbin'] = fread($fh,186); // border details 186 bytes + $maindatalen = $this->read_short($fh); // Length of Main data (2 bytes) + $str = fread($fh,$maindatalen ); // Main data + $data = unpack("ncolspan/nrowspan/ds/dmaxs/dnmaw/dnmiw/dpl/dpr/dpt/dpb/ddfs/dw/dh/dabsmiw/dmaw/dmiw/dmih/dx0/dw0/dy0/dh0/A1a/A1va/nnowrap/nwpercent/sR/A32bgcol/A128grad/nbgimage", $str); + + if ($data['colspan']>0) $c['colspan'] = $data['colspan']; /* n */ + if ($data['rowspan']>0) $c['rowspan'] = $data['rowspan']; /* n */ + $c['s'] = $data['s']; /* d NB machine-dependent size */ + $c['maxs'] = $data['maxs']; /* d NB machine-dependent size */ + if ($data['nmaw']>0) $c['nestedmaw'] = $data['nmaw']; /* d NB machine-dependent size */ + if ($data['nmiw']>0) $c['nestedmiw'] = $data['nmiw']; /* d NB machine-dependent size */ + $c['padding']['L'] = $data['pl']; /* d NB machine-dependent size */ + $c['padding']['R'] = $data['pr']; /* d NB machine-dependent size */ + $c['padding']['T'] = $data['pt']; /* d NB machine-dependent size */ + $c['padding']['B'] = $data['pb']; /* d NB machine-dependent size */ + $c['dfs'] = $data['dfs']; /* d NB machine-dependent size */ + if ($data['w']>=0) $c['w'] = $data['w']; /* d NB machine-dependent size */ + if ($data['h']>0) $c['h'] = $data['h']; /* d NB machine-dependent size */ + if ($data['absmiw']>0) $c['absmiw'] = $data['absmiw']; /* d NB machine-dependent size */ + if ($data['maw']>0) $c['maw'] = $data['maw']; /* d NB machine-dependent size */ + if ($data['miw']>0) $c['miw'] = $data['miw']; /* d NB machine-dependent size */ + if ($data['mih']>0) $c['mih'] = $data['mih']; /* d NB machine-dependent size */ + if ($data['w0']>=0) { $c['w0'] = $data['w0']; /* d NB machine-dependent size */ + $c['x0'] = $data['x0']; } /* d NB machine-dependent size */ + if ($data['h0']>=0) { $c['h0'] = $data['h0']; /* d NB machine-dependent size */ + $c['y0'] = $data['y0']; } /* d NB machine-dependent size */ + $c['a'] = trim($data['a']); /* A1 */ + $c['va'] = trim($data['va']); /* A1 */ + if ($data['nowrap']) $c['nowrap'] = $data['nowrap']; /* 1 or blank n */ + else $c['nowrap'] = false; + if ($data['wpercent']>0) $c['wpercent'] = $data['wpercent']; /* 0 - 100 n */ + if ($data['R']<>0) $c['R'] = $data['R']; /* 90 or -90 s */ + else $c['R'] = false; + $c['bgcolor'] = trim($data['bgcol']); /* A32 */ + if (trim($data['grad'])) + $c['gradient'] = trim($data['grad']); /* A128 */ + else $c['gradient'] = false; + if ($data['bgimage']>0) { + $bgidata = substr($str, ($data['bgimage']+2)); + $c['background-image'] = unpack("nimage_id/dorig_w/dorig_h/A6x_pos/A6y_pos/nx_repeat/ny_repeat/nresize/dopacity/A4itype/A128gradient", $bgidata); + } + + $tblen = $this->read_short($fh); // Length of Textbuffer + $tbsp = fread($fh,$tblen); // Textbuffer (serialised and packed) + $tbs = unpack("A".$tblen."textbuffer",$tbsp); // Textbuffer unpacked + $c['textbuffer'] = unserialize(trim($tbs['textbuffer'])); // Textbuffer unserialized + + if ($tempfh) { fclose($fh); } + return ($c); +} +function read_short(&$fh) { + $s = fread($fh,2); + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { + $a = ($a - (1 << 16)); + } + return $a; +} +function _backupCacheFiles() { + foreach($this->table AS $lvl=>$t) { + foreach($this->table[$lvl] AS $c=>$t2) { +///////////////////////////if (!file_exists($t2['cache'])) { echo $lvl; echo $c; print_r($this->table); exit; } + copy( $t2['cache'], $t2['cache'].'.bak'); + } + } +} +function _restoreCacheFiles() { + foreach($this->table AS $lvl=>$t) { + foreach($this->table[$lvl] AS $c=>$t2) { + copy( $t2['cache'].'.bak', $t2['cache']); + } + } +} + + +function _packCellBorder($cell) { + if (!is_array($cell) || !isset($cell)) { return ''; } + + if (!$this->packTableData) { return $cell; } + // = 186 bytes + $bindata = pack("nnda6A10nnda6A10nnda6A10nnda6A10nd9", + $cell['border'], + $cell['border_details']['R']['s'], + $cell['border_details']['R']['w'], + $cell['border_details']['R']['c'], + $cell['border_details']['R']['style'], + $cell['border_details']['R']['dom'], + + $cell['border_details']['L']['s'], + $cell['border_details']['L']['w'], + $cell['border_details']['L']['c'], + $cell['border_details']['L']['style'], + $cell['border_details']['L']['dom'], + + $cell['border_details']['T']['s'], + $cell['border_details']['T']['w'], + $cell['border_details']['T']['c'], + $cell['border_details']['T']['style'], + $cell['border_details']['T']['dom'], + + $cell['border_details']['B']['s'], + $cell['border_details']['B']['w'], + $cell['border_details']['B']['c'], + $cell['border_details']['B']['style'], + $cell['border_details']['B']['dom'], + + $cell['border_details']['mbw']['BL'], + $cell['border_details']['mbw']['BR'], + $cell['border_details']['mbw']['RT'], + $cell['border_details']['mbw']['RB'], + $cell['border_details']['mbw']['TL'], + $cell['border_details']['mbw']['TR'], + $cell['border_details']['mbw']['LT'], + $cell['border_details']['mbw']['LB'], + + $cell['border_details']['cellposdom'] + ); + return $bindata; +} + + + +function _getBorderWidths($bindata) { + if (!$bindata) { return array(0,0,0,0); } + if (!$this->packTableData) { return array($bindata['border_details']['T']['w'], $bindata['border_details']['R']['w'], $bindata['border_details']['B']['w'], $bindata['border_details']['L']['w']); } + + $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); + $cell['border_details']['R']['w'] = $bd['rw']; + $cell['border_details']['L']['w'] = $bd['lw']; + $cell['border_details']['T']['w'] = $bd['tw']; + $cell['border_details']['B']['w'] = $bd['bw']; + return array($bd['tw'], $bd['rw'], $bd['bw'], $bd['lw']); +} + + +function _unpackCellBorder($bindata) { + if (!$bindata) { return array(); } + if (!$this->packTableData) { return $bindata; } + + $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); + + $cell['border'] = $bd['bord']; + $cell['border_details']['R']['s'] = $bd['rs']; + $cell['border_details']['R']['w'] = $bd['rw']; + $cell['border_details']['R']['c'] = $bd['rca']; + $cell['border_details']['R']['style'] = trim($bd['rst']); + $cell['border_details']['R']['dom'] = $bd['rd']; + + $cell['border_details']['L']['s'] = $bd['ls']; + $cell['border_details']['L']['w'] = $bd['lw']; + $cell['border_details']['L']['c'] = $bd['lca']; + $cell['border_details']['L']['style'] = trim($bd['lst']); + $cell['border_details']['L']['dom'] = $bd['ld']; + + $cell['border_details']['T']['s'] = $bd['ts']; + $cell['border_details']['T']['w'] = $bd['tw']; + $cell['border_details']['T']['c'] = $bd['tca']; + $cell['border_details']['T']['style'] = trim($bd['tst']); + $cell['border_details']['T']['dom'] = $bd['td']; + + $cell['border_details']['B']['s'] = $bd['bs']; + $cell['border_details']['B']['w'] = $bd['bw']; + $cell['border_details']['B']['c'] = $bd['bca']; + $cell['border_details']['B']['style'] = trim($bd['bst']); + $cell['border_details']['B']['dom'] = $bd['bd']; + + $cell['border_details']['mbw']['BL'] = $bd['mbl']; + $cell['border_details']['mbw']['BR'] = $bd['mbr']; + $cell['border_details']['mbw']['RT'] = $bd['mrt']; + $cell['border_details']['mbw']['RB'] = $bd['mrb']; + $cell['border_details']['mbw']['TL'] = $bd['mtl']; + $cell['border_details']['mbw']['TR'] = $bd['mtr']; + $cell['border_details']['mbw']['LT'] = $bd['mlt']; + $cell['border_details']['mbw']['LB'] = $bd['mlb']; + $cell['border_details']['cellposdom'] = $bd['cpd']; + + return($cell); +} + + +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +//table Array of (w, h, bc, nr, wc, hr, cells) +//w Width of table +//h Height of table +//nc Number column +//nr Number row +//hr List of height of each row +//wc List of width of each column +//cells List of cells of each rows, cells[i][j] is a cell in the table +function _tableColumnWidth(&$table,$firstpass=false){ + $cs = &$table['cells']; + + $nc = $table['nc']; + $nr = $table['nr']; + $listspan = array(); + + if ($table['borders_separate']) { + $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; + } + else { $tblbw = $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2 + $table['margin']['L'] + $table['margin']['R']; } + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + // ADDED table['l'][colno] + // = total length of text approx (using $c['s']) in that column - used to approximately distribute col widths in _tableWidth + // + for($j = 0 ; $j < $nc ; $j++ ) { //columns + $wc = &$table['wc'][$j]; + for($i = 0 ; $i < $nr ; $i++ ) { //rows + if (isset($cs[$i][$j]) && $cs[$i][$j]) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cs[$i][$j]; + + if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $extrcw = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + } + else { + $extrcw = $table['simple']['border_details']['L']['w']/2 + $table['simple']['border_details']['R']['w']/2 + $c['padding']['L'] + $c['padding']['R']; + } + } + else { + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($table['borders_separate']) { // NB twice border width + $extrcw = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + } + else { + $extrcw = $bl/2 + $br/2 + $c['padding']['L'] + $c['padding']['R']; + } + } + + //$mw = $this->GetStringWidth('W') + $extrcw ; + $mw = 0; + // mPDF 5.6.13 Decimal point alignment + if(substr($c['a'],0,1) == 'D') { + $mw = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1'] + $extrcw ; + } + + $c['absmiw'] = $mw; + + if (isset($c['R']) && $c['R']) { + $c['maw'] = $c['miw'] = $this->FontSize + $extrcw ; + if (isset($c['w'])) { // If cell width is specified + if ($c['miw'] <$c['w']) { $c['miw'] = $c['w']; } + } + if (!isset($c['colspan'])) { + if ($wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } + if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } + + if ($firstpass) { + if (isset($table['l'][$j]) ) { + $table['l'][$j] += $c['miw'] ; + } + else { + $table['l'][$j] = $c['miw'] ; + } + } + } + if ($c['miw'] > $wc['miw']) { $wc['miw'] = $c['miw']; } + if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } + continue; + } + + if ($firstpass) { + if (isset($c['s'])) { $c['s'] += $extrcw; } + if (isset($c['maxs'])) { $c['maxs'] += $extrcw; } + if (isset($c['nestedmiw'])) { $c['nestedmiw'] += $extrcw; } + if (isset($c['nestedmaw'])) { $c['nestedmaw'] += $extrcw; } + } + + + // If minimum width has already been set by a nested table or inline object (image/form), use it + if (isset($c['nestedmiw']) && $this->table[1][1]['overflow']!='visible') { $miw = $c['nestedmiw']; } + else { $miw = $mw; } + + if (isset($c['maxs']) && $c['maxs'] != '') { $c['s'] = $c['maxs']; } + + // If maximum width has already been set by a nested table, use it + if (isset($c['nestedmaw'])) { $c['maw'] = $c['nestedmaw']; } + else $c['maw'] = $c['s']; + + if (isset($table['overflow']) && $table['overflow']=='visible' && $table['level']==1) { + if (($c['maw'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $c['maw'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; + } + } + + if (isset($c['nowrap']) && $c['nowrap']) { $miw = $c['maw']; } + + if (isset($c['wpercent']) && $firstpass) { + if (isset($c['colspan'])) { // Not perfect - but % set on colspan is shared equally on cols. + for($k=0;$k<$c['colspan'];$k++) { + $table['wc'][($j+$k)]['wpercent'] = $c['wpercent'] / $c['colspan']; + } + } + else { + if (isset($table['w']) && $table['w']) { $c['w'] = $c['wpercent']/100 * ($table['w'] - $tblbw ); } + $wc['wpercent'] = $c['wpercent']; + } + } + + if (isset($table['overflow']) && $table['overflow']=='visible' && $table['level']==1) { + if (($c['w'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $c['w'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; + } + } + + + if (isset($c['w'])) { // If cell width is specified + if ($miw<$c['w']) { $c['miw'] = $c['w']; } // Cell min width = that specified + if ($miw>$c['w']) { $c['miw'] = $c['w'] = $miw; } // If width specified is less than minimum allowed (W) increase it + if (!isset($wc['w'])) { $wc['w'] = 1; } // If the Col width is not specified = set it to 1 + + } + else { $c['miw'] = $miw; } // If cell width not specified -> set Cell min width it to minimum allowed (W) + + if ($c['maw'] < $c['miw']) { $c['maw'] = $c['miw']; } // If Cell max width < Minwidth - increase it to = + if (!isset($c['colspan'])) { + if ($wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } // Update Col Minimum and maximum widths + if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } + if ((isset($wc['absmiw']) && $wc['absmiw'] < $c['absmiw']) || !isset($wc['absmiw'])) { $wc['absmiw'] = $c['absmiw']; } // Update Col Minimum and maximum widths + + if (isset($table['l'][$j]) ) { + $table['l'][$j] += $c['s']; + } + else { + $table['l'][$j] = $c['s']; + } + + } + else { + $listspan[] = array($i,$j); + } + + //Check if minimum width of the whole column is big enough for largest word to fit + if (isset($c['textbuffer']) && (!isset($table['overflow']) || $table['overflow']!='wrap')) { // mPDF 5.5.11 + $minwidth = $this->TableCheckMinWidth($wc['miw']- $extrcw ,0,$c['textbuffer']); + } + else { $minwidth = 0; } + if ($minwidth < 0) { + //increase minimum width + if (!isset($c['colspan'])) { + $wc['miw'] = max($wc['miw'],((-$minwidth) + $extrcw) ); + } + else { + $c['miw'] = max($c['miw'],((-$minwidth) + $extrcw) ); + } + } + if (!isset($c['colspan'])) { + if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } //update maximum width, if needed + } + if ($this->cacheTables) { + $this->_cacheCell($c, '', "W", $fh, $table['cells'][$i][$j]); + } + } + unset($c); + }//rows + }//columns + + + // COLUMN SPANS + $wc = &$table['wc']; + foreach ($listspan as $span) { + list($i,$j) = $span; + if ($this->cacheTables) { + $c = $this->_uncacheCell($cs[$i][$j], '', $fh); + } + else + $c = &$cs[$i][$j]; + $lc = $j + $c['colspan']; + if ($lc > $nc) { $lc = $nc; } + $wis = $wisa = 0; + $was = $wasa = 0; + $list = array(); + for($k=$j;$k<$lc;$k++) { + if (isset($table['l'][$k]) ) { + if ($c['R']) { $table['l'][$k] += $c['miw']/$c['colspan'] ; } + else { $table['l'][$k] += $c['s']/$c['colspan']; } + } + else { + if ($c['R']) { $table['l'][$k] = $c['miw']/$c['colspan'] ; } + else { $table['l'][$k] = $c['s']/$c['colspan']; } + } + $wis += $wc[$k]['miw']; + $was += $wc[$k]['maw']; + if (!isset($c['w'])) { + $list[] = $k; + $wisa += $wc[$k]['miw']; + $wasa += $wc[$k]['maw']; + } + } + if ($c['miw'] > $wis) { + if (!$wis) { + for($k=$j;$k<$lc;$k++) { $wc[$k]['miw'] = $c['miw']/$c['colspan']; } + } + else if (!count($list)) { + $wi = $c['miw'] - $wis; + for($k=$j;$k<$lc;$k++) { $wc[$k]['miw'] += ($wc[$k]['miw']/$wis)*$wi; } + } + else { + $wi = $c['miw'] - $wis; + foreach ($list as $k) { $wc[$k]['miw'] += ($wc[$k]['miw']/$wisa)*$wi; } + } + } + if ($c['maw'] > $was) { + if (!$wis) { + for($k=$j;$k<$lc;$k++) { $wc[$k]['maw'] = $c['maw']/$c['colspan']; } + } + else if (!count($list)) { + $wi = $c['maw'] - $was; + for($k=$j;$k<$lc;$k++) { $wc[$k]['maw'] += ($wc[$k]['maw']/$was)*$wi; } + } + else { + $wi = $c['maw'] - $was; + foreach ($list as $k) { $wc[$k]['maw'] += ($wc[$k]['maw']/$wasa)*$wi; } + } + } + unset($c); + } + + if ($this->cacheTables) { fclose($fh); } + + $checkminwidth = 0; + $checkmaxwidth = 0; + $totallength = 0; + + for( $i = 0 ; $i < $nc ; $i++ ) { + $checkminwidth += $table['wc'][$i]['miw']; + $checkmaxwidth += $table['wc'][$i]['maw']; + $totallength += $table['l'][$i]; + } + + if (!isset($table['w']) && $firstpass) { + $sumpc = 0; + $notset = 0; + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent']) && $table['wc'][$i]['wpercent']) { + $sumpc += $table['wc'][$i]['wpercent']; + } + else { $notset++; } + } + + // If sum of widths as % >= 100% and not all columns are set + // Set a nominal width of 1% for unset columns + if ($sumpc >= 100 && $notset) { + for( $i = 0 ; $i < $nc ; $i++ ) { + if ((!isset($table['wc'][$i]['wpercent']) || !$table['wc'][$i]['wpercent']) && + (!isset($table['wc'][$i]['w']) || !$table['wc'][$i]['w'])) { + $table['wc'][$i]['wpercent'] = 1; + } + } + } + + + if ($sumpc) { // if any percents are set + $sumnonpc = (100 - $sumpc); + $sumpc = max($sumpc,100); + $miwleft = 0; + $miwleftcount = 0; + $miwsurplusnonpc = 0; + $maxcalcmiw = 0; + $mawleft = 0; + $mawleftcount = 0; + $mawsurplusnonpc = 0; + $maxcalcmaw = 0; + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $maxcalcmiw = max($maxcalcmiw, ($table['wc'][$i]['miw'] * $sumpc /$table['wc'][$i]['wpercent']) ); + $maxcalcmaw = max($maxcalcmaw, ($table['wc'][$i]['maw'] * $sumpc /$table['wc'][$i]['wpercent']) ); + } + else { + $miwleft += $table['wc'][$i]['miw']; + $mawleft += $table['wc'][$i]['maw']; + if (!isset($table['wc'][$i]['w'])) { $miwleftcount++; $mawleftcount++; } + } + } + if ($miwleft && $sumnonpc > 0) { $miwnon = $miwleft * 100 / $sumnonpc; } + if ($mawleft && $sumnonpc > 0) { $mawnon = $mawleft * 100 / $sumnonpc; } + if (($miwnon > $checkminwidth || $maxcalcmiw > $checkminwidth) && $this->keep_table_proportions) { + if ($miwnon > $maxcalcmiw) { + $miwsurplusnonpc = round((($miwnon * $sumnonpc / 100) - $miwleft),3); + $checkminwidth = $miwnon; + } + else { $checkminwidth = $maxcalcmiw; } + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $newmiw = $checkminwidth * $table['wc'][$i]['wpercent']/100; + if ($table['wc'][$i]['miw'] < $newmiw) { + $table['wc'][$i]['miw'] = $newmiw; + } + $table['wc'][$i]['w'] = 1; + } + else if ($miwsurplusnonpc && !$table['wc'][$i]['w']) { + $table['wc'][$i]['miw'] += $miwsurplusnonpc / $miwleftcount; + } + } + } + if (($mawnon > $checkmaxwidth || $maxcalcmaw > $checkmaxwidth )) { + if ($mawnon > $maxcalcmaw) { + $mawsurplusnonpc = round((($mawnon * $sumnonpc / 100) - $mawleft),3); + $checkmaxwidth = $mawnon; + } + else { $checkmaxwidth = $maxcalcmaw; } + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $newmaw = $checkmaxwidth * $table['wc'][$i]['wpercent']/100; + if ($table['wc'][$i]['maw'] < $newmaw) { + $table['wc'][$i]['maw'] = $newmaw; + } + $table['wc'][$i]['w'] = 1; + } + else if ($mawsurplusnonpc && !$table['wc'][$i]['w']) { + $table['wc'][$i]['maw'] += $mawsurplusnonpc / $mawleftcount; + } + if ($table['wc'][$i]['maw'] < $table['wc'][$i]['miw']) { $table['wc'][$i]['maw'] = $table['wc'][$i]['miw']; } + } + } + if ($checkminwidth > $checkmaxwidth) { $checkmaxwidth = $checkminwidth; } + } + } + + if (isset($table['wpercent']) && $table['wpercent']) { + $checkminwidth *= (100 / $table['wpercent']); + $checkmaxwidth *= (100 / $table['wpercent']); + } + + + $checkminwidth += $tblbw ; + $checkmaxwidth += $tblbw ; + + // Table['miw'] set by percent in first pass may be larger than sum of column miw + if ((isset($table['miw']) && $checkminwidth > $table['miw']) || !isset($table['miw'])) { $table['miw'] = $checkminwidth; } + if ((isset($table['maw']) && $checkmaxwidth > $table['maw']) || !isset($table['maw'])) { $table['maw'] = $checkmaxwidth; } + $table['tl'] = $totallength ; + + + if (!$this->tableCJK) { + if ($this->table_rotate) { + $mxw = $this->tbrot_maxw; + } + else { + $mxw = $this->blk[$this->blklvl]['inner_width']; + } + if(!isset($table['overflow'])) { $table['overflow'] = null; } + if ($table['overflow']=='visible') { + return array(0,0); + } + else if ($table['overflow']=='hidden' && !$this->table_rotate && !$this->ColActive && $checkminwidth > $mxw) { + $table['w'] = $table['miw']; + return array(0,0); + } + else if ($table['overflow']=='wrap') { return array(0,0); } + + if (isset($table['w']) && $table['w'] ) { + if ($table['w'] >= $checkminwidth && $table['w'] <= $mxw) { $table['maw'] = $mxw = $table['w']; } + else if ($table['w'] >= $checkminwidth && $table['w'] > $mxw && $this->keep_table_proportions) { $checkminwidth = $table['w']; } + else { + unset($table['w']); + } + } + $ratio = $checkminwidth/$mxw; + if ($checkminwidth > $mxw) { return array(($ratio +0.001),$checkminwidth); } // 0.001 to allow for rounded numbers when resizing + } + unset($cs); + return array(0,0); +} + + + +function _tableWidth(&$table){ + $widthcols = &$table['wc']; + $numcols = $table['nc']; + $tablewidth = 0; + if ($table['borders_separate']) { + $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; + } + else { $tblbw = $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2 + $table['margin']['L'] + $table['margin']['R']; } + + if ($table['level']>1 && isset($table['w'])) { + if (isset($table['wpercent']) && $table['wpercent']) { + $table['w'] = $temppgwidth = (($table['w']-$tblbw) * $table['wpercent'] / 100) + $tblbw ; + } + else { + $temppgwidth = $table['w'] ; + } + } + else if ($this->table_rotate) { + $temppgwidth = $this->tbrot_maxw; + // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) + // then allow for this + $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; + if ($enddiv/$temppgwidth <0.05) { $temppgwidth -= $enddiv; } + } + else { + if (isset($table['w']) && $table['w']< $this->blk[$this->blklvl]['inner_width']) { + $notfullwidth = 1; + $temppgwidth = $table['w'] ; + } + else if ($table['overflow']=='visible' && $table['level'] ==1) { + $temppgwidth = null; + } + else if ($table['overflow']=='hidden' && !$this->ColActive && isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width'] && $table['w']==$table['miw']) { + //$temppgwidth = $this->blk[$this->blklvl]['inner_width']; + $temppgwidth = $table['w'] ; + } + else { $temppgwidth = $this->blk[$this->blklvl]['inner_width']; } + } + + + $totaltextlength = 0; // Added - to sum $table['l'][colno] + $totalatextlength = 0; // Added - to sum $table['l'][colno] for those columns where width not set + $percentages_set = 0; + for ( $i = 0 ; $i < $numcols ; $i++ ) { + if (isset($widthcols[$i]['wpercent'])) { $tablewidth += $widthcols[$i]['maw']; $percentages_set = 1; } + else if (isset($widthcols[$i]['w'])) { $tablewidth += $widthcols[$i]['miw']; } + else { $tablewidth += $widthcols[$i]['maw']; } + $totaltextlength += $table['l'][$i]; + } + if (!$totaltextlength) { $totaltextlength =1; } + $tablewidth += $tblbw; // Outer half of table borders + + if ($tablewidth > $temppgwidth) { + $table['w'] = $temppgwidth; + } + // if any widths set as percentages and max width fits < page width + else if ($tablewidth < $temppgwidth && !isset($table['w']) && $percentages_set) { + $table['w'] = $table['maw']; + } + // if table width is set and is > allowed width + if (isset($table['w']) && $table['w'] > $temppgwidth) { $table['w'] = $temppgwidth; } + // IF the table width is now set - Need to distribute columns widths + if (isset($table['w'])) { + $wis = $wisa = 0; + $list = array(); + $notsetlist = array(); + for( $i = 0 ; $i < $numcols ; $i++ ) { + $wis += $widthcols[$i]['miw']; + if (!isset($widthcols[$i]['w']) || ($widthcols[$i]['w'] && $table['w'] > $temppgwidth && !$this->keep_table_proportions && !$notfullwidth )){ + $list[] = $i; + $wisa += $widthcols[$i]['miw']; + $totalatextlength += $table['l'][$i]; + } + } + if (!$totalatextlength) { $totalatextlength =1; } + + // Allocate spare (more than col's minimum width) across the cols according to their approx total text length + // Do it by setting minimum width here + if ($table['w'] > $wis + $tblbw) { + // First set any cell widths set as percentages + if ($table['w'] < $temppgwidth || $this->keep_table_proportions) { + for($k=0;$k<$numcols;$k++) { + if (isset($widthcols[$k]['wpercent'])) { + $curr = $widthcols[$k]['miw']; + $widthcols[$k]['miw'] = ($table['w']-$tblbw) * $widthcols[$k]['wpercent']/100; + $wis += $widthcols[$k]['miw'] - $curr; + $wisa += $widthcols[$k]['miw'] - $curr; + } + } + } + // Now allocate surplus up to maximum width of each column + $surplus = 0; $ttl = 0; // number of surplus columns + if (!count($list)) { + $wi = ($table['w']-($wis + $tblbw)); // i.e. extra space to distribute + for($k=0;$k<$numcols;$k++) { + $spareratio = ($table['l'][$k] / $totaltextlength); // gives ratio to divide up free space + // Don't allocate more than Maximum required width - save rest in surplus + if ($widthcols[$k]['miw'] + ($wi * $spareratio) > $widthcols[$k]['maw']) { + $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw']-$widthcols[$k]['miw']); + $widthcols[$k]['miw'] = $widthcols[$k]['maw']; + } + else { + $notsetlist[] = $k; + $ttl += $table['l'][$k]; + $widthcols[$k]['miw'] += ($wi * $spareratio); + } + + } + } + else { + $wi = ($table['w'] - ($wis + $tblbw)); // i.e. extra space to distribute + foreach ($list as $k) { + $spareratio = ($table['l'][$k] / $totalatextlength); // gives ratio to divide up free space + // Don't allocate more than Maximum required width - save rest in surplus + if ($widthcols[$k]['miw'] + ($wi * $spareratio) > $widthcols[$k]['maw']) { + $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw']-$widthcols[$k]['miw']); + $widthcols[$k]['miw'] = $widthcols[$k]['maw']; + } + else { + $notsetlist[] = $k; + $ttl += $table['l'][$k]; + $widthcols[$k]['miw'] += ($wi * $spareratio); + } + } + } + // If surplus still left over apportion it across columns + if ($surplus) { + // if some are set only add to remaining - otherwise add to all of them + if (count($notsetlist) && count($notsetlist) < $numcols) { + foreach ($notsetlist AS $i) { + if ($ttl) $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl ; + } + } + // If some widths are defined, and others have been added up to their maxmum + else if (count($list) && count($list) < $numcols) { + foreach ($list AS $i) { + $widthcols[$i]['miw'] += $surplus / count($list) ; + } + } + else if ($numcols) { // If all columns + $ttl = array_sum($table['l']); + for ($i=0;$i<$numcols;$i++) { + $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; + } + } + } + + } + + // This sets the columns all to minimum width (which has been increased above if appropriate) + for ($i=0;$i<$numcols;$i++) { + $widthcols[$i] = $widthcols[$i]['miw']; + } + + // TABLE NOT WIDE ENOUGH EVEN FOR MINIMUM CONTENT WIDTH + // If sum of column widths set are too wide for table + $checktablewidth = 0; + for ( $i = 0 ; $i < $numcols ; $i++ ) { + $checktablewidth += $widthcols[$i]; + } + if ($checktablewidth > ($temppgwidth + 0.001 - $tblbw)) { + $usedup = 0; $numleft = 0; + for ($i=0;$i<$numcols;$i++) { + if ((isset($widthcols[$i]) && $widthcols[$i] > (($temppgwidth - $tblbw) / $numcols)) && (!isset($widthcols[$i]['w']))) { + $numleft++; + unset($widthcols[$i]); + } + else { $usedup += $widthcols[$i]; } + } + for ($i=0;$i<$numcols;$i++) { + if (!isset($widthcols[$i]) || !$widthcols[$i]) { + $widthcols[$i] = ((($temppgwidth - $tblbw) - $usedup)/ ($numleft)); + } + } + } + + } + else { //table has no width defined + $table['w'] = $tablewidth; + for ( $i = 0 ; $i < $numcols ; $i++) { + if (isset($widthcols[$i]['wpercent']) && $this->keep_table_proportions) { $colwidth = $widthcols[$i]['maw']; } + else if (isset($widthcols[$i]['w'])) { $colwidth = $widthcols[$i]['miw']; } + else { $colwidth = $widthcols[$i]['maw']; } + unset($widthcols[$i]); + $widthcols[$i] = $colwidth; + } + } + + if ($table['overflow']=='visible' && $table['level'] ==1) { + if ($tablewidth > $this->blk[$this->blklvl]['inner_width']) { + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + for ($j = 0 ; $j < $numcols; $j++) { //columns + for ($i = 0 ; $i < $table['nr']; $i++) { //rows + if (isset($table['cells'][$i][$j]) && $table['cells'][$i][$j]) { + if ($this->cacheTables) { + $cc = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + $colspan = $cc['colspan']; + } + else + $colspan = $table['cells'][$i][$j]['colspan']; + if ($colspan > 1) { + $w = 0; + for ($c = $j; $c < ($j + $colspan); $c++) { + $w += $widthcols[$c]; + } + if ($w > $this->blk[$this->blklvl]['inner_width']) { + $diff = $w - ($this->blk[$this->blklvl]['inner_width'] - $tblbw); + for ($c = $j; $c < ($j + $colspan); $c++) { + $widthcols[$c] -= $diff * ($widthcols[$c]/$w); + } + $table['w'] -= $diff; + $table['csp'][$j] = $w - $diff; + } + } + } + + } + } + if ($this->cacheTables) { fclose($fh); } + } + $pgNo = 0; + $currWc = 0; + for ($i = 0 ; $i < $numcols; $i++) { //columns + if (isset($table['csp'][$i])) { + $w = $table['csp'][$i]; + unset($table['csp'][$i]); + } + else { $w = $widthcols[$i]; } + if (($currWc + $w + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $pgNo++; + $currWc = $widthcols[$i] ; + } + else { $currWc += $widthcols[$i] ; } + $table['colPg'][$i] = $pgNo; + } + } +} + + + +function _tableHeight(&$table){ + $level = $table['level']; + $levelid = $table['levelid']; + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + $listspan = array(); + $checkmaxheight = 0; + $headerrowheight = 0; + $checkmaxheightplus = 0; + $headerrowheightplus = 0; + $firstrowheight = 0; + + $footerrowheight = 0; + $footerrowheightplus = 0; + if ($this->table_rotate) { + $temppgheight = $this->tbrot_maxh; + $remainingpage = $this->tbrot_maxh; + } + else { + $temppgheight = ($this->h - $this->bMargin - $this->tMargin) - $this->kwt_height; + $remainingpage = ($this->h - $this->bMargin - $this->y) - $this->kwt_height; + + // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) + // then allow for this + $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $table['margin']['B']; + if ($remainingpage > $enddiv && $enddiv/$remainingpage <0.05) { $remainingpage -= $enddiv; } + else if ($remainingpage == 0) { $remainingpage = 0.001; } + if ($temppgheight > $enddiv && $enddiv/$temppgheight <0.05) { $temppgheight -= $enddiv; } + else if ($temppgheight == 0) { $temppgheight = 0.001; } + } + if ($remainingpage < 0) { $remainingpage = 0.001; } // mPDF 5.6.64 + if ($temppgheight < 0) { $temppgheight = 0.001; } // mPDF 5.6.64 + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + for( $i = 0 ; $i < $numrows ; $i++ ) { //rows + $heightrow = &$table['hr'][$i]; + for( $j = 0 ; $j < $numcols ; $j++ ) { //columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cells[$i][$j]; + + if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $extraWLR = ($table['simple']['border_details']['L']['w']+$table['simple']['border_details']['R']['w']) + ($c['padding']['L']+$c['padding']['R'])+$table['border_spacing_H']; + $extrh = ($table['simple']['border_details']['T']['w']+$table['simple']['border_details']['B']['w']) + ($c['padding']['T']+$c['padding']['B'])+$table['border_spacing_V']; + } + else { + $extraWLR = ($table['simple']['border_details']['L']['w']+$table['simple']['border_details']['R']['w'])/2 + ($c['padding']['L']+$c['padding']['R']); + $extrh = ($table['simple']['border_details']['T']['w']+$table['simple']['border_details']['B']['w'])/2 + ($c['padding']['T']+$c['padding']['B']); + } + } + else { + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $bt = $c['border_details']['T']['w']; + $bb = $c['border_details']['B']['w']; + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($table['borders_separate']) { // NB twice border width + $extraWLR = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + $extrh = $bt + $bb + $c['padding']['T'] + $c['padding']['B'] + $table['border_spacing_V']; + } + else { + $extraWLR = $bl/2 + $br/2 + $c['padding']['L'] + $c['padding']['R']; + $extrh = $bt/2 + $bb/2 + $c['padding']['T']+$c['padding']['B']; + } + } + + if ($table['overflow']=='visible' && $level==1) + list($x,$cw) = $this->_splitTableGetWidth($table, $i,$j, $fh); + else + list($x,$cw) = $this->_tableGetWidth($table, $i,$j, $fh); + + // Get CELL HEIGHT + // ++ extra parameter forces wrap to break word + if ($c['R'] && isset($c['textbuffer'])) { // mPDF 5.4.01 + $str = ''; + foreach($c['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + $this->SetFont($c['textbuffer'][0][4],$c['textbuffer'][0][2],$c['textbuffer'][0][11] / $this->shrin_k,true,true); + $tempch = $this->GetStringWidth($str); + if ($c['R'] >= 45 && $c['R'] < 90) { + $tempch = ((sin(deg2rad($c['R']))) * $tempch ) + ((sin(deg2rad($c['R']))) * (($c['textbuffer'][0][11]/_MPDFK) / $this->shrin_k)); + } + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $ch = ($tempch ) + $extrh ; + } + else { + if (isset($c['textbuffer'])) { + $tempch = $this->TableWordWrap(($cw-$extraWLR),1,$c['textbuffer'], $c['dfs']); + } + else { $tempch = 0; } + + // Added cellpadding top and bottom. (Lineheight already adjusted to table_lineheight) + $ch = $tempch + $extrh ; + } + //If height is defined and it is bigger than calculated $ch then update values + if (isset($c['h']) && $c['h'] > $ch) { + $c['mih'] = $ch; //in order to keep valign working + $ch = $c['h']; + } + else $c['mih'] = $ch; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($c, $fh, $table['cells'][$i][$j], 'mih'); + } + if (isset($c['rowspan'])) $listspan[] = array($i,$j); + elseif ($heightrow < $ch) $heightrow = $ch; + + // this is the extra used in _tableWrite to determine whether to trigger a page change + if ($table['borders_separate']) { + if ($i == ($numrows-1) || (isset($c['rowspan']) && ($i+$c['rowspan']) == ($numrows)) ) { + $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { + if (!$this->simpleTables){ + $extra = $bb/2; + } + else if ($this->simpleTables){ + $extra = $table['simple']['border_details']['B']['w'] /2; + } + } + if (isset($table['is_thead'][$i]) && $table['is_thead'][$i]) { + if ($j==0) { + $headerrowheight += $ch; + $headerrowheightplus += $ch+$extra; + } + } + else if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { + if ($j==0) { + $footerrowheight += $ch; + $footerrowheightplus += $ch+$extra; + } + } + else { + $checkmaxheight = max($checkmaxheight,$ch); + $checkmaxheightplus = max($checkmaxheightplus,$ch+$extra); + } + if ($this->tableLevel==1 && $i == $table['headernrows']) { $firstrowheight = max($ch,$firstrowheight); } + unset($c); + } + }//end of columns + }//end of rows + + $heightrow = &$table['hr']; + foreach ($listspan as $span) { + list($i,$j) = $span; + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cells[$i][$j]; + $lr = $i + $c['rowspan']; + if ($lr > $numrows) $lr = $numrows; + $hs = $hsa = 0; + $list = array(); + for($k=$i;$k<$lr;$k++) { + $hs += $heightrow[$k]; + if (!isset($c['h'])) { + $list[] = $k; + $hsa += $heightrow[$k]; + } + } + + if ($table['borders_separate']) { + if ($i == ($numrows-1) || ($i+$c['rowspan']) == ($numrows) ) { + $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $bb = $c['border_details']['B']['w']; + } + $extra = $bb/2; + } + else if ($this->simpleTables){ + $extra = $table['simple']['border_details']['B']['w'] /2; + } + } + if (!empty($table['is_thead'][$i])) { + $headerrowheight = max($headerrowheight,$hs); + $headerrowheightplus = max($headerrowheightplus,$hs+$extra); + } + else if (!empty($table['is_tfoot'][$i])) { + $footerrowheight = max($footerrowheight,$hs); + $footerrowheightplus = max($footerrowheightplus,$hs+$extra); + } + else { + $checkmaxheight = max($checkmaxheight,$hs); + $checkmaxheightplus = max($checkmaxheightplus,$hs+$extra); + } + if ($this->tableLevel==1 && $i == $table['headernrows']) { $firstrowheight = max($hs,$firstrowheight); } + + if ($c['mih'] > $hs) { + if (!$hs) { + for($k=$i;$k<$lr;$k++) $heightrow[$k] = $c['mih']/$c['rowspan']; + } + elseif (!count($list)) { + $hi = $c['mih'] - $hs; + for($k=$i;$k<$lr;$k++) $heightrow[$k] += ($heightrow[$k]/$hs)*$hi; + } + else { + $hi = $c['mih'] - $hsa; + foreach ($list as $k) $heightrow[$k] += ($heightrow[$k]/$hsa)*$hi; + } + } + unset($c); + + // If rowspans overlap so that one or more rows do not have a height set... + // i.e. for one or more rows, the only cells (explicit) in that row have rowspan>1 + // so heightrow is still == 0 + if ($heightrow[$i]==0) { + // Get row extent to analyse above and below + $top = $i; + foreach ($listspan as $checkspan) { + list($cki,$ckj) = $checkspan; + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$cki][$ckj], '', $fh); + } + else + $c = &$cells[$cki][$ckj]; + if (isset($c['rowspan']) && $c['rowspan']>1) { + if (($cki + $c['rowspan']-1) >= $i) { $top = min($top, $cki); } + } + } + $bottom = $i + $c['rowspan']-1; + // Check for overconstrained conditions + for ($k=$top; $k<=$bottom; $k++) { + // if ['hr'] for any of the others is also 0, then abort (too complicated) + if ($k != $i && $heightrow[$k]==0) { break(1); } + // check again that top and bottom are not crossed by rowspans - or abort (too complicated) + if ($k==$top) { + // ???? take account of colspan as well??? + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + if (!isset($cells[$k][$m]) || $cells[$k][$m]==0) { + break(2); + } + } + } + else if ($k==$bottom) { + // ???? take account of colspan as well??? + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$k][$m], '', $fh); + } + else + $c = &$cells[$k][$m]; + if (isset($c['rowspan']) && $c['rowspan']>1) { + break(2); + } + } + } + } + // By columns add up col height using ['h'] if set or ['mih'] if not + // Intentionally do not substract border-spacing + $colH = array(); + $extH = 0; + $newhr = array(); + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + for ($k=$top; $k<=$bottom; $k++) { + if (isset($cells[$k][$m]) && $cells[$k][$m]!=0) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$k][$m], '', $fh); + } + else + $c = &$cells[$k][$m]; + if (isset($c['h']) && $c['h']) { + $useh = $c['h']; + } + // ???? take account of colspan as well??? + else { + $useh = $c['mih']; + } + $colH[$m] += $useh; + if (!isset($c['rowspan']) || $c['rowspan']<2) { $newhr[$k] = max($newhr[$k], $useh); } + } + } + $extH = max($tabH, $colH[$m]); + } + $newhr[$i] = $extH - array_sum($newhr); + for ($k=$top; $k<=$bottom; $k++) { $heightrow[$k] = $newhr[$k]; } + } + + + unset($c); + } + + $table['h'] = array_sum($heightrow); + unset($heightrow); + + if ($this->cacheTables) { fclose($fh); } + + if ($table['borders_separate']) { + $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['border_details']['T']['w'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] + $table['padding']['T'] + $table['padding']['B']; + } + else { + $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['max_cell_border_width']['T']/2 + $table['max_cell_border_width']['B']/2; + } + + $maxrowheight = $checkmaxheightplus + $headerrowheightplus + $footerrowheightplus; + $maxfirstrowheight = $firstrowheight + $headerrowheightplus + $footerrowheightplus; // includes thead, 1st row and tfoot + return array($table['h'],$maxrowheight,$temppgheight,$remainingpage,$maxfirstrowheight); +} + +function _tableGetWidth(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell) { + if (isset($cell['x0'])) { return array($cell['x0'], $cell['w0']); } + $x = 0; + $widthcols = &$table['wc']; + for( $k = 0 ; $k < $j ; $k++ ) $x += $widthcols[$k]; + $w = $widthcols[$j]; + if (isset($cell['colspan'])) { + for ( $k = $j+$cell['colspan']-1 ; $k > $j ; $k-- ) $w += $widthcols[$k]; + } + $cell['x0'] = $x; + $cell['w0'] = $w; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'x0'); + } + return array($x, $w); + } + return array(0,0); +} + +function _splitTableGetWidth(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell) { + if (isset($cell['x0'])) return array($cell['x0'], $cell['w0']); + $x = 0; + $widthcols = &$table['wc']; + $pg = $table['colPg'][$j]; + for( $k = 0 ; $k < $j ; $k++ ) { + if ($table['colPg'][$k]==$pg) $x += $widthcols[$k]; + } + $w = $widthcols[$j]; + if (isset($cell['colspan'])) { + for ( $k = $j+$cell['colspan']-1 ; $k > $j ; $k-- ) if ($table['colPg'][$k]==$pg) $w += $widthcols[$k]; + } + $cell['x0'] = $x; + $cell['w0'] = $w; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'x0'); + } + return array($x, $w); + } + return array(0,0); +} + + +function _tableGetHeight(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell){ + if (isset($cell['y0'])) return array($cell['y0'], $cell['h0']); + $y = 0; + $heightrow = &$table['hr']; + for ($k=0;$k<$i;$k++) $y += $heightrow[$k]; + $h = $heightrow[$i]; + if (isset($cell['rowspan'])){ + for ($k=$i+$cell['rowspan']-1;$k>$i;$k--) + $h += $heightrow[$k]; + } + $cell['y0'] = $y; + $cell['h0'] = $h; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'y0'); + } + return array($y, $h); + } + return array(0,0); +} + +function _tableGetMaxRowHeight($table, $row, $fh) { + if ($row==$table['nc']-1) { return $table['hr'][$row]; } + $maxrowheight = $table['hr'][$row]; + for ($i=$row+1;$i<$table['nr'];$i++) { + $cellsset = 0; + for ($j=0;$j<$table['nc'];$j++) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + if ($cell) { + if (isset($cell['colspan'])) { $cellsset += $cell['colspan']; } + else $cellsset += 1; + } + } + else { + if ($table['cells'][$i][$j]) { + if (isset($table['cells'][$i][$j]['colspan'])) { $cellsset += $table['cells'][$i][$j]['colspan']; } + else $cellsset += 1; + } + } + } + if ($cellsset == $table['nc']) { return $maxrowheight; } + else { $maxrowheight += $table['hr'][$i]; } + } + return $maxrowheight; +} + + +// CHANGED TO ALLOW TABLE BORDER TO BE SPECIFIED CORRECTLY - added border_details +function _tableRect($x, $y, $w, $h, $bord=-1, $details=array(), $buffer=false, $bSeparate=false, $cort='cell', $tablecorner='', $bsv=0, $bsh=0) { + $cellBorderOverlay = array(); + + if ($bord==-1) { $this->Rect($x, $y, $w, $h); } + else if ($this->simpleTables && ($cort=='cell')) { + $this->SetLineWidth($details['L']['w']); + if ($details['L']['c']) { + $this->SetDColor($details['L']['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->SetLineJoin(0); + $this->Rect($x, $y, $w, $h); + } + else if ($bord){ + if (!$bSeparate && $buffer) { + $priority = 'LRTB'; + for($p=0;$p<strlen($priority);$p++) { + $side = $priority[$p]; + $details['p'] = $side ; + + $dom = 0; + if (isset($details[$side]['w'])) { $dom += ($details[$side]['w'] * 100000); } + if (isset($details[$side]['style'])) { $dom += (array_search($details[$side]['style'],$this->borderstyles)*100) ; } + if (isset($details[$side]['dom'])) { $dom += ($details[$side]['dom']*10); } + + // Precedence to darker colours at joins + $coldom = 0; + if (isset($details[$side]['c']) && is_array($details[$side]['c'])) { + if ($details[$side]['c']{0}==3) { // RGB + $coldom = 10-(((ord($details[$side]['c']{1})*1.00)+(ord($details[$side]['c']{2})*1.00)+(ord($details[$side]['c']{3})*1.00))/76.5); + } + } // 10 black - 0 white + if ($coldom) { $dom += $coldom; } + // Lastly precedence to RIGHT and BOTTOM cells at joins + if (isset($details['cellposdom'])) { $dom += $details['cellposdom']; } + + $save = false; + if ($side == 'T' && $this->issetBorder($bord, _BORDER_TOP)) { $cbord = _BORDER_TOP; $save = true; } + else if ($side == 'L' && $this->issetBorder($bord, _BORDER_LEFT)) { $cbord = _BORDER_LEFT; $save = true; } + else if ($side == 'R' && $this->issetBorder($bord, _BORDER_RIGHT)) { $cbord = _BORDER_RIGHT; $save = true; } + else if ($side == 'B' && $this->issetBorder($bord, _BORDER_BOTTOM)) { $cbord = _BORDER_BOTTOM; $save = true; } + + if ($save) { + $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", + str_pad(sprintf("%08.7f", $dom),16,"0",STR_PAD_LEFT), + $cbord, + ord($side), + $details[$side]['s'], + $details[$side]['w'], + $details[$side]['c'], + $details[$side]['style'], + $x, $y, $w, $h, + $details['mbw']['BL'], + $details['mbw']['BR'], + $details['mbw']['RT'], + $details['mbw']['RB'], + $details['mbw']['TL'], + $details['mbw']['TR'], + $details['mbw']['LT'], + $details['mbw']['LB'], + $details['cellposdom'], + 0 + ); + if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset' || $details[$side]['style'] == 'double' ) { + $details[$side]['overlay'] = true; + $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", + str_pad(sprintf("%08.7f", ($dom+4)),16,"0",STR_PAD_LEFT), + $cbord, + ord($side), + $details[$side]['s'], + $details[$side]['w'], + $details[$side]['c'], + $details[$side]['style'], + $x, $y, $w, $h, + $details['mbw']['BL'], + $details['mbw']['BR'], + $details['mbw']['RT'], + $details['mbw']['RB'], + $details['mbw']['TL'], + $details['mbw']['TR'], + $details['mbw']['LT'], + $details['mbw']['LB'], + $details['cellposdom'], + 1 + ); + } + } + } + return; + } + + if (isset($details['p']) && strlen($details['p'])>1) { $priority = $details['p']; } + else { $priority='LTRB'; } + $Tw = 0; + $Rw = 0; + $Bw = 0; + $Lw = 0; + if (isset($details['T']['w'])) { $Tw = $details['T']['w']; } + if (isset($details['R']['w'])) { $Rw = $details['R']['w']; } + if (isset($details['B']['w'])) { $Bw = $details['B']['w']; } + if (isset($details['L']['w'])) { $Lw = $details['L']['w']; } + + $x2 = $x + $w; $y2 = $y + $h; + $oldlinewidth = $this->LineWidth; + + for($p=0;$p<strlen($priority);$p++) { + $side = $priority[$p]; + $xadj = 0; + $xadj2 = 0; + $yadj = 0; + $yadj2 = 0; + $print = false; + if ($Tw && $side=='T' && $this->issetBorder($bord, _BORDER_TOP)) { // TOP + $ly1 = $y; + $ly2 = $y; + $lx1 = $x; + $lx2 = $x2; + $this->SetLineWidth($Tw); + if ($cort == 'cell' || strpos($tablecorner,'L')!==false) { + if ($Tw > $Lw) $xadj = ($Tw - $Lw)/2; + if ($Tw < $Lw) $xadj = ($Tw + $Lw)/2; + } + else { $xadj = $Tw/2 - $bsh/2; } + if ($cort == 'cell' || strpos($tablecorner,'R')!==false) { + if ($Tw > $Rw) $xadj2 = ($Tw - $Rw)/2; + if ($Tw < $Rw) $xadj2 = ($Tw + $Rw)/2; + } + else { $xadj2 = $Tw/2 - $bsh/2; } + if (!$bSeparate && $details['mbw']['TL']) { + $xadj = ($Tw - $details['mbw']['TL'])/2 ; + } + if (!$bSeparate && $details['mbw']['TR']) { + $xadj2 = ($Tw - $details['mbw']['TR'])/2; + } + $print = true; + } + if ($Lw && $side=='L' && $this->issetBorder($bord, _BORDER_LEFT)) { // LEFT + $ly1 = $y; + $ly2 = $y2; + $lx1 = $x; + $lx2 = $x; + $this->SetLineWidth($Lw); + if ($cort == 'cell' || strpos($tablecorner,'T')!==false) { + if ($Lw > $Tw) $yadj = ($Lw - $Tw)/2; + if ($Lw < $Tw) $yadj = ($Lw + $Tw)/2; + } + else { $yadj = $Lw/2 - $bsv/2; } + if ($cort == 'cell' || strpos($tablecorner,'B')!==false) { + if ($Lw > $Bw) $yadj2 = ($Lw - $Bw)/2; + if ($Lw < $Bw) $yadj2 = ($Lw + $Bw)/2; + } + else { $yadj2 = $Lw/2 - $bsv/2; } + if (!$bSeparate && $details['mbw']['LT']) { + $yadj = ($Lw - $details['mbw']['LT'])/2; + } + if (!$bSeparate && $details['mbw']['LB']) { + $yadj2 = ($Lw - $details['mbw']['LB'])/2; + } + $print = true; + } + if ($Rw && $side=='R' && $this->issetBorder($bord, _BORDER_RIGHT)) { // RIGHT + $ly1 = $y; + $ly2 = $y2; + $lx1 = $x2; + $lx2 = $x2; + $this->SetLineWidth($Rw); + if ($cort == 'cell' || strpos($tablecorner,'T')!==false) { + if ($Rw < $Tw) $yadj = ($Rw + $Tw)/2; + if ($Rw > $Tw) $yadj = ($Rw - $Tw)/2; + } + else { $yadj = $Rw/2 - $bsv/2; } + + if ($cort == 'cell' || strpos($tablecorner,'B')!==false) { + if ($Rw > $Bw) $yadj2 = ($Rw - $Bw)/2; + if ($Rw < $Bw) $yadj2 = ($Rw + $Bw)/2; + } + else { $yadj2 = $Rw/2 - $bsv/2; } + + if (!$bSeparate && $details['mbw']['RT']) { + $yadj = ($Rw - $details['mbw']['RT'])/2; + } + if (!$bSeparate && $details['mbw']['RB']) { + $yadj2 = ($Rw - $details['mbw']['RB'])/2; + } + $print = true; + } + if ($Bw && $side=='B' && $this->issetBorder($bord, _BORDER_BOTTOM)) { // BOTTOM + $ly1 = $y2; + $ly2 = $y2; + $lx1 = $x; + $lx2 = $x2; + $this->SetLineWidth($Bw); + if ($cort == 'cell' || strpos($tablecorner,'L')!==false) { + if ($Bw > $Lw) $xadj = ($Bw - $Lw)/2; + if ($Bw < $Lw) $xadj = ($Bw + $Lw)/2; + } + else { $xadj = $Bw/2 - $bsh/2; } + if ($cort == 'cell' || strpos($tablecorner,'R')!==false) { + if ($Bw > $Rw) $xadj2 = ($Bw - $Rw)/2; + if ($Bw < $Rw) $xadj2 = ($Bw + $Rw)/2; + } + else { $xadj2 = $Bw/2 - $bsh/2; } + if (!$bSeparate && $details['mbw']['BL']) { + $xadj = ($Bw - $details['mbw']['BL'])/2; + } + if (!$bSeparate && $details['mbw']['BR']) { + $xadj2 = ($Bw - $details['mbw']['BR'])/2; + } + $print = true; + } + + // Now draw line + if ($print) { +/*-- TABLES-ADVANCED-BORDERS --*/ + if ($details[$side]['style'] == 'double') { + if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $xadj -= $this->LineWidth/2; + $xadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $xadj2 += $this->LineWidth; + } + } + if ($side=='L') { + $yadj -= $this->LineWidth/2; + $yadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $yadj2 += $this->LineWidth; + } + } + if ($side=='B') { + $xadj -= $this->LineWidth/2; + $xadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $xadj2 += $this->LineWidth; + } + } + if ($side=='R') { + $yadj -= $this->LineWidth/2; + $yadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $yadj2 += $this->LineWidth; + } + } + } + + $this->SetLineWidth($this->LineWidth/3); + + $tbcol = $this->ConvertColor(255); + for($l=0; $l <= $this->blklvl; $l++) { + if ($this->blk[$l]['bgcolor']) { + $tbcol = ($this->blk[$l]['bgcolorarray']); // mPDF 5.6.53 + } + } + + if ($bSeparate) { + $cellBorderOverlay[] = array( + 'x' => $lx1 + $xadj, + 'y' => $ly1 + $yadj, + 'x2' => $lx2 - $xadj2, + 'y2' => $ly2 - $yadj2, + 'col' => $tbcol, + 'lw' => $this->LineWidth, + ); + } + else { + $this->SetDColor($tbcol); + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + } + } + + + else if (isset($details[$side]['style']) && ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset')) { + if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + if ($details[$side]['style'] == 'outset' || $details[$side]['style'] == 'groove') { + $nc = $this->_darkenColor($details[$side]['c']); + $this->SetDColor($nc); + } + else if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { + $nc = $this->_lightenColor($details[$side]['c']); + $this->SetDColor($nc); + } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $doubleadj = ($this->LineWidth)/3; + $this->SetLineWidth($this->LineWidth/2); + $xadj3 = $yadj3 = $wadj3 = $hadj3 = 0; + + if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { + $nc = $this->_darkenColor($details[$side]['c']); + + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $wadj3 -= $this->LineWidth*2; + } + } + if ($side=='L') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $hadj3 -= $this->LineWidth*2; + } + } + if ($side=='B') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + } + if ($side=='R') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + } + } + + else if ($side=='T') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; $wadj3 = -$this->LineWidth*2; } + else if ($side=='L') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; $hadj3 = -$this->LineWidth*2; } + + else if ($side=='B' && $bSeparate) { $yadj3 = $this->LineWidth/2; $wadj3 = $this->LineWidth/2; } + else if ($side=='R' && $bSeparate) { $xadj3 = $this->LineWidth/2; $hadj3 = $this->LineWidth/2; } + + else if ($side=='B') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='R') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + } + else { + $nc = $this->_lightenColor($details[$side]['c']); + + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + } + if ($side=='L') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + } + if ($side=='B') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + } + if ($side=='R') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + } + } + + else if ($side=='T') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='L') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + + else if ($side=='B' && $bSeparate) { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='R' && $bSeparate) { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + + else if ($side=='B') { $yadj3 = $this->LineWidth/2; $xadj3 = -$this->LineWidth/2; $wadj3 = $this->LineWidth; } + else if ($side=='R') { $xadj3 = $this->LineWidth/2; $yadj3 = -$this->LineWidth/2; $hadj3 = $this->LineWidth; } + + } + + if ($bSeparate) { + $cellBorderOverlay[] = array( + 'x' => $lx1 + $xadj + $xadj3, + 'y' => $ly1 + $yadj + $yadj3, + 'x2' => $lx2 - $xadj2 + $xadj3 + $wadj3, + 'y2' => $ly2 - $yadj2 + $yadj3 + $hadj3, + 'col' => $nc, + 'lw' => $this->LineWidth, + ); + } + else { + $this->SetDColor($nc); + $this->Line($lx1 + $xadj + $xadj3, $ly1 + $yadj + $yadj3, $lx2 - $xadj2 + $xadj3 + $wadj3, $ly2 - $yadj2 + $yadj3 + $hadj3); + } + } + } + + + else { +/*-- END TABLES-ADVANCED-BORDERS --*/ + if ($details[$side]['style'] == 'dashed') { + $dashsize = 2; // final dash will be this + 1*linewidth + $dashsizek = 1.5; // ratio of Dash/Blank + $this->SetDash($dashsize,($dashsize/$dashsizek)+($this->LineWidth*2)); + } + else if ($details[$side]['style'] == 'dotted') { + $this->SetLineJoin(1); + $this->SetLineCap(1); + $this->SetDash(0.001,($this->LineWidth*2)); + } + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); +/*-- TABLES-ADVANCED-BORDERS --*/ + } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + // Reset Corners + $this->SetDash(); + //BUTT style line cap + $this->SetLineCap(2); + } + } + + if ($bSeparate && count($cellBorderOverlay)) { + foreach($cellBorderOverlay AS $cbo) { + $this->SetLineWidth($cbo['lw']); + $this->SetDColor($cbo['col']); + $this->Line($cbo['x'], $cbo['y'], $cbo['x2'], $cbo['y2']); + } + } + + // $this->SetLineWidth($oldlinewidth); + // $this->SetDColor($this->ConvertColor(0)); + } +} + + +/*-- TABLES --*/ +/*-- TABLES-ADVANCED-BORDERS --*/ +function _lightenColor($c) { + if (is_array($c)) { die('Color error in _lightencolor'); } + if ($c{0}==3 || $c{0}==5) { // RGB + list($h,$s,$l) = $this->rgb2hsl(ord($c{1})/255,ord($c{2})/255,ord($c{3})/255); + $l += ((1 - $l)*0.8); + list($r,$g,$b) = $this->hsl2rgb($h,$s,$l); + $ret = array(3,$r,$g,$b); + } + else if ($c{0}==4 || $c{0}==6) { // CMYK + $ret = array(4, max(0,(ord($c{1})-20)), max(0,(ord($c{2})-20)), max(0,(ord($c{3})-20)), max(0,(ord($c{4})-20)) ); + } + else if ($c{0}==1) { // Grayscale + $ret = array(1,min(255,(ord($c{1})+32))); + } + $c = array_pad($ret, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + return $cstr; +} + + +function _darkenColor($c) { + if (is_array($c)) { die('Color error in _darkenColor'); } + if ($c{0}==3 || $c{0}==5) { // RGB + list($h,$s,$l) = $this->rgb2hsl(ord($c{1})/255,ord($c{2})/255,ord($c{3})/255); + $s *= 0.25; + $l *= 0.75; + list($r,$g,$b) = $this->hsl2rgb($h,$s,$l); + $ret = array(3,$r,$g,$b); + } + else if ($c{0}==4 || $c{0}==6) { // CMYK + $ret = array(4, min(100,(ord($c{1})+20)), min(100,(ord($c{2})+20)), min(100,(ord($c{3})+20)), min(100,(ord($c{4})+20)) ); + } + else if ($c{0}==1) { // Grayscale + $ret = array(1,max(0,(ord($c{1})-32))); + } + $c = array_pad($ret, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + return $cstr; +} + +/*-- END TABLES-ADVANCED-BORDERS --*/ + + + +function setBorder(&$var, $flag, $set = true) { + $flag = intval($flag); + if ($set) { $set = true; } + $var = intval($var); + $var = $set ? ($var | $flag) : ($var & ~$flag); +} +function issetBorder($var, $flag) { + $flag = intval($flag); + $var = intval($var); + return (($var & $flag) == $flag); +} + + +function _table2cellBorder(&$tableb, &$cbdb, &$cellb, $bval) { + if ($tableb && $tableb['w'] > $cbdb['w']) { + $cbdb = $tableb; + $this->setBorder($cellb, $bval); + } + else if ($tableb && $tableb['w'] == $cbdb['w'] + && array_search($tableb['style'],$this->borderstyles) > array_search($cbdb['style'],$this->borderstyles)) { + $cbdb = $tableb; + $this->setBorder($cellb, $bval); + } +} + +// FIX BORDERS ******************************************** +function _fixTableBorders(&$table){ + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + if (!$table['borders_separate'] && $table['border_details']['L']['w']) { + $table['max_cell_border_width']['L'] = $table['border_details']['L']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['R']['w']) { + $table['max_cell_border_width']['R'] = $table['border_details']['R']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['T']['w']) { + $table['max_cell_border_width']['T'] = $table['border_details']['T']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['B']['w']) { + $table['max_cell_border_width']['B'] = $table['border_details']['B']['w']; + } + if ($this->simpleTables) { return; } + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; +/*-- TABLES-ADVANCED-BORDERS --*/ + if (isset($table['topntail']) && $table['topntail']) { $tntborddet = $this->border_details($table['topntail']); } + if (isset($table['thead-underline']) && $table['thead-underline']) { $thuborddet = $this->border_details($table['thead-underline']); } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + for( $i = 0 ; $i < $numrows ; $i++ ) { //Rows + for( $j = 0 ; $j < $numcols ; $j++ ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($this->packTableData) { // includes $this->cacheTables + $cbord = $this->_unpackCellBorder($cell['borderbin']); + } + else { + $cbord = &$cells[$i][$j]; + } + + if (!$cbord['border'] && isset($table['border']) && $table['border'] && $this->table_border_attr_set) { + $cbord['border'] = $table['border']; + $cbord['border_details'] = $table['border_details']; + } + + if (isset($cell['colspan']) && $cell['colspan']>1) { $ccolsp = $cell['colspan']; } + else { $ccolsp = 1; } + if (isset($cell['rowspan']) && $cell['rowspan']>1) { $crowsp = $cell['rowspan']; } + else { $crowsp = 1; } + + $cbord['border_details']['cellposdom'] = ((($i+1)/$numrows) / 10000 ) + ((($j+1)/$numcols) / 10 ); + // Inherit Cell border from Table border + if ($this->table_border_css_set && !$table['borders_separate']) { + if ($i == 0) { + $this->_table2cellBorder($table['border_details']['T'], $cbord['border_details']['T'], $cbord['border'], _BORDER_TOP); + } + if ($i == ($numrows-1) || ($i+$crowsp) == ($numrows) ) { + $this->_table2cellBorder($table['border_details']['B'], $cbord['border_details']['B'], $cbord['border'], _BORDER_BOTTOM); + } + if ($j == 0) { + $this->_table2cellBorder($table['border_details']['L'], $cbord['border_details']['L'], $cbord['border'], _BORDER_LEFT); + } + if ($j == ($numcols-1) || ($j+$ccolsp) == ($numcols) ) { + $this->_table2cellBorder($table['border_details']['R'], $cbord['border_details']['R'], $cbord['border'], _BORDER_RIGHT); + } + } + +/*-- TABLES-ADVANCED-BORDERS --*/ + $fixbottom = true; + if (isset($table['topntail']) && $table['topntail']) { + if ($i == 0) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']-1) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + else if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']) { + if (!$table['borders_separate']) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + if ($this->tableLevel==1 && $table['footernrows']>0 && $i == ($numrows-$table['footernrows']-1)) { + if (!$table['borders_separate']) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + } + else if ($this->tableLevel==1 && $table['footernrows']>0 && $i == ($numrows-$table['footernrows'])) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + if ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader + if (!$table['borders_separate']) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + if ($i == ($numrows-1) || ($i+$crowsp) == ($numrows) ) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + } + } + if (isset($table['thead-underline']) && $table['thead-underline']) { + if ($table['borders_separate']) { + if ($i == 0) { + $cbord['border_details']['B'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + } + else { + if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']-1) { + $cbord['border_details']['T'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + else if ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader + $cbord['border_details']['T'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + } + + // Collapse Border - Algorithm for conflicting borders + // Hidden >> Width >> double>solid>dashed>dotted... >> style set on cell>table >> top/left>bottom/right + // Do not turn off border which is overridden + // Needed for page break for TOP/BOTTOM both to be defined in Collapsed borders + // Means it is painted twice. (Left/Right can still disable overridden border) + if (!$table['borders_separate']) { + if (($i < ($numrows-1) || ($i+$crowsp) < $numrows ) && $fixbottom ) { // Bottom + for ($cspi = 0; $cspi<$ccolsp; $cspi++) { + // already defined Top for adjacent cell below + if (isset($cells[($i+$crowsp)][$j+$cspi])) { + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$crowsp][$j+$cspi], '', $fh); + } + else { $adjc = $cells[($i+$crowsp)][$j+$cspi]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[($i+$crowsp)][$j+$cspi]; } + } + else { $celladj = false; } + if ($celladj && $celladj['border_details']['T']['s'] == 1) { + $csadj = $celladj['border_details']['T']['w']; + $csthis = $cbord['border_details']['B']['w']; + // Hidden + if ($cbord['border_details']['B']['style']=='hidden') { + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($celladj['border'] , _BORDER_TOP, false); + $this->setBorder($cbord['border'] , _BORDER_BOTTOM , false); + } + else if ($celladj['border_details']['T']['style']=='hidden') { + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM , false); + $this->setBorder($celladj['border'] , _BORDER_TOP, false); + } + // Width + else if ($csthis > $csadj) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM); + } + } + else if ($csadj > $csthis) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + + // double>solid>dashed>dotted... + else if (array_search($cbord['border_details']['B']['style'],$this->borderstyles) > array_search($celladj['border_details']['T']['style'],$this->borderstyles)) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM ); + } + } + else if (array_search($celladj['border_details']['T']['style'],$this->borderstyles) > array_search($cbord['border_details']['B']['style'],$this->borderstyles)) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + + + + // Style set on cell vs. table + else if ($celladj['border_details']['T']['dom'] > $cbord['border_details']['B']['dom']) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT + else { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM ); + } + } + } + else if ($celladj) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + } + } + if ($celladj && $this->packTableData) { + $celladj['borderbin'] = $this->_packCellBorder($celladj); + unset($celladj['border']); + unset($celladj['border_details']); + } + if ($this->cacheTables) { + $this->_cacheUpdateBorder($celladj, $fh, $table['cells'][$i+$crowsp][$j+$cspi]); + } + unset($celladj); + } + } + + if ($j < ($numcols-1) || ($j+$ccolsp) < $numcols ) { // Right-Left + for ($cspi = 0; $cspi<$crowsp; $cspi++) { + // already defined Left for adjacent cell to R + if (isset($cells[($i+$cspi)][$j+$ccolsp])) { + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$cspi][$j+$ccolsp], '', $fh); + } + else { $adjc = $cells[($i+$cspi)][$j+$ccolsp]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i+$cspi][$j+$ccolsp]; } + } + else { $celladj = false; } + if ($celladj && $celladj['border_details']['L']['s'] == 1) { + $csadj = $celladj['border_details']['L']['w']; + $csthis = $cbord['border_details']['R']['w']; + // Hidden + if ($cbord['border_details']['R']['style']=='hidden') { + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + } + else if ($celladj['border_details']['L']['style']=='hidden') { + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + } + // Width + else if ($csthis > $csadj) { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + } + } + else if ($csadj > $csthis) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT, false); + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + + // double>solid>dashed>dotted... + else if (array_search($cbord['border_details']['R']['style'],$this->borderstyles) > array_search($celladj['border_details']['L']['style'],$this->borderstyles)) { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + } + } + else if (array_search($celladj['border_details']['L']['style'],$this->borderstyles) > array_search($cbord['border_details']['R']['style'],$this->borderstyles)) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + + + // Style set on cell vs. table + else if ($celladj['border_details']['L']['dom'] > $cbord['border_details']['R']['dom']) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT + else { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + } + } + } + else if ($celladj) { + // if right-cell border is not set + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + } + } + if ($celladj && $this->packTableData) { + $celladj['borderbin'] = $this->_packCellBorder($celladj); + unset($celladj['border']); + unset($celladj['border_details']); + } + if ($this->cacheTables) { + $this->_cacheUpdateBorder($celladj, $fh, $table['cells'][$i+$cspi][$j+$ccolsp]); + } + unset($celladj); + } + } + } + + + // Set maximum cell border width meeting at LRTB edges of cell - used for extended cell border + // ['border_details']['mbw']['LT'] = meeting border width - Left border - Top end + if (!$table['borders_separate']) { + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $cbord['border_details']['L']['w']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $cbord['border_details']['R']['w']); + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $cbord['border_details']['T']['w']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $cbord['border_details']['B']['w']); + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $cbord['border_details']['L']['w']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $cbord['border_details']['R']['w']); + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $cbord['border_details']['T']['w']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $cbord['border_details']['B']['w']); + if (($i+$crowsp) < $numrows && isset($cells[$i+$crowsp][$j])) { // Has Bottom adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$crowsp][$j], '', $fh); + } + else { $adjc = $cells[$i+$crowsp][$j]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i+$crowsp][$j]; } + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $celladj['border_details']['L']['w'], $celladj['border_details']['mbw']['TL']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $celladj['border_details']['R']['w'], $celladj['border_details']['mbw']['TR']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $celladj['border_details']['mbw']['LT']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $celladj['border_details']['mbw']['RT']); + unset($celladj); + } + if (($j+$ccolsp) < $numcols && isset($cells[$i][$j+$ccolsp])) { // Has Right adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i][$j+$ccolsp], '', $fh); + } + else { $adjc = $cells[$i][$j+$ccolsp]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i][$j+$ccolsp]; } + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $celladj['border_details']['T']['w'], $celladj['border_details']['mbw']['LT']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $celladj['border_details']['B']['w'], $celladj['border_details']['mbw']['LB']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $celladj['border_details']['mbw']['TL']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $celladj['border_details']['mbw']['BL']); + unset($celladj); + } + + if ($i > 0 && isset($cells[$i-1][$j]) && (($this->packTableData && $cells[$i-1][$j]['borderbin']) || $cells[$i-1][$j]['border'])) { // Has Top adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i-1][$j], '', $fh); + } + else { $adjc = $cells[$i-1][$j]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i-1][$j]; } + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['L']['w'], $celladj['border_details']['mbw']['BL']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $celladj['border_details']['R']['w'], $celladj['border_details']['mbw']['BR']); + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $celladj['border_details']['mbw']['LB']); + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $celladj['border_details']['mbw']['RB']); + + if ($celladj['border_details']['mbw']['BL']) { + $celladj['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['BL']); + } + if ($celladj['border_details']['mbw']['BR'] ) { + $celladj['border_details']['mbw']['BR'] = max($celladj['border_details']['mbw']['BR'], $cbord['border_details']['mbw']['TR']); + } + if ($this->packTableData) { $cells[$i-1][$j]['borderbin'] = $this->_packCellBorder($celladj); } + unset($celladj); + } + if ($j > 0 && isset($cells[$i][$j-1]) && (($this->packTableData && $cells[$i][$j-1]['borderbin']) || $cells[$i][$j-1]['border'])) { // Has Left adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i][$j-1], '', $fh); + } + else { $adjc = $cells[$i][$j-1]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i][$j-1]; } + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $celladj['border_details']['T']['w'], $celladj['border_details']['mbw']['RT']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $celladj['border_details']['B']['w'], $celladj['border_details']['mbw']['RB']); + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $celladj['border_details']['mbw']['BR']); + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['TR']); + + if ($celladj['border_details']['mbw']['RT']) { + $celladj['border_details']['mbw']['RT'] = max($celladj['border_details']['mbw']['RT'], $cbord['border_details']['mbw']['LT']); + } + if ($celladj['border_details']['mbw']['RB']) { + $celladj['border_details']['mbw']['RB'] = max($celladj['border_details']['mbw']['RB'], $cbord['border_details']['mbw']['LB']); + } + if ($this->packTableData) { $cells[$i][$j-1]['borderbin'] = $this->_packCellBorder($celladj); } + unset($celladj); + } + + + // Update maximum cell border width at LRTB edges of table - used for overall table width + if ($j == 0 && $cbord['border_details']['L']['w']) { + $table['max_cell_border_width']['L'] = max($table['max_cell_border_width']['L'],$cbord['border_details']['L']['w']); + } + if (($j == ($numcols-1) || ($j+$ccolsp) == $numcols ) && $cbord['border_details']['R']['w']) { + $table['max_cell_border_width']['R'] = max($table['max_cell_border_width']['R'],$cbord['border_details']['R']['w']); + } + if ($i == 0 && $cbord['border_details']['T']['w']) { + $table['max_cell_border_width']['T'] = max($table['max_cell_border_width']['T'],$cbord['border_details']['T']['w']); + } + if (($i == ($numrows-1) || ($i+$crowsp) == $numrows ) && $cbord['border_details']['B']['w']) { + $table['max_cell_border_width']['B'] = max($table['max_cell_border_width']['B'],$cbord['border_details']['B']['w']); + } + } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + if ($this->packTableData) { $cell['borderbin'] = $this->_packCellBorder($cbord); } + + if ($this->cacheTables) { + $this->_cacheUpdateBorder($cell, $fh, $table['cells'][$i][$j]); + } + unset($cbord ); + unset($cell ); + } + } + } + if ($this->cacheTables) { fclose($fh); } + unset($cell ); +} +// END FIX BORDERS ************************************************************************************ + + +function _reverseTableDir(&$table) { + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + for( $i = 0 ; $i < $numrows ; $i++ ) { //Rows + $row = array(); + for( $j = ($numcols-1) ; $j >= 0 ; $j-- ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + $col = $numcols - $j - 1; + if (isset($cell['colspan']) && $cell['colspan'] > 1) { $col -= ($cell['colspan']-1); } + // Nested content + for ($n=0; $n < count($cell['textbuffer']); $n++) { + $t = $cell['textbuffer'][$n][0]; + if (substr($t,0,19) == "\xbb\xa4\xactype=nestedtable") { + $objattr = $this->_getObjAttr($t); + $objattr['col'] = $col; + $cell['textbuffer'][$n][0] = "\xbb\xa4\xactype=nestedtable,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $this->table[($this->tableLevel+1)][$objattr['nestedcontent']]['nestedpos'][1] = $col; + if ($this->cacheTables) { + $this->_cacheUpdateTxB($cell, $fh, $table['cells'][$i][$j]); + } + } + } + $row[$col] = $cells[$i][$j]; + unset($cell); + } + } + for($f=0; $f < $numcols; $f++) { + if (!isset($row[$f])) { $row[$f] = 0; } + } + $table['cells'][$i] = $row; + } + if ($this->cacheTables) { fclose($fh); } +} + + +function _tableWrite(&$table, $split=false, $startrow=0, $startcol=0, $splitpg=0, $rety = 0){ + $level = $table['level']; + $levelid = $table['levelid']; + + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + + if ($this->ColActive && $level==1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + if (!$split || ($startrow==0 && $splitpg==0) || $startrow>0){ + // TABLE TOP MARGIN + if ($table['margin']['T']) { + if (!$this->table_rotate && $level==1) { + $this->DivLn($table['margin']['T'],$this->blklvl,true,1); // collapsible + } + else { + $this->y += ($table['margin']['T']); + } + } + // Advance down page by half width of top border + if ($table['borders_separate']) { + if ($startrow>0 && (!isset($table['is_thead']) || count($table['is_thead'])==0)) + $adv = $table['border_spacing_V']/2; + else + $adv = $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; + } + else { + $adv = $table['max_cell_border_width']['T']/2; + } + if (!$this->table_rotate && $level==1) { $this->DivLn($adv); } + else { $this->y += $adv; } + } + + if ($level==1) { + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; + $x0 = $this->x; + $y0 = $this->y; + $right = $x0 + $this->blk[$this->blklvl]['inner_width']; + $outerfilled = $this->y; // Keep track of how far down the outer DIV bgcolor is painted (NB rowspans) + $this->outerfilled = $this->y; + $this->colsums = array(); + } + else { + $x0 = $this->x; + $y0 = $this->y; + $right = $x0 + $table['w']; + } + + if ($this->table_rotate) { + $temppgwidth = $this->tbrot_maxw; + $this->PageBreakTrigger = $pagetrigger = $y0 + ($this->blk[$this->blklvl]['inner_width']); + if ($level==1) { + $this->tbrot_y0 = $this->y - $adv - $table['margin']['T'] ; + $this->tbrot_x0 = $this->x; + $this->tbrot_w = $table['w']; + if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; } + else { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['max_cell_border_width']['T']; } + } + } + else { + $this->PageBreakTrigger = $pagetrigger = ($this->h - $this->bMargin); + if ($level==1) { + $temppgwidth = $this->blk[$this->blklvl]['inner_width']; + if (isset($table['a']) and ($table['w'] < $this->blk[$this->blklvl]['inner_width'])) { + if ($table['a']=='C') { $x0 += ((($right-$x0) - $table['w'])/2); } + else if ($table['a']=='R') { $x0 = $right - $table['w']; } + } + } + else { + $temppgwidth = $table['w']; + } + } + if(!isset($table['overflow'])) { $table['overflow'] = null; } + if ($table['overflow']=='hidden' && $level==1 && !$this->table_rotate && !$this->ColActive) { + //Bounding rectangle to clip + $this->tableClipPath = sprintf('q %.3F %.3F %.3F %.3F re W n',$x0*_MPDFK,$this->h*_MPDFK,$this->blk[$this->blklvl]['inner_width']*_MPDFK,-$this->h*_MPDFK); + $this->_out($this->tableClipPath); + } + else { $this->tableClipPath = ''; } + + + if ($table['borders_separate']) { $indent = $table['margin']['L'] + $table['border_details']['L']['w'] + $table['padding']['L'] + $table['border_spacing_H']/2; } + else { $indent = $table['margin']['L'] + $table['max_cell_border_width']['L']/2; } + $x0 += $indent; + + $returny = 0; + $lastCol = 0; + $tableheader = array(); + $tablefooter = array(); + $tableheaderrowheight = 0; + $tablefooterrowheight = 0; + $footery = 0; + + // mPD 3.0 Set the Page & Column where table starts + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $tablestartpage = 'EVEN'; + } + else if (($this->mirrorMargins) && (($this->page)%2==1)) { // ODD + $tablestartpage = 'ODD'; + } + else { $tablestartpage = ''; } + if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } + else { $tablestartcolumn = ''; } + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + $y = $h = 0; + for( $i = 0; $i < $numrows ; $i++ ) { //Rows + if ($this->progressBar) { $this->UpdateProgressBar(7,intval(30 + ($i*40/$numrows)),' '); } // *PROGRESS-BAR* + if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i] && $level==1) { + $tablefooterrowheight += $table['hr'][$i]; + $tablefooter[$i][0]['trbackground-images'] = $table['trbackground-images'][$i]; + $tablefooter[$i][0]['trgradients'] = $table['trgradients'][$i]; + $tablefooter[$i][0]['trbgcolor'] = $table['bgcolor'][$i]; + for( $j = $startcol ; $j < $numcols ; $j++ ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($split) { + if ($table['colPg'][$j] != $splitpg) { continue; } + list($x,$w) = $this->_splitTableGetWidth($table, $i, $j, $fh); + $js = $j - $startcol; + } + else { + list($x,$w) = $this->_tableGetWidth($table, $i, $j, $fh); + $js = $j; + } + + list($y,$h) = $this->_tableGetHeight($table, $i, $j, $fh); + $x += $x0; + $y += $y0; + //Get info of tfoot ==>> table footer + $tablefooter[$i][$js]['x'] = $x; + $tablefooter[$i][$js]['y'] = $y; + $tablefooter[$i][$js]['h'] = $h; + $tablefooter[$i][$js]['w'] = $w; + if (isset($cell['textbuffer'])) { $tablefooter[$i][$js]['textbuffer'] = $cell['textbuffer']; } + else { $tablefooter[$i][$js]['textbuffer'] = ''; } + $tablefooter[$i][$js]['a'] = $cell['a']; + $tablefooter[$i][$js]['R'] = $cell['R']; + $tablefooter[$i][$js]['va'] = $cell['va']; + $tablefooter[$i][$js]['mih'] = $cell['mih']; + $tablefooter[$i][$js]['gradient'] = $cell['gradient']; // *BACKGROUNDS* + $tablefooter[$i][$js]['background-image'] = $cell['background-image']; // *BACKGROUNDS* + //CELL FILL BGCOLOR + if (!$this->simpleTables){ + if ($this->packTableData) { + $c = $this->_unpackCellBorder($cell['borderbin']); + $tablefooter[$i][$js]['border'] = $c['border']; + $tablefooter[$i][$js]['border_details'] = $c['border_details']; + } + else { + $tablefooter[$i][$js]['border'] = $cell['border']; + $tablefooter[$i][$js]['border_details'] = $cell['border_details']; + } + } + else if ($this->simpleTables){ + $tablefooter[$i][$js]['border'] = $table['simple']['border']; + $tablefooter[$i][$js]['border_details'] = $table['simple']['border_details']; + } + $tablefooter[$i][$js]['bgcolor'] = $cell['bgcolor']; + $tablefooter[$i][$js]['padding'] = $cell['padding']; + $tablefooter[$i][$js]['rowspan'] = $cell['rowspan']; + $tablefooter[$i][$js]['colspan'] = $cell['colspan']; + } + } + } + } + + if ($level==1) { $this->_out('___TABLE___BACKGROUNDS'.date('jY')); } + $tableheaderadj = 0; + $tablefooteradj = 0; + + $tablestartpageno = $this->page; + + //Draw Table Contents and Borders + for( $i = 0; $i < $numrows ; $i++ ) { //Rows + if ($split && $startrow > 0) { + $thnr = (isset($table['is_thead']) ? count($table['is_thead']) : 0); + if ($i >= $thnr && $i < $startrow) { continue; } + if ($i == $startrow){ $returny = $rety - $tableheaderrowheight; } + } + + // Get Maximum row/cell height in row - including rowspan>1 + 1 overlapping + $maxrowheight = $this->_tableGetMaxRowHeight($table, $i, $fh); + + $skippage = false; + $newpagestarted = false; + for( $j = $startcol ; $j < $numcols ; $j++ ) { //Columns + if ($split) { + if ($table['colPg'][$j] > $splitpg) { break; } + $lastCol = $j; + } + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($split) { + $lastCol = $j + (isset($cell['colspan']) ? ($cell['colspan']-1) : 0) ; + list($x,$w) = $this->_splitTableGetWidth($table, $i, $j, $fh); + } + else { list($x,$w) = $this->_tableGetWidth($table, $i, $j, $fh); } + + list($y,$h) = $this->_tableGetHeight($table, $i, $j, $fh); + $x += $x0; + $y += $y0; + $y -= $returny; + + if ($table['borders_separate']) { + if (!empty($tablefooter) || $i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i+1) == $numrows) ) { + $extra = $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + //$extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { $extra = $table['max_cell_border_width']['B']/2; } + + if ($j==$startcol && ((($y + $maxrowheight + $extra ) > ($pagetrigger+0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel==1 && $i < ($numrows - $table['headernrows']))) && ($y0 >0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak ) { + + if (!$skippage) { + $finalSpread = true; + $firstSpread = true; + if ($split) { + for($t=$startcol; $t<$numcols; $t++) { + // Are there more columns to print on a next page? + if ($table['colPg'][$t] > $splitpg) { + $finalSpread = false; + break; + } + } + if ($startcol>0) { $firstSpread = false; } + } + + if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0 ) { + $this->y = $y; + $ya = $this->y; + $this->TableHeaderFooter($tablefooter,$tablestartpage,$tablestartcolumn,'F',$level, $firstSpread, $finalSpread); + if ($this->table_rotate) { + $this->tbrot_h += $this->y - $ya ; + } + $tablefooteradj = $this->y - $ya ; + } + $y -= $y0; + $returny += $y; + + $oldcolumn = $this->CurrCol; + if ($this->AcceptPageBreak()) { + $newpagestarted = true; + $this->y = $y + $y0; + + // Move down to account for border-spacing or + // extra half border width in case page breaks in middle + if($i>0 && !$this->table_rotate && $level==1 && !$this->ColActive) { + if ($table['borders_separate']) { + $adv = $table['border_spacing_V']/2; + // If table footer + if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0 ) { + $adv += ($table['padding']['B'] + $table['border_details']['B']['w']); + } + } + else { + $maxbwtop = 0; + $maxbwbottom = 0; + if (!$this->simpleTables){ + if (!empty($tablefooter)) { $maxbwbottom = $table['max_cell_border_width']['B']; } + else { + $brow = $i-1; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$brow][$ctj]) && $cells[$brow][$ctj]) { + if ($this->cacheTables) { + $cadj = $this->_uncacheCell($table['cells'][$brow][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cadj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$brow][$ctj]['borderbin']); + } + else { + $bb = $cells[$brow][$ctj]['border_details']['B']['w']; + } + $maxbwbottom = max($maxbwbottom , $bb); + } + } + } + if (!empty($tableheader)) { $maxbwtop = $table['max_cell_border_width']['T']; } + else { + $trow = $i-1; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$trow][$ctj]) && $cells[$trow][$ctj]) { + if ($this->cacheTables) { + $cadj = $this->_uncacheCell($table['cells'][$trow][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cadj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$trow][$ctj]['borderbin']); + } + else { + $bt = $cells[$trow][$ctj]['border_details']['T']['w']; + } + $maxbwtop = max($maxbwtop , $bt); + } + } + } + } + else if ($this->simpleTables){ + $maxbwtop = $table['simple']['border_details']['T']['w']; + $maxbwbottom = $table['simple']['border_details']['B']['w']; + } + $adv = $maxbwbottom /2; + } + $this->y += $adv; + } + + // Rotated table split over pages - needs this->y for borders/backgrounds + if($i>0 && $this->table_rotate && $level==1) { + // $this->y = $y0 + $this->tbrot_w; + } + + if ($this->tableClipPath ) { $this->_out("Q"); } + + $bx = $x0; + $by = $y0; + + if ($table['borders_separate']) { + $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']/2); + if ($tablestartpageno != $this->page) { // IF already broken across a previous pagebreak + $by += $table['max_cell_border_width']['T']/2; + if (empty($tableheader)) { $by -= ($table['border_spacing_V']/2); } + } + else { + $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2); + } + } + + else if ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop /2; } + + $by -= $tableheaderadj; + $bh = $this->y - $by + $tablefooteradj; + if (!$table['borders_separate']) { $bh -= $adv ; } + if ($split) { + $bw = 0; + for($t=$startcol; $t<$numcols; $t++) { + if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } + if ($table['colPg'][$t] > $splitpg) { break; } + } + if ($table['borders_separate']) { + if ($firstSpread) { + $bw += $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']; + } + else { + $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); + $bw += $table['border_spacing_H']; + } + if ($finalSpread) { + $bw += $table['padding']['R'] + $table['border_details']['R']['w']/2 + $table['border_spacing_H']; + } + } + } + else { + $bw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + } + + // mPDF 5.4.16 + if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tablefooter) && $i > 0 && $table['border_details']['B']['w']) { + $prevDrawColor = $this->DrawColor; + $lw = $this->LineWidth; + $this->SetLineWidth($this->splitTableBorderWidth); + $this->SetDColor($table['border_details']['B']['c']); + $this->SetLineJoin(0); + $this->SetLineCap(0); + $blx = $bx; + $blw = $bw; + if (!$table['borders_separate']) { + $blx -= ($table['max_cell_border_width']['L']/2); + $blw += ($table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2); + } + $this->Line($blx,$this->y+($this->splitTableBorderWidth/2),$blx+$blw,$this->y+($this->splitTableBorderWidth/2)); + $this->DrawColor = $prevDrawColor; + $this->_out($this->DrawColor); + $this->SetLineWidth($lw); + $this->SetLineJoin(2); + $this->SetLineCap(2); + } + + if (!$this->ColActive && ($i > 0 || $j > 0)) { + if (isset($table['bgcolor'][-1])) { + $color = $this->ConvertColor($table['bgcolor'][-1]); + if ($color) { + if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B']/2; } + $this->tableBackgrounds[$level*9][] = array('gradient'=>false, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'col'=>$color); + } + } + +/*-- BACKGROUNDS --*/ + if (isset($table['gradient'])) { + $g = $this->grad->parseBackgroundGradient($table['gradient']); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + + if (isset($table['background-image'])) { + if ($table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['background-image']['gradient'] ); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + else { + $image_id = $table['background-image']['image_id']; + $orig_w = $table['background-image']['orig_w']; + $orig_h = $table['background-image']['orig_h']; + $x_pos = $table['background-image']['x_pos']; + $y_pos = $table['background-image']['y_pos']; + $x_repeat = $table['background-image']['x_repeat']; + $y_repeat = $table['background-image']['y_repeat']; + $resize = $table['background-image']['resize']; + $opacity = $table['background-image']['opacity']; + $itype = $table['background-image']['itype']; + $this->tableBackgrounds[$level*9+2][] = array('x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } +/*-- END BACKGROUNDS --*/ + } + + // $this->AcceptPageBreak() has moved tablebuffer to $this->pages content + if ($this->tableBackgrounds) { + $s = $this->PrintTableBackgrounds(); + if ($this->bufferoutput) { + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->headerbuffer); + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->headerbuffer ); + } + else { + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->pages[$this->page]); + } + $this->tableBackgrounds = array(); + } + + if ($split) { + if ($i == 0 && $j == 0) { $y0 = -1; } + else if ($finalSpread) { + $splitpg = 0; + $startcol = 0; + $startrow = $i; + } + else { + $splitpg++; + $startcol = $t; + $returny -= $y; + } + return array(false, $startrow, $startcol, $splitpg, $returny, $y0); + } + + $this->AddPage($this->CurOrientation); + + $this->_out('___TABLE___BACKGROUNDS'.date('jY')); + + + if ($this->tableClipPath ) { $this->_out($this->tableClipPath); } + + // Added to correct for OddEven Margins + $x= $x + $this->MarginCorrection; + $x0= $x0 + $this->MarginCorrection; + + // mPDF 5.4.16 + if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tableheader) && $i > 0 && $table['border_details']['T']['w'] ) { + $prevDrawColor = $this->DrawColor; + $lw = $this->LineWidth; + $this->SetLineWidth($this->splitTableBorderWidth); + $this->SetDColor($table['border_details']['T']['c']); + $this->SetLineJoin(0); + $this->SetLineCap(0); + $blx += $this->MarginCorrection; + $this->Line($blx,$this->y-($this->splitTableBorderWidth/2),$blx+$blw,$this->y-($this->splitTableBorderWidth/2)); + $this->DrawColor = $prevDrawColor; + $this->_out($this->DrawColor); + $this->SetLineWidth($lw); + $this->SetLineJoin(2); + $this->SetLineCap(2); + } + + // Move down to account for half of top border-spacing or + // extra half border width in case page was broken in middle + if($i>0 && !$this->table_rotate && $level==1 && $table['headernrows']==0) { + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2; } + else { + $maxbwtop = 0; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$i][$ctj]) && $cells[$i][$ctj]) { + if (!$this->simpleTables){ + if ($this->cacheTables) { + $celltj = $this->_uncacheCell($table['cells'][$i][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($celltj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$i][$ctj]['borderbin']); + } + else { + $bt = $cells[$i][$ctj]['border_details']['T']['w']; + } + $maxbwtop = max($maxbwtop, $bt); + } + else if ($this->simpleTables){ + $maxbwtop = max($maxbwtop, $table['simple']['border_details']['T']['w']); + } + } + } + $adv = $maxbwtop /2; + } + $this->y += $adv; + } + + + if ($this->table_rotate) { + $this->tbrot_x0 = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; + if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; } + else { $this->tbrot_h = $table['margin']['T'] + $table['max_cell_border_width']['T'] ; } + $this->tbrot_y0 = $this->y; + $pagetrigger = $y0 - $tableheaderadj + ($this->blk[$this->blklvl]['inner_width']); + } + else { + $pagetrigger = $this->PageBreakTrigger; + } + + if ($this->kwt_saved && $level==1) { + $this->kwt_moved = true; + } + + + // Disable Table header repeat if Keep Block together + if (!$this->keep_block_together && !empty($tableheader)) { + $ya = $this->y; + $this->TableHeaderFooter($tableheader,$tablestartpage,$tablestartcolumn,'H',$level); + if ($this->table_rotate) { + $this->tbrot_h = $this->y - $ya ; + } + $tableheaderadj = $this->y - $ya ; + } + + else if ($i==0 && !$this->keep_block_together && !$this->table_rotate && $level==1 && !$this->ColActive) { + // Advance down page + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2 + $table['border_details']['T']['w'] + $table['padding']['T']; } + else { $adv = $table['max_cell_border_width']['T'] /2 ; } + if ($adv) { + if ($this->table_rotate) { + $this->y += ($adv); + } + else { + $this->DivLn($adv,$this->blklvl,true); + } + } + } + + $outerfilled = 0; + $y = $y0 = $this->y; + } + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + // Added to correct for Columns + $x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $x0 += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + if ($this->CurrCol == 0) { // just added a page - possibly with tableheader + $y0 = $this->y; // this->y0 is global used by Columns - $y0 is internal to tablewrite + } + else { + $y0 = $this->y0; // this->y0 is global used by Columns - $y0 is internal to tablewrite + } + $y = $y0; + $outerfilled = 0; + if ($this->CurrCol != 0 && ($this->keepColumns && $this->ColActive) && !empty($tableheader) && $i > 0 ) { + $this->x = $x; + $this->y = $y; + $this->TableHeaderFooter($tableheader,$tablestartpage,$tablestartcolumn,'H',$level); + $y0 = $y=$this->y; + } + } +/*-- END COLUMNS --*/ + } + $skippage = true; + } + + $this->x = $x; + $this->y = $y; + + if ($this->kwt_saved && $level==1) { + $this->printkwtbuffer(); + $x0 = $x = $this->x; + $y0 = $y = $this->y; + $this->kwt_moved = false; + $this->kwt_saved = false; + } + + + // Set the Page & Column where table actually starts + if ($i==0 && $j==0 && $level==1) { + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $tablestartpage = 'EVEN'; + } + else if (($this->mirrorMargins) && (($this->page)%2==1)) { // ODD + $tablestartpage = 'ODD'; + } + else { $tablestartpage = ''; } + $tablestartpageno = $this->page; + if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } // *COLUMNS* + } + + + //ALIGN + $align = $cell['a']; + + +/*-- COLUMNS --*/ + // If outside columns, this is done in PaintDivBB + if ($this->ColActive) { + //OUTER FILL BGCOLOR of DIVS + if ($this->blklvl > 0 && ($j==0) && !$this->table_rotate && $level==1) { + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl >= $firstblockfill) { + $divh = $maxrowheight; + // Last row + if ((!isset($cell['rowspan']) && $i == $numrows-1) || (isset($cell['rowspan']) && (($i == $numrows-1 && $cell['rowspan']<2) || ($cell['rowspan']>1 && ($i + $cell['rowspan']-1) == $numrows-1)))) { // mPDF 5.6.54 + if ($table['borders_separate']) { + $adv = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $adv = $table['margin']['B'] + $table['max_cell_border_width']['B']/2; + } + $divh += $adv; //last row: fill bottom half of bottom border (y advanced at end) + } + + if (($this->y + $divh) > $outerfilled ) { // if not already painted by previous rowspan + $bak_x = $this->x; + $bak_y = $this->y; + if ($outerfilled > $this->y) { + $divh = ($this->y + $divh) - $outerfilled; + $this->y = $outerfilled; + } + + $this->DivLn($divh,-3,false); + $outerfilled = $this->y + $divh; + // Reset current block fill + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + if ($bcor ) $this->SetFColor($bcor); + $this->x = $bak_x; + $this->y = $bak_y; + } + } + } + } + + + //TABLE BACKGROUND FILL BGCOLOR - for cellSpacing + if ($this->ColActive) { + if ($table['borders_separate']) { + $fill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; + if ($fill) { + $color = $this->ConvertColor($fill); + if ($color) { + $xadj = ($table['border_spacing_H']/2); + $yadj = ($table['border_spacing_V']/2); + $wadj = $table['border_spacing_H']; + $hadj = $table['border_spacing_V']; + if ($i == 0) { // Top + $yadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + $hadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + } + if ($j == 0) { // Left + $xadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + $wadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + } + if ($i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i+1) == $numrows)) { // Bottom + $hadj += $table['padding']['B'] + $table['border_details']['B']['w'] ; + } + if ($j == ($numcols-1) || (isset($cell['colspan']) && ($j+$cell['colspan']) == $numcols) || (!isset($cell['colspan']) && ($j+1) == $numcols)) { // Right + $wadj += $table['padding']['R'] + $table['border_details']['R']['w'] ; + } + $this->SetFColor($color); + $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); + } + } + } + } +/*-- END COLUMNS --*/ + + if ($table['empty_cells']!='hide' || !empty($cell['textbuffer']) || (isset($cell['nestedcontent']) && $cell['nestedcontent']) || !$table['borders_separate'] ) { $paintcell = true; } + else { $paintcell = false; } + + //Set Borders + $bord = 0; + $bord_det = array(); + + if (!$this->simpleTables){ + if ($this->packTableData) { + if ($cell['borderbin']) { + $c = $this->_unpackCellBorder($cell['borderbin']); + $bord = $c['border']; + $bord_det = $c['border_details']; + } + } + else if ($cell['border']) { + $bord = $cell['border']; + $bord_det = $cell['border_details']; + } + } + else if ($this->simpleTables){ + if ($table['simple']['border']) { + $bord = $table['simple']['border']; + $bord_det = $table['simple']['border_details']; + } + } + + //TABLE ROW OR CELL FILL BGCOLOR + $fill = 0; + if (isset($cell['bgcolor']) && $cell['bgcolor'] && $cell['bgcolor']!='transparent') { + $fill = $cell['bgcolor']; + $leveladj = 6; + } + else if (isset($table['bgcolor'][$i]) && $table['bgcolor'][$i] && $table['bgcolor'][$i]!='transparent') { // Row color + $fill = $table['bgcolor'][$i]; + $leveladj = 3; + } + if ($fill && $paintcell) { + $color = $this->ConvertColor($fill); + if ($color) { + if ($table['borders_separate']) { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x+ ($table['border_spacing_H']/2), $y+ ($table['border_spacing_V']/2), $w- $table['border_spacing_H'], $h- $table['border_spacing_V'], 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>($x + ($table['border_spacing_H']/2)), 'y'=>($y + ($table['border_spacing_V']/2)), 'w'=>($w - $table['border_spacing_H']), 'h'=>($h - $table['border_spacing_V']), 'col'=>$color); + } + } + else { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x, $y, $w, $h, 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>$x, 'y'=>$y, 'w'=>$w, 'h'=>$h, 'col'=>$color); + } + } + } + } + +/*-- BACKGROUNDS --*/ + if (isset($cell['gradient']) && $cell['gradient'] && $paintcell){ + $g = $this->grad->parseBackgroundGradient($cell['gradient']); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($cell['background-image']) && $paintcell) { + if ($cell['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $cell['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $cell['background-image']['gradient'] ); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else if ($cell['background-image']['image_id']) { // Background pattern + $n = count($this->patterns)+1; + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($cell['background-image']['orig_w'], $cell['background-image']['orig_h'], $pw, $ph, $cell['background-image']['resize'], $cell['background-image']['x_repeat'], $cell['background-image']['y_repeat']); + $this->patterns[$n] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'pgh'=>$this->h, 'image_id'=>$cell['background-image']['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$cell['background-image']['x_pos'] , 'y_pos'=>$cell['background-image']['y_pos'] , 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat); + if ($cell['background-image']['opacity']>0 && $cell['background-image']['opacity']<1) { $opac = $this->SetAlpha($cell['background-image']['opacity'],'Normal',true); } + else { $opac = ''; } + $this->_out(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px*_MPDFK, ($this->h-$py)*_MPDFK, $pw*_MPDFK, -$ph*_MPDFK)); + } + else { + $image_id = $cell['background-image']['image_id']; + $orig_w = $cell['background-image']['orig_w']; + $orig_h = $cell['background-image']['orig_h']; + $x_pos = $cell['background-image']['x_pos']; + $y_pos = $cell['background-image']['y_pos']; + $x_repeat = $cell['background-image']['x_repeat']; + $y_repeat = $cell['background-image']['y_repeat']; + $resize = $cell['background-image']['resize']; + $opacity = $cell['background-image']['opacity']; + $itype = $cell['background-image']['itype']; + $this->tableBackgrounds[$level*9+8][] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } +/*-- END BACKGROUNDS --*/ + + if (isset($cell['colspan']) && $cell['colspan']>1) { $ccolsp = $cell['colspan']; } + else { $ccolsp = 1; } + if (isset($cell['rowspan']) && $cell['rowspan']>1) { $crowsp = $cell['rowspan']; } + else { $crowsp = 1; } + + + // but still need to do this for repeated headers... + if (!$table['borders_separate'] && $this->tabletheadjustfinished && !$this->simpleTables){ + if (isset($table['topntail']) && $table['topntail']) { + $bord_det['T'] = $this->border_details($table['topntail']); + $bord_det['T']['w'] /= $this->shrin_k; + $this->setBorder($bord, _BORDER_TOP); + } + if (isset($table['thead-underline']) && $table['thead-underline']) { + $bord_det['T'] = $this->border_details($table['thead-underline']); + $bord_det['T']['w'] /= $this->shrin_k; + $this->setBorder($bord, _BORDER_TOP); + } + } + + + //Get info of first row ==>> table header + //Use > 1 row if THEAD + if (isset($table['is_thead'][$i]) && $table['is_thead'][$i] && $level==1) { + if ($j==0) $tableheaderrowheight += $table['hr'][$i]; + $tableheader[$i][0]['trbackground-images'] = (isset($table['trbackground-images'][$i]) ? $table['trbackground-images'][$i] : null); + $tableheader[$i][0]['trgradients'] = (isset($table['trgradients'][$i]) ? $table['trgradients'][$i] : null); + $tableheader[$i][0]['trbgcolor'] = (isset($table['bgcolor'][$i]) ? $table['bgcolor'][$i] : null); + $tableheader[$i][$j]['x'] = $x; + $tableheader[$i][$j]['y'] = $y; + $tableheader[$i][$j]['h'] = $h; + $tableheader[$i][$j]['w'] = $w; + if (isset($cell['textbuffer'])) { $tableheader[$i][$j]['textbuffer'] = $cell['textbuffer']; } + else { $tableheader[$i][$j]['textbuffer'] = ''; } + $tableheader[$i][$j]['a'] = $cell['a']; + $tableheader[$i][$j]['R'] = $cell['R']; + + $tableheader[$i][$j]['va'] = $cell['va']; + $tableheader[$i][$j]['mih'] = $cell['mih']; + $tableheader[$i][$j]['gradient'] = (isset($cell['gradient']) ? $cell['gradient'] : null); // *BACKGROUNDS* + $tableheader[$i][$j]['background-image'] = (isset($cell['background-image']) ? $cell['background-image'] : null); // *BACKGROUNDS* + $tableheader[$i][$j]['rowspan'] = (isset($cell['rowspan']) ? $cell['rowspan'] : null); + $tableheader[$i][$j]['colspan'] = (isset($cell['colspan']) ? $cell['colspan'] : null); + $tableheader[$i][$j]['bgcolor'] = $cell['bgcolor']; + + if (!$this->simpleTables){ + $tableheader[$i][$j]['border'] = $bord; + $tableheader[$i][$j]['border_details'] = $bord_det; + } + else if ($this->simpleTables){ + $tableheader[$i][$j]['border'] = $table['simple']['border']; + $tableheader[$i][$j]['border_details'] = $table['simple']['border_details']; + } + $tableheader[$i][$j]['padding'] = $cell['padding']; + } + + // CELL BORDER + if ($bord || $bord_det) { + if ($table['borders_separate'] && $paintcell) { + $this->_tableRect($x + ($table['border_spacing_H']/2)+($bord_det['L']['w'] /2), $y+ ($table['border_spacing_V']/2)+($bord_det['T']['w'] /2), $w-$table['border_spacing_H']-($bord_det['L']['w'] /2)-($bord_det['R']['w'] /2), $h- $table['border_spacing_V']-($bord_det['T']['w'] /2)-($bord_det['B']['w']/2), $bord, $bord_det, false, $table['borders_separate']); + } + else if (!$table['borders_separate']) { + $this->_tableRect($x, $y, $w, $h, $bord, $bord_det, true, $table['borders_separate']); // true causes buffer + } + + } + + //VERTICAL ALIGN + if ($cell['R'] && INTVAL($cell['R']) > 0 && INTVAL($cell['R']) < 90 && isset($cell['va']) && $cell['va']!='B') { $cell['va']='B';} + if (!isset($cell['va']) || $cell['va']=='M') $this->y += ($h-$cell['mih'])/2; + elseif (isset($cell['va']) && $cell['va']=='B') $this->y += $h-$cell['mih']; + + // NESTED CONTENT + + // TEXT (and nested tables) + $this->divalign=$align; + + $this->divwidth=$w; + if (!empty($cell['textbuffer'])) { + if ($level==1) { + if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { + if (preg_match('/{colsum([0-9]*)[_]*}/', $cell['textbuffer'][0][0], $m)) { + $rep = sprintf("%01.".intval($m[1])."f", $this->colsums[$j]); + $cell['textbuffer'][0][0] = preg_replace('/{colsum[0-9_]*}/', $rep ,$cell['textbuffer'][0][0]); + } + } + else if (!isset($table['is_thead'][$i])) { $this->colsums[$j] += floatval(preg_replace('/^[^0-9\.\,]*/','',$cell['textbuffer'][0][0])); } // mPDF 5.6.66 + } + $opy = $this->y; + // mPDF ITERATION + if ($this->iterationCounter) { + foreach($cell['textbuffer'] AS $k=>$t) { + if (preg_match('/{iteration ([a-zA-Z0-9_]+)}/',$t[0], $m)) { + $vname = '__'.$m[1].'_'; + if (!isset($this->$vname)) { $this->$vname = 1; } + else { $this->$vname++; } + $cell['textbuffer'][$k][0] = preg_replace('/{iteration '.$m[1].'}/', $this->$vname, $cell['textbuffer'][$k][0]); + } + } + } + + + if ($cell['R']) { + $cellPtSize = $cell['textbuffer'][0][11] / $this->shrin_k; + if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } + $cellFontHeight = ($cellPtSize/_MPDFK); + $opx = $this->x; + $angle = INTVAL($cell['R']); + // Only allow 45 to 89 degrees (when bottom-aligned) or exactly 90 or -90 + if ($angle > 90) { $angle = 90; } + else if ($angle > 0 && $angle <45) { $angle = 45; } + else if ($angle < 0) { $angle = -90; } + $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); + if (isset($cell['a']) && $cell['a']=='R') { + $this->x += ($w) + ($offset) - ($cellFontHeight/3) - ($cell['padding']['R'] + ($table['border_spacing_H']/2)); + } + else if (!isset($cell['a']) || $cell['a']=='C') { + $this->x += ($w/2) + ($offset); + } + else { + $this->x += ($offset) + ($cellFontHeight/3)+($cell['padding']['L'] +($table['border_spacing_H']/2)); + } + $str = ''; + foreach($cell['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + if (!isset($cell['va']) || $cell['va']=='M') { + $this->y -= ($h-$cell['mih'])/2; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += (($h-$cell['mih'])/2) + $cell['padding']['T'] + ($cell['mih']-($cell['padding']['T'] + $cell['padding']['B'])); } + else if ($angle < 0) { $this->y += (($h-$cell['mih'])/2)+ ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + elseif (isset($cell['va']) && $cell['va']=='B') { + $this->y -= $h-$cell['mih']; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += $h-($cell['padding']['B'] + ($table['border_spacing_V']/2)); } + else if ($angle < 0) { $this->y += $h-$cell['mih'] + ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + elseif (isset($cell['va']) && $cell['va']=='T') { + if ($angle > 0) { $this->y += $cell['mih']-($cell['padding']['B'] + ($table['border_spacing_V']/2)); } + else if ($angle < 0) { $this->y += ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + $this->Rotate($angle,$this->x,$this->y); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + if (!empty($cell['textbuffer'][0][3])) { //Font Color + $cor = $cell['textbuffer'][0][3]; + $this->SetTColor($cor); + } + $s_str = $this->strike; + $this->strike = $cell['textbuffer'][0][8]; //Strikethrough + $this->SetFont($cell['textbuffer'][0][4],$cell['textbuffer'][0][2],$cellPtSize,true,true); + $this->Text($this->x,$this->y,$str); + $this->Rotate(0); + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $this->SetTColor(0); + $this->strike = $s_str; + $this->x = $opx; + } + else { + + if (!$this->simpleTables){ + if ($bord_det) { + $btlw = $bord_det['L']['w']; + $btrw = $bord_det['R']['w']; + $bttw = $bord_det['T']['w']; + } + else { + $btlw = 0; + $btrw = 0; + $bttw = 0; + } + if ($table['borders_separate']) { + $xadj = $btlw + $cell['padding']['L'] +($table['border_spacing_H']/2); + $wadj = $btlw + $btrw + $cell['padding']['L'] +$cell['padding']['R'] + $table['border_spacing_H']; + $yadj = $bttw + $cell['padding']['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $btlw/2 + $cell['padding']['L']; + $wadj = ($btlw + $btrw)/2 + $cell['padding']['L'] + $cell['padding']['R']; + $yadj = $bttw/2 + $cell['padding']['T']; + } + } + else if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $xadj = $table['simple']['border_details']['L']['w'] + $cell['padding']['L'] +($table['border_spacing_H']/2); + $wadj = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $cell['padding']['L'] +$cell['padding']['R'] + $table['border_spacing_H']; + $yadj = $table['simple']['border_details']['T']['w'] + $cell['padding']['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $table['simple']['border_details']['L']['w']/2 + $cell['padding']['L']; + $wadj = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'])/2 + $cell['padding']['L'] + $cell['padding']['R']; + $yadj = $table['simple']['border_details']['T']['w']/2 + $cell['padding']['T']; + } + } + // mPDF 5.6.13 + $this->decimal_offset = 0; + if(substr($cell['a'],0,1) == 'D') { + if ($cell['colspan'] > 1) { $this->divalign = $c['a'] = substr($cell['a'],2,1); } + else { + $smax = $table['decimal_align'][$j]['maxs0']; + $d_content = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1']; + $this->decimal_offset = $smax; + $extra = ($w - $d_content - $wadj); + if ($extra > 0) { + if(substr($cell['a'],2,1) == 'R') { $this->decimal_offset += $extra; } + else if(substr($cell['a'],2,1) == 'C') { $this->decimal_offset += ($extra)/2; } + } + } + } + $this->divwidth=$w-$wadj; + if ($this->divwidth == 0) { $this->divwidth = 0.0001; } + $this->x += $xadj; + $this->y += $yadj; + $this->printbuffer($cell['textbuffer'],'',true); + } + $this->y = $opy; + } + +/*-- BACKGROUNDS --*/ + if (!$this->ColActive) { + if (isset($table['trgradients'][$i]) && ($j==0 || $table['borders_separate'])) { + $g = $this->grad->parseBackgroundGradient($table['trgradients'][$i]); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + if (isset($table['trbackground-images'][$i]) && ($j==0 || $table['borders_separate'])) { + if ($table['trbackground-images'][$i]['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['trbackground-images'][$i]['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['trbackground-images'][$i]['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else { + $image_id = $table['trbackground-images'][$i]['image_id']; + $orig_w = $table['trbackground-images'][$i]['orig_w']; + $orig_h = $table['trbackground-images'][$i]['orig_h']; + $x_pos = $table['trbackground-images'][$i]['x_pos']; + $y_pos = $table['trbackground-images'][$i]['y_pos']; + $x_repeat = $table['trbackground-images'][$i]['x_repeat']; + $y_repeat = $table['trbackground-images'][$i]['y_repeat']; + $resize = $table['trbackground-images'][$i]['resize']; + $opacity = $table['trbackground-images'][$i]['opacity']; + $itype = $table['trbackground-images'][$i]['itype']; + $clippath = ''; + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x + ($table['border_spacing_H']/2); + $cly = $y + ($table['border_spacing_V']/2); + $clw = $w - $table['border_spacing_H']; + $clh = $h - $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + else { + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } + } + +/*-- END BACKGROUNDS --*/ + + // TABLE BORDER - if separate + if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { + $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H']/2); + $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H']/2); + $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V']/2); + $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V']/2); + $tbx = $x; + $tby = $y; + $tbw = $w; + $tbh = $h; + $tab_bord = 0; + + $corner = ''; + if ($i == 0) { // Top + $tby -= $halfspaceT + ($table['border_details']['T']['w']/2); + $tbh += $halfspaceT + ($table['border_details']['T']['w']/2); + $this->setBorder($tab_bord , _BORDER_TOP); + $corner .= 'T'; + } + if ($i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows)) { // Bottom + $tbh += $halfspaceB + ($table['border_details']['B']['w']/2); + $this->setBorder($tab_bord , _BORDER_BOTTOM); + $corner .= 'B'; + } + if ($j == 0) { // Left + $tbx -= $halfspaceL + ($table['border_details']['L']['w']/2); + $tbw += $halfspaceL + ($table['border_details']['L']['w']/2); + $this->setBorder($tab_bord , _BORDER_LEFT); + $corner .= 'L'; + } + if ($j == ($numcols-1) || (isset($cell['colspan']) && ($j+$cell['colspan']) == $numcols)) { // Right + $tbw += $halfspaceR + ($table['border_details']['R']['w']/2); + $this->setBorder($tab_bord , _BORDER_RIGHT); + $corner .= 'R'; + } + $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord , $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H'] ); + } + + unset($cell ); + //Reset values + $this->Reset(); + + }//end of (if isset(cells)...) + }// end of columns + + $newpagestarted = false; + $this->tabletheadjustfinished = false; + + if ($this->ColActive && $i < $numrows-1 && $level==1) { $this->breakpoints[$this->CurrCol][] = $y + $h; } // *COLUMNS* + +/*-- COLUMNS --*/ + if ($this->ColActive) { + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } + } +/*-- END COLUMNS --*/ + + if ($i == $numrows-1) { $this->y = $y + $h; } //last row jump (update this->y position) + if ($this->table_rotate && $level==1) { + $this->tbrot_h += $h; + } + + + + }// end of rows + + if ($this->progressBar) { $this->UpdateProgressBar(7,70,' '); } // *PROGRESS-BAR* + + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } + + + if ($this->tableClipPath ) { $this->_out("Q"); } + $this->tableClipPath = ''; + + // Advance down page by half width of bottom border + if ($table['borders_separate']) { $this->y += $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; } + else { $this->y += $table['max_cell_border_width']['B']/2; } + + if ($table['borders_separate'] && $level==1) { $this->tbrot_h += $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; } + else if ($level==1) { $this->tbrot_h += $table['margin']['B'] + $table['max_cell_border_width']['B']/2; } + + $bx = $x0; + $by = $y0; + if ($table['borders_separate']) { + $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']/2); + if ($tablestartpageno != $this->page) { // IF broken across page + $by += $table['max_cell_border_width']['T']/2; + if (empty($tableheader)) { $by -= ($table['border_spacing_V']/2); } + } + else if ($split && $startrow > 0 && empty($tableheader)) { + $by -= ($table['border_spacing_V']/2); + } + else { + $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2); + } + } + else if ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop /2; } + $by -= $tableheaderadj; + $bh = $this->y - $by; + if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B']/2; } + + if ($split) { + $bw = 0; + $finalSpread = true; + for($t=$startcol; $t<$numcols; $t++) { + if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } + if ($table['colPg'][$t] > $splitpg) { $finalSpread = false; break; } + } + if ($startcol==0) { $firstSpread = true; } + else { $firstSpread = false; } + if ($table['borders_separate']) { + $bw += $table['border_spacing_H']; + if ($firstSpread) { + $bw += $table['padding']['L'] + $table['border_details']['L']['w']; + } + else { + $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); + } + if ($finalSpread) { + $bw += $table['padding']['R'] + $table['border_details']['R']['w']; + } + } + } + else { + $bw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + } + + if (!$this->ColActive) { + if (isset($table['bgcolor'][-1])) { + $color = $this->ConvertColor($table['bgcolor'][-1]); + if ($color) { + $this->tableBackgrounds[$level*9][] = array('gradient'=>false, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'col'=>$color); + } + } + +/*-- BACKGROUNDS --*/ + if (isset($table['gradient'])) { + $g = $this->grad->parseBackgroundGradient($table['gradient']); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + + if (isset($table['background-image'])) { + if ($table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['background-image']['gradient'] ); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + else { + $image_id = $table['background-image']['image_id']; + $orig_w = $table['background-image']['orig_w']; + $orig_h = $table['background-image']['orig_h']; + $x_pos = $table['background-image']['x_pos']; + $y_pos = $table['background-image']['y_pos']; + $x_repeat = $table['background-image']['x_repeat']; + $y_repeat = $table['background-image']['y_repeat']; + $resize = $table['background-image']['resize']; + $opacity = $table['background-image']['opacity']; + $itype = $table['background-image']['itype']; + $this->tableBackgrounds[$level*9+2][] = array('x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } +/*-- END BACKGROUNDS --*/ + } + + if ($this->tableBackgrounds && $level == 1) { + $s = $this->PrintTableBackgrounds(); + if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { + $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->tablebuffer); + if ($level == 1) { $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->tablebuffer); } + } + else if ($this->bufferoutput) { + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->headerbuffer); + if ($level == 1) { $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->headerbuffer ); } + } + else { + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + if ($level == 1) { $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->pages[$this->page]); } + } + $this->tableBackgrounds = array(); + } + + + // TABLE BOTTOM MARGIN + if ($table['margin']['B']) { + if (!$this->table_rotate && $level==1) { + $this->DivLn($table['margin']['B'],$this->blklvl,true); // collapsible + } + else { + $this->y += ($table['margin']['B']); + } + } + + if ($this->ColActive && $level==1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + if ($this->cacheTables) { fclose($fh); } + + if ($split) { + // Are there more columns to print on a next page? + if ($lastCol < $numcols-1) { + $splitpg++; + $startcol = $lastCol + 1; + return array(false, $startrow, $startcol, $splitpg, $returny, $y0); + } + else { + if ($this->cacheTables) { + unlink($table['cache']); + @unlink($table['cache'].'.bak'); + } + return array(true,0,0,0); + } + } + if ($this->cacheTables) { + unlink($table['cache']); + @unlink($table['cache'].'.bak'); + } + +}//END OF FUNCTION _tableWrite() + + +/////////////////////////END OF TABLE CODE////////////////////////////////// +/*-- END TABLES --*/ + +function _putextgstates() { + for ($i = 1; $i <= count($this->extgstates); $i++) { + $this->_newobj(); + $this->extgstates[$i]['n'] = $this->n; + $this->_out('<</Type /ExtGState'); + foreach ($this->extgstates[$i]['parms'] as $k=>$v) + $this->_out('/'.$k.' '.$v); + $this->_out('>>'); + $this->_out('endobj'); + } +} + +function _putocg() { + if ($this->hasOC) { // mPDF 5.6.01 + $this->_newobj(); + $this->n_ocg_print=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Print only')); + $this->_out('/Usage <</Print <</PrintState /ON>> /View <</ViewState /OFF>>>>>>'); + $this->_out('endobj'); + $this->_newobj(); + $this->n_ocg_view=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Screen only')); + $this->_out('/Usage <</Print <</PrintState /OFF>> /View <</ViewState /ON>>>>>>'); + $this->_out('endobj'); + $this->_newobj(); + $this->n_ocg_hidden=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Hidden')); + $this->_out('/Usage <</Print <</PrintState /OFF>> /View <</ViewState /OFF>>>>>>'); + $this->_out('endobj'); + } + // mPDF 5.6.01 Add Layers + if (count($this->layers)) { + ksort($this->layers); + foreach($this->layers as $id=>$layer) { + $this->_newobj(); + $this->layers[$id]['n'] = $this->n; + // mPDF 5.6.28 + if (isset($this->layerDetails[$id]['name']) && $this->layerDetails[$id]['name']) { + $name = $this->layerDetails[$id]['name']; + } + else { $name = $layer['name']; } + $this->_out('<</Type /OCG /Name '.$this->_UTF16BEtextstring($name).'>>'); + $this->_out('endobj'); + } + } +} + + +/*-- IMPORTS --*/ + + // from mPDFI + function _putimportedobjects() { + if (is_array($this->parsers) && count($this->parsers) > 0) { + foreach($this->parsers AS $filename => $p) { + $this->current_parser =& $this->parsers[$filename]; + if (is_array($this->_obj_stack[$filename])) { + while($n = key($this->_obj_stack[$filename])) { + $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]); + $this->_newobj($this->_obj_stack[$filename][$n][0]); + if ($nObj[0] == PDF_TYPE_STREAM) { + $this->pdf_write_value($nObj); + } + else { + $this->pdf_write_value($nObj[1]); + } + $this->_out('endobj'); + $this->_obj_stack[$filename][$n] = null; // free memory + unset($this->_obj_stack[$filename][$n]); + reset($this->_obj_stack[$filename]); + } + } + } + } + } + + + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + // Left/Bottom/Right/Top + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + $tpl['box']['x']*_MPDFK, + $tpl['box']['y']*_MPDFK, + ($tpl['box']['x'] + $tpl['box']['w'])*_MPDFK, + ($tpl['box']['y'] + $tpl['box']['h'])*_MPDFK ) + ); + + + if (isset($tpl['box'])) + $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',-$tpl['box']['x']*_MPDFK, -$tpl['box']['y']*_MPDFK)); + $this->_out('/Resources '); + + if (isset($tpl['resources'])) { + $this->current_parser =& $tpl['parser']; + $this->pdf_write_value($tpl['resources']); + } else { + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $itpl) + $this->_out($this->tplprefix.$i.' '.$itpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + } + + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + +/*-- END IMPORTS --*/ + + +function _putpatterns() { + for ($i = 1; $i <= count($this->patterns); $i++) { + $x = $this->patterns[$i]['x']; + $y = $this->patterns[$i]['y']; + $w = $this->patterns[$i]['w']; + $h = $this->patterns[$i]['h']; + $pgh = $this->patterns[$i]['pgh']; + $orig_w = $this->patterns[$i]['orig_w']; + $orig_h = $this->patterns[$i]['orig_h']; + $image_id = $this->patterns[$i]['image_id']; + $itype = $this->patterns[$i]['itype']; + $bpa = $this->patterns[$i]['bpa']; // mPDF 5.6.10 background positioning area + + if ($this->patterns[$i]['x_repeat']) { $x_repeat = true; } + else { $x_repeat = false; } + if ($this->patterns[$i]['y_repeat']) { $y_repeat = true; } + else { $y_repeat = false; } + $x_pos = $this->patterns[$i]['x_pos']; + if (stristr($x_pos ,'%') ) { + $x_pos += 0; + $x_pos /= 100; + if (isset($bpa['w']) && $bpa['w']) $x_pos = ($bpa['w'] * $x_pos) - ($orig_w/_MPDFK * $x_pos); // mPDF 5.6.10 + else $x_pos = ($w * $x_pos) - ($orig_w/_MPDFK * $x_pos); + } + $y_pos = $this->patterns[$i]['y_pos']; + if (stristr($y_pos ,'%') ) { + $y_pos += 0; + $y_pos /= 100; + if (isset($bpa['h']) && $bpa['h']) $y_pos = ($bpa['h'] * $y_pos) - ($orig_h/_MPDFK * $y_pos); // mPDF 5.6.10 + else $y_pos = ($h * $y_pos) - ($orig_h/_MPDFK * $y_pos); + } + if (isset($bpa['x']) && $bpa['x']) $adj_x = ($x_pos + $bpa['x']) *_MPDFK; // mPDF 5.6.10 + else $adj_x = ($x_pos + $x) *_MPDFK; + if (isset($bpa['y']) && $bpa['y']) $adj_y = (($pgh - $y_pos - $bpa['y'])*_MPDFK) - $orig_h ; // mPDF 5.6.10 + else $adj_y = (($pgh - $y_pos - $y)*_MPDFK) - $orig_h ; + $img_obj = false; + if ($itype == 'svg' || $itype == 'wmf') { + foreach($this->formobjects AS $fo) { + if ($fo['i'] == $image_id) { + $img_obj = $fo['n']; + $fo_w = $fo['w']; + $fo_h = -$fo['h']; + $wmf_x = $fo['x']; + $wmf_y = $fo['y']; + break; + } + } + } + else { + foreach($this->images AS $img) { + if ($img['i'] == $image_id) { $img_obj = $img['n']; break; } + } + } + if (!$img_obj ) { echo "Problem: Image object not found for background pattern ".$img['i']; exit; } + + $this->_newobj(); + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + if ($itype == 'svg' || $itype == 'wmf') { + $this->_out('/XObject <</FO'.$image_id.' '.$img_obj.' 0 R >>'); + // ******* ADD ANY ExtGStates, Shading AND Fonts needed for the FormObject + // Set in classes/svg array['fo'] = true + // Required that _putshaders comes before _putpatterns in _putresources + // This adds any resources associated with any FormObject to every Formobject - overkill but works! + if (count($this->extgstates)) { + $this->_out('/ExtGState <<'); + foreach($this->extgstates as $k=>$extgstate) + if (isset($extgstate['fo']) && $extgstate['fo']) { + if (isset($extgstate['trans'])) $this->_out('/'.$extgstate['trans'].' '.$extgstate['n'].' 0 R'); + else $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R'); + } + $this->_out('>>'); + } +/*-- BACKGROUNDS --*/ + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $this->_out('/Shading <<'); + foreach ($this->gradients as $id => $grad) { + if (isset($grad['fo']) && $grad['fo']) { + $this->_out('/Sh'.$id.' '.$grad['id'].' 0 R'); + } + } + $this->_out('>>'); + } +/*-- END BACKGROUNDS --*/ + $this->_out('/Font <<'); + foreach($this->fonts as $font) { + if (!$font['used'] && $font['type']=='TTF') { continue; } + if (isset($font['fo']) && $font['fo']) { + if ($font['type']=='TTF' && ($font['sip'] || $font['smp'])) { + foreach($font['n'] AS $k => $fid) { + $this->_out('/F'.$font['subsetfontids'][$k].' '.$font['n'][$k].' 0 R'); + } + } + else { + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + } + } + } + $this->_out('>>'); + } + else { + $this->_out('/XObject <</I'.$image_id.' '.$img_obj.' 0 R >>'); + } + $this->_out('>>'); + $this->_out('endobj'); + + $this->_newobj(); + $this->patterns[$i]['n'] = $this->n; + $this->_out('<< /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 2'); + $this->_out('/Resources '. ($this->n-1) .' 0 R'); + + $this->_out(sprintf('/BBox [0 0 %.3F %.3F]',$orig_w,$orig_h)); + if ($x_repeat) { $this->_out(sprintf('/XStep %.3F',$orig_w)); } + else { $this->_out(sprintf('/XStep %d',99999)); } + if ($y_repeat) { $this->_out(sprintf('/YStep %.3F',$orig_h)); } + else { $this->_out(sprintf('/YStep %d',99999)); } + + if ($itype == 'svg' || $itype == 'wmf') { + $this->_out(sprintf('/Matrix [1 0 0 -1 %.3F %.3F]', $adj_x, ($adj_y+$orig_h))); + $s = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q",($orig_w/$fo_w), (-$orig_h/$fo_h), -($orig_w/$fo_w)*$wmf_x, ($orig_w/$fo_w)*$wmf_y, $image_id); + } + else { + $this->_out(sprintf('/Matrix [1 0 0 1 %.3F %.3F]',$adj_x,$adj_y)); + $s = sprintf("q %.3F 0 0 %.3F 0 0 cm /I%d Do Q",$orig_w,$orig_h,$image_id); + } + + if ($this->compress) { + $this->_out('/Filter /FlateDecode'); + $s = gzcompress($s); + } + $this->_out('/Length '.strlen($s).'>>'); + $this->_putstream($s); + $this->_out('endobj'); + } +} + +/*-- BACKGROUNDS --*/ +function _putshaders() { + $maxid = count($this->gradients); //index for transparency gradients + foreach ($this->gradients as $id => $grad) { + if (($grad['type'] == 2 || $grad['type'] == 3) && empty($grad['is_mask'])) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 3'); + $this->_out('/Domain [0 1]'); + $fn = array(); + $bd = array(); + $en = array(); + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $fn[] = ($this->n+1+$i).' 0 R'; + $en[] = '0 1'; + if ($i>0) { $bd[] = sprintf('%.3F', $grad['stops'][$i]['offset']); } + } + $this->_out('/Functions ['.implode(' ',$fn).']'); + $this->_out('/Bounds ['.implode(' ',$bd).']'); + $this->_out('/Encode ['.implode(' ',$en).']'); + $this->_out('>>'); + $this->_out('endobj'); + $f1 = $this->n; + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 2'); + $this->_out('/Domain [0 1]'); + $this->_out('/C0 ['.$grad['stops'][$i]['col'].']'); + $this->_out('/C1 ['.$grad['stops'][$i+1]['col'].']'); + $this->_out('/N 1'); + $this->_out('>>'); + $this->_out('endobj'); + } + } + if ($grad['type'] == 2 || $grad['type'] == 3) { + if (isset($grad['trans']) && $grad['trans']) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 3'); + $this->_out('/Domain [0 1]'); + $fn = array(); + $bd = array(); + $en = array(); + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $fn[] = ($this->n+1+$i).' 0 R'; + $en[] = '0 1'; + if ($i>0) { $bd[] = sprintf('%.3F', $grad['stops'][$i]['offset']); } + } + $this->_out('/Functions ['.implode(' ',$fn).']'); + $this->_out('/Bounds ['.implode(' ',$bd).']'); + $this->_out('/Encode ['.implode(' ',$en).']'); + $this->_out('>>'); + $this->_out('endobj'); + $f2 = $this->n; + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 2'); + $this->_out('/Domain [0 1]'); + $this->_out(sprintf('/C0 [%.3F]', $grad['stops'][$i]['opacity'])); + $this->_out(sprintf('/C1 [%.3F]', $grad['stops'][$i+1]['opacity'])); + $this->_out('/N 1'); + $this->_out('>>'); + $this->_out('endobj'); + } + } + } + + if (empty($grad['is_mask'])) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/ShadingType '.$grad['type']); + if (isset($grad['colorspace'])) { + $this->_out('/ColorSpace /Device'.$grad['colorspace']); // Can use CMYK if all C0 and C1 above have 4 values + } else { + $this->_out('/ColorSpace /DeviceRGB'); + } + if ($grad['type'] == 2) { + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); + $this->_out('/Function '.$f1.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type'] == 3) { + //x0, y0, r0, x1, y1, r1 + //at this this time radius of inner circle is 0 + $ir = 0; + if (isset($grad['coords'][5]) && $grad['coords'][5]) { $ir = $grad['coords'][5]; } + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); + $this->_out('/Function '.$f1.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type']==6) { + $this->_out('/BitsPerCoordinate 16'); + $this->_out('/BitsPerComponent 8'); + if ($grad['colorspace'] == 'CMYK') { $this->_out('/Decode[0 1 0 1 0 1 0 1 0 1 0 1]'); } + else if ($grad['colorspace'] == 'Gray') { $this->_out('/Decode[0 1 0 1 0 1]'); } + else { $this->_out('/Decode[0 1 0 1 0 1 0 1 0 1]'); } + $this->_out('/BitsPerFlag 8'); + $this->_out('/Length '.strlen($grad['stream'])); + $this->_out('>>'); + $this->_putstream($grad['stream']); + } + $this->_out('endobj'); + } + + $this->gradients[$id]['id'] = $this->n; + + // set pattern object + $this->_newobj(); + $out = '<< /Type /Pattern /PatternType 2'; + $out .= ' /Shading '.$this->gradients[$id]['id'].' 0 R'; + $out .= ' >>'; + $out .= "\n".'endobj'; + $this->_out($out); + + + $this->gradients[$id]['pattern'] = $this->n; + + if (isset($grad['trans']) && $grad['trans']) { + // luminosity pattern + $transid = $id + $maxid; + $this->_newobj(); + $this->_out('<<'); + $this->_out('/ShadingType '.$grad['type']); + $this->_out('/ColorSpace /DeviceGray'); + if ($grad['type'] == 2) { + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); + $this->_out('/Function '.$f2.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type'] == 3) { + //x0, y0, r0, x1, y1, r1 + //at this this time radius of inner circle is 0 + $ir = 0; + if (isset($grad['coords'][5]) && $grad['coords'][5]) { $ir = $grad['coords'][5]; } + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); + $this->_out('/Function '.$f2.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type']==6) { + $this->_out('/BitsPerCoordinate 16'); + $this->_out('/BitsPerComponent 8'); + $this->_out('/Decode[0 1 0 1 0 1]'); + $this->_out('/BitsPerFlag 8'); + $this->_out('/Length '.strlen($grad['stream_trans'])); + $this->_out('>>'); + $this->_putstream($grad['stream_trans']); + } + $this->_out('endobj'); + + $this->gradients[$transid]['id'] = $this->n; + $this->_newobj(); + $this->_out('<< /Type /Pattern /PatternType 2'); + $this->_out('/Shading '.$this->gradients[$transid]['id'].' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + $this->gradients[$transid]['pattern'] = $this->n; + $this->_newobj(); + // Need to extend size of viewing box in case of transformations + $str = 'q /a0 gs /Pattern cs /p'.$transid.' scn -'.($this->wPt/2).' -'.($this->hPt/2).' '.(2*$this->wPt).' '.(2*$this->hPt).' re f Q'; + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + $p=($this->compress) ? gzcompress($str) : $str; + $this->_out('<< /Type /XObject /Subtype /Form /FormType 1 '.$filter); + $this->_out('/Length '.strlen($p)); + $this->_out('/BBox [-'.($this->wPt/2).' -'.($this->hPt/2).' '.(2*$this->wPt).' '.(2*$this->hPt).']'); + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceGray >>'); + $this->_out('/Resources <<'); + $this->_out('/ExtGState << /a0 << /ca 1 /CA 1 >> >>'); + $this->_out('/Pattern << /p'.$transid.' '.$this->gradients[$transid]['pattern'].' 0 R >>'); + $this->_out('>>'); + $this->_out('>>'); + $this->_putstream($p); + $this->_out('endobj'); + $this->_newobj(); + $this->_out('<< /Type /Mask /S /Luminosity /G '.($this->n - 1).' 0 R >>'."\n".'endobj'); + $this->_newobj(); + $this->_out('<< /Type /ExtGState /SMask '.($this->n - 1).' 0 R /AIS false >>'."\n".'endobj'); + if ($grad['fo']) { $this->extgstates[] = array('n' => $this->n, 'trans' => 'TGS'.$id, 'fo'=>true); } + else { $this->extgstates[] = array('n' => $this->n, 'trans' => 'TGS'.$id); } + } + } +} +/*-- END BACKGROUNDS --*/ + +function _putspotcolors() { + foreach($this->spotColors as $name=>$color) { + $this->_newobj(); + $this->_out('[/Separation /'.str_replace(' ','#20',$name)); + $this->_out('/DeviceCMYK <<'); + $this->_out('/Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0] '); + $this->_out(sprintf('/C1 [%.3F %.3F %.3F %.3F] ',$color['c']/100,$color['m']/100,$color['y']/100,$color['k']/100)); + $this->_out('/FunctionType 2 /Domain [0 1] /N 1>>]'); + $this->_out('endobj'); + $this->spotColors[$name]['n']=$this->n; + } +} + + +function _putresources() { + if ($this->hasOC || count($this->layers)) // mPDF 5.6.01 + $this->_putocg(); + $this->_putextgstates(); + $this->_putspotcolors(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'40','Compiling Fonts'); } // *PROGRESS-BAR* + $this->_putfonts(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'50','Compiling Images'); } // *PROGRESS-BAR* + $this->_putimages(); + $this->_putformobjects(); // *IMAGES-CORE* + +/*-- IMPORTS --*/ + if ($this->enableImports) { + $this->_putformxobjects(); + $this->_putimportedobjects(); + } +/*-- END IMPORTS --*/ + +/*-- BACKGROUNDS --*/ + $this->_putshaders(); + $this->_putpatterns(); +/*-- END BACKGROUNDS --*/ + + + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + + $this->_out('/Font <<'); + foreach($this->fonts as $font) { + if (!$font['used'] && $font['type']=='TTF') { continue; } + if ($font['type']=='TTF' && ($font['sip'] || $font['smp'])) { + foreach($font['n'] AS $k => $fid) { + $this->_out('/F'.$font['subsetfontids'][$k].' '.$font['n'][$k].' 0 R'); + } + } + else { + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + } + } + $this->_out('>>'); + + if (count($this->spotColors)) { + $this->_out('/ColorSpace <<'); + foreach($this->spotColors as $color) + $this->_out('/CS'.$color['i'].' '.$color['n'].' 0 R'); + $this->_out('>>'); + } + + if (count($this->extgstates)) { + $this->_out('/ExtGState <<'); + foreach($this->extgstates as $k=>$extgstate) + if (isset($extgstate['trans'])) $this->_out('/'.$extgstate['trans'].' '.$extgstate['n'].' 0 R'); + else $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R'); + $this->_out('>>'); + } + +/*-- BACKGROUNDS --*/ + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $this->_out('/Shading <<'); + foreach ($this->gradients as $id => $grad) { + $this->_out('/Sh'.$id.' '.$grad['id'].' 0 R'); + } + $this->_out('>>'); + +/* + // ??? Not needed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + $this->_out('/Pattern <<'); + foreach ($this->gradients as $id => $grad) { + $this->_out('/P'.$id.' '.$grad['pattern'].' 0 R'); + } + $this->_out('>>'); +*/ + } +/*-- END BACKGROUNDS --*/ + + if(count($this->images) || count($this->formobjects) || ($this->enableImports && count($this->tpls))) { + $this->_out('/XObject <<'); + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + foreach($this->formobjects as $formobject) + $this->_out('/FO'.$formobject['i'].' '.$formobject['n'].' 0 R'); +/*-- IMPORTS --*/ + if ($this->enableImports && count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R'); + } + } +/*-- END IMPORTS --*/ + $this->_out('>>'); + } + +/*-- BACKGROUNDS --*/ + + if (count($this->patterns)) { + $this->_out('/Pattern <<'); + foreach($this->patterns as $k=>$patterns) + $this->_out('/P'.$k.' '.$patterns['n'].' 0 R'); + $this->_out('>>'); + } +/*-- END BACKGROUNDS --*/ + + // mPDF 5.6.01 + if ($this->hasOC || count($this->layers)) { + $this->_out('/Properties <<'); + if ($this->hasOC) { + $this->_out('/OC1 '.$this->n_ocg_print.' 0 R /OC2 '.$this->n_ocg_view.' 0 R /OC3 '.$this->n_ocg_hidden.' 0 R '); + } + if (count($this->layers)) { + foreach($this->layers as $id=>$layer) + $this->_out('/ZI'.$id.' '.$layer['n'].' 0 R'); + } + $this->_out('>>'); + } + + $this->_out('>>'); + $this->_out('endobj'); // end resource dictionary + + $this->_putbookmarks(); // *BOOKMARKS* + + if (isset($this->js) && $this->js) { + $this->_putjavascript(); + } + +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $this->_newobj(); + $this->enc_obj_id = $this->n; + $this->_out('<<'); + $this->_putencryption(); + $this->_out('>>'); + $this->_out('endobj'); + } +/*-- END ENCRYPTION --*/ +} + + +function _putjavascript() { + $this->_newobj(); + $this->n_js = $this->n; + $this->_out('<<'); + $this->_out('/Names [(EmbeddedJS) '.(1 + $this->n).' 0 R ]'); + $this->_out('>>'); + $this->_out('endobj'); + + $this->_newobj(); + $this->_out('<<'); + $this->_out('/S /JavaScript'); + $this->_out('/JS '.$this->_textstring($this->js)); + $this->_out('>>'); + $this->_out('endobj'); +} + + + + +/*-- ENCRYPTION --*/ +function _putencryption() { + $this->_out('/Filter /Standard'); + if ($this->useRC128encryption) { + $this->_out('/V 2'); + $this->_out('/R 3'); + $this->_out('/Length 128'); + } + else { + $this->_out('/V 1'); + $this->_out('/R 2'); + } + $this->_out('/O ('.$this->_escape($this->Ovalue).')'); + $this->_out('/U ('.$this->_escape($this->Uvalue).')'); + $this->_out('/P '.$this->Pvalue); +} +/*-- END ENCRYPTION --*/ + +function _puttrailer() { + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.$this->InfoRoot.' 0 R'); +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $this->_out('/Encrypt '.$this->enc_obj_id.' 0 R'); + $this->_out('/ID [<'.$this->uniqid.'> <'.$this->uniqid.'>]'); + } + else { +/*-- END ENCRYPTION --*/ + $uniqid = md5(time() . $this->buffer); + $this->_out('/ID [<'.$uniqid.'> <'.$uniqid.'>]'); +/*-- ENCRYPTION --*/ + } +/*-- END ENCRYPTION --*/ +} + +/*-- ENCRYPTION --*/ +function SetProtection($permissions=array(),$user_pass='',$owner_pass=null, $length=40) { + $this->encrypted=false; + if (is_string($permissions) && strlen($permissions)>0) { $permissions = array($permissions); } + else if (!is_array($permissions)) { return 0; } + $this->last_rc4_key=''; + $this->padding="\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08". + "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; + + $options = array( + 'print' => 4, // bit 3 + 'modify' => 8, // bit 4 + 'copy' => 16, // bit 5 + 'annot-forms' => 32, // bit 6 + 'fill-forms' => 256, // bit 9 + 'extract' => 512, // bit 10 + 'assemble' => 1024,// bit 11 + 'print-highres' => 2048 // bit 12 + ); + // bit 31 = 1073741824 + // bit 32 = 2147483648 + // bits 13-31 = 2147479552 + // bits 13-32 = 4294963200 + 192 = 4294963392 + $protection = 4294963392; // bits 7,8,13-32 + foreach ($permissions as $permission) { + if (!isset($options[$permission])) + $this->Error('Incorrect permission: '.$permission); + if ($options[$permission] > 32) { $this->useRC128encryption = true; } + if (isset($options[$permission])) $protection += $options[$permission]; + } + if ($length==128) { $this->useRC128encryption = true; } + if ($owner_pass === null) + $owner_pass = uniqid(rand()); + $this->encrypted = true; + $this->_generateencryptionkey($user_pass, $owner_pass, $protection); +} + + +// Compute key depending on object number where the encrypted data is stored +function _objectkey($n) { + if ($this->useRC128encryption) + $len = 16; + else + $len = 10; + return substr($this->_md5_16($this->encryption_key.pack('VXxx',$n)),0,$len); +} + +// RC4 is the standard encryption algorithm used in PDF format +function _RC4($key, $text) { + if ($this->last_rc4_key != $key) { + $k = str_repeat($key, 256/strlen($key)+1); + $rc4 = range(0,255); + $j = 0; + for ($i=0; $i<256; $i++){ + $t = $rc4[$i]; + $j = ($j + $t + ord($k[$i])) % 256; + $rc4[$i] = $rc4[$j]; + $rc4[$j] = $t; + } + $this->last_rc4_key = $key; + $this->last_rc4_key_c = $rc4; + } else { + $rc4 = $this->last_rc4_key_c; + } + + $len = strlen($text); + $a = 0; + $b = 0; + $out = ''; + for ($i=0; $i<$len; $i++){ + $a = ($a+1)%256; + $t= $rc4[$a]; + $b = ($b+$t)%256; + $rc4[$a] = $rc4[$b]; + $rc4[$b] = $t; + $k = $rc4[($rc4[$a]+$rc4[$b])%256]; + $out.= chr(ord($text[$i]) ^ $k); + } + return $out; +} + +// Get MD5 as binary string +function _md5_16($string) { + return pack('H*',md5($string)); +} + +// Compute O value +function _Ovalue($user_pass, $owner_pass) { + $tmp = $this->_md5_16($owner_pass); + if ($this->useRC128encryption) { + for ($i = 0; $i < 50; ++$i) { + $tmp = $this->_md5_16($tmp); + } + } + if ($this->useRC128encryption) + $keybytelen = (128 / 8); + else + $keybytelen = (40 / 8); + $owner_RC4_key = substr($tmp,0,$keybytelen); + $enc = $this->_RC4($owner_RC4_key, $user_pass); + if ($this->useRC128encryption) { + $len = strlen($owner_RC4_key); + for ($i = 1; $i <= 19; ++$i) { + $key = ''; + for ($j = 0; $j < $len; ++$j) { + $key .= chr(ord($owner_RC4_key{$j}) ^ $i); + } + $enc = $this->_RC4($key, $enc); + } + } + return $enc; +} + +// Compute U value +function _Uvalue() { + if ($this->useRC128encryption) { + $tmp = $this->_md5_16($this->padding.$this->_hexToString($this->uniqid)); + $enc = $this->_RC4($this->encryption_key, $tmp); + $len = strlen($tmp); + for ($i=1; $i<=19; ++$i) { + $key = ''; + for ($j=0; $j<$len; ++$j) { + $key .= chr(ord($this->encryption_key{$j}) ^ $i); + } + $enc = $this->_RC4($key, $enc); + } + $enc .= str_repeat("\x00", 16); + return substr($enc, 0, 32); + } + else { + return $this->_RC4($this->encryption_key, $this->padding); + } +} + +// Compute encryption key +function _generateencryptionkey($user_pass, $owner_pass, $protection) { + // Pad passwords + $user_pass = substr($user_pass.$this->padding,0,32); + $owner_pass = substr($owner_pass.$this->padding,0,32); + $chars = 'ABCDEF1234567890'; + $id = ''; + for ($i=0; $i<32; $i++) { $id .= $chars{rand(0, 15)}; } + $this->uniqid = md5($id); + // Compute O value + $this->Ovalue = $this->_Ovalue($user_pass,$owner_pass); + // Compute encyption key + if ($this->useRC128encryption) + $keybytelen = (128/8); + else + $keybytelen = (40/8); + $prot = sprintf('%032b', $protection); + $perms = chr(bindec(substr($prot,24,8))); + $perms .= chr(bindec(substr($prot,16,8))); + $perms .= chr(bindec(substr($prot,8,8))); + $perms .= chr(bindec(substr($prot,0,8))); + $tmp = $this->_md5_16($user_pass.$this->Ovalue.$perms.$this->_hexToString($this->uniqid)); + if ($this->useRC128encryption) { + for ($i=0; $i<50; ++$i) { + $tmp = $this->_md5_16(substr($tmp, 0, $keybytelen)); + } + } + $this->encryption_key = substr($tmp,0,$keybytelen); + // Compute U value + $this->Uvalue = $this->_Uvalue(); + // Compute P value + $this->Pvalue = $protection; +} + + +function _hexToString($hs) { + $s = ''; + $len = strlen($hs); + if (($len % 2) != 0) { + $hs .= '0'; + ++$len; + } + for ($i = 0; $i < $len; $i += 2) { + $s .= chr(hexdec($hs{$i}.$hs{($i + 1)})); + } + return $s; +} + +/*-- END ENCRYPTION --*/ + +//========================================= +/*-- BOOKMARKS --*/ +// FROM class PDF_Bookmark + +function Bookmark($txt,$level=0,$y=0) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if($y==-1) { + if (!$this->ColActive){ $y=$this->y; } + else { $y = $this->y0; } // If columns are on - mark top of columns + } + // else y is used as set, or =0 i.e. top of page + // DIRECTIONALITY RTL + $bmo = array('t'=>$txt,'l'=>$level,'y'=>$y,'p'=>$this->page); + if ($this->keep_block_together) { + $this->ktBMoutlines[]= $bmo; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_BMoutlines[]= $bmo; + } + else if ($this->kwt) { + $this->kwt_BMoutlines[]= $bmo; + } +/*-- END TABLES --*/ + else if ($this->ColActive) { // *COLUMNS* + $this->col_BMoutlines[]= $bmo; // *COLUMNS* + } // *COLUMNS* + else { + $this->BMoutlines[]= $bmo; + } +} + + +function _putbookmarks() +{ + $nb=count($this->BMoutlines); + if($nb==0) + return; + + // mPDF 5.6.36 + $bmo = $this->BMoutlines; + $this->BMoutlines = array(); + $lastlevel = -1; + for($i=0;$i<count($bmo);$i++) { + if ($bmo[$i]['l']>0) { + while($bmo[$i]['l']-$lastlevel > 1) { // If jump down more than one level, insert a new entry + $new = $bmo[$i]; + $new['t']="[".$new['t']."]"; // Put [] around text/title to highlight + $new['l']=$lastlevel+1; + $lastlevel++; + $this->BMoutlines[] = $new; + } + } + $this->BMoutlines[] = $bmo[$i]; + $lastlevel = $bmo[$i]['l']; + } + $nb=count($this->BMoutlines); + + $lru=array(); + $level=0; + foreach($this->BMoutlines as $i=>$o) { + if($o['l']>0) { + $parent=$lru[$o['l']-1]; + //Set parent and last pointers + $this->BMoutlines[$i]['parent']=$parent; + $this->BMoutlines[$parent]['last']=$i; + if($o['l']>$level) { + //Level increasing: set first pointer + $this->BMoutlines[$parent]['first']=$i; + } + } + else { + $this->BMoutlines[$i]['parent']=$nb; + } + if($o['l']<=$level and $i>0) { + //Set prev and next pointers + $prev=$lru[$o['l']]; + $this->BMoutlines[$prev]['next']=$i; + $this->BMoutlines[$i]['prev']=$prev; + } + $lru[$o['l']]=$i; + $level=$o['l']; + } + + + //Outline items + $n=$this->n+1; + foreach($this->BMoutlines as $i=>$o) { + $this->_newobj(); + $this->_out('<_UTF16BEtextstring($o['t'])); + $this->_out('/Parent '.($n+$o['parent']).' 0 R'); + if(isset($o['prev'])) + $this->_out('/Prev '.($n+$o['prev']).' 0 R'); + if(isset($o['next'])) + $this->_out('/Next '.($n+$o['next']).' 0 R'); + if(isset($o['first'])) + $this->_out('/First '.($n+$o['first']).' 0 R'); + if(isset($o['last'])) + $this->_out('/Last '.($n+$o['last']).' 0 R'); + + + if (isset($this->pageDim[$o['p']]['h'])) { $h=$this->pageDim[$o['p']]['h']; } + else { $h = 0; } + + $this->_out(sprintf('/Dest [%d 0 R /XYZ 0 %.3F null]',1+2*($o['p']),($h-$o['y'])*_MPDFK)); + if (isset($this->bookmarkStyles) && isset($this->bookmarkStyles[$o['l']])) { + // font style + $bms = $this->bookmarkStyles[$o['l']]['style']; + $style = 0; + if (strpos($bms,'B') !== false) { $style += 2; } + if (strpos($bms,'I') !== false) { $style += 1; } + $this->_out(sprintf('/F %d', $style)); + // Colour + $col = $this->bookmarkStyles[$o['l']]['color']; + if (isset($col) && is_array($col) && count($col)==3) { + $this->_out(sprintf('/C [%.3F %.3F %.3F]', ($col[0]/255), ($col[1]/255), ($col[2]/255))); + } + } + + $this->_out('/Count 0>>'); + $this->_out('endobj'); + } + //Outline root + $this->_newobj(); + $this->OutlineRoot=$this->n; + $this->_out('<_out('/Last '.($n+$lru[0]).' 0 R>>'); + $this->_out('endobj'); +} +/*-- END BOOKMARKS --*/ + + + +//====================================================== + + +// DEPRACATED but included for backwards compatability +function startPageNums() { +} + +//====================================================== +/*-- TOC --*/ +// ToC TABLE OF CONTENTS + +// Initiate, and Mark a place for the Table of Contents to be inserted +function TOC($tocfont='', $tocfontsize=0, $tocindent=0, $resetpagenum='', $pagenumstyle='', $suppress='', $toc_orientation='', $TOCusePaging=true, $TOCuseLinking=false, $toc_id=0, $tocoutdent='') { // mPDF 5.6.19 + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $this->tocontents->TOC($tocfont, $tocfontsize, $tocindent, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $TOCusePaging, $TOCuseLinking, $toc_id, $tocoutdent); // mPDF 5.6.19 +} + + +function TOCpagebreakByArray($a) { + if (!is_array($a)) { $a = array(); } + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $tocoutdent = (isset($a['tocoutdent']) ? $a['tocoutdent'] : (isset($a['outdent']) ? $a['outdent'] : '')); + $TOCusePaging = (isset($a['TOCusePaging']) ? $a['TOCusePaging'] : (isset($a['paging']) ? $a['paging'] : true)); + $TOCuseLinking = (isset($a['TOCuseLinking']) ? $a['TOCuseLinking'] : (isset($a['links']) ? $a['links'] : '')); + $toc_orientation = (isset($a['toc_orientation']) ? $a['toc_orientation'] : (isset($a['toc-orientation']) ? $a['toc-orientation'] : '')); + $toc_mgl = (isset($a['toc_mgl']) ? $a['toc_mgl'] : (isset($a['toc-margin-left']) ? $a['toc-margin-left'] : '')); + $toc_mgr = (isset($a['toc_mgr']) ? $a['toc_mgr'] : (isset($a['toc-margin-right']) ? $a['toc-margin-right'] : '')); + $toc_mgt = (isset($a['toc_mgt']) ? $a['toc_mgt'] : (isset($a['toc-margin-top']) ? $a['toc-margin-top'] : '')); + $toc_mgb = (isset($a['toc_mgb']) ? $a['toc_mgb'] : (isset($a['toc-margin-bottom']) ? $a['toc-margin-bottom'] : '')); + $toc_mgh = (isset($a['toc_mgh']) ? $a['toc_mgh'] : (isset($a['toc-margin-header']) ? $a['toc-margin-header'] : '')); + $toc_mgf = (isset($a['toc_mgf']) ? $a['toc_mgf'] : (isset($a['toc-margin-footer']) ? $a['toc-margin-footer'] : '')); + $toc_ohname = (isset($a['toc_ohname']) ? $a['toc_ohname'] : (isset($a['toc-odd-header-name']) ? $a['toc-odd-header-name'] : '')); + $toc_ehname = (isset($a['toc_ehname']) ? $a['toc_ehname'] : (isset($a['toc-even-header-name']) ? $a['toc-even-header-name'] : '')); + $toc_ofname = (isset($a['toc_ofname']) ? $a['toc_ofname'] : (isset($a['toc-odd-footer-name']) ? $a['toc-odd-footer-name'] : '')); + $toc_efname = (isset($a['toc_efname']) ? $a['toc_efname'] : (isset($a['toc-even-footer-name']) ? $a['toc-even-footer-name'] : '')); + $toc_ohvalue = (isset($a['toc_ohvalue']) ? $a['toc_ohvalue'] : (isset($a['toc-odd-header-value']) ? $a['toc-odd-header-value'] : 0)); + $toc_ehvalue = (isset($a['toc_ehvalue']) ? $a['toc_ehvalue'] : (isset($a['toc-even-header-value']) ? $a['toc-even-header-value'] : 0)); + $toc_ofvalue = (isset($a['toc_ofvalue']) ? $a['toc_ofvalue'] : (isset($a['toc-odd-footer-value']) ? $a['toc-odd-footer-value'] : 0)); + $toc_efvalue = (isset($a['toc_efvalue']) ? $a['toc_efvalue'] : (isset($a['toc-even-footer-value']) ? $a['toc-even-footer-value'] : 0)); + $toc_preHTML = (isset($a['toc_preHTML']) ? $a['toc_preHTML'] : (isset($a['toc-preHTML']) ? $a['toc-preHTML'] : '')); + $toc_postHTML = (isset($a['toc_postHTML']) ? $a['toc_postHTML'] : (isset($a['toc-postHTML']) ? $a['toc-postHTML'] : '')); + $toc_bookmarkText = (isset($a['toc_bookmarkText']) ? $a['toc_bookmarkText'] : (isset($a['toc-bookmarkText']) ? $a['toc-bookmarkText'] : '')); + $resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : ''); + $pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''); + $suppress = (isset($a['suppress']) ? $a['suppress'] : ''); + $orientation = (isset($a['orientation']) ? $a['orientation'] : ''); + $mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '')); + $mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '')); + $mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '')); + $mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '')); + $mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '')); + $mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '')); + $ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '')); + $ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '')); + $ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '')); + $efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '')); + $ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0)); + $ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0)); + $ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0)); + $efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0)); + $toc_id = (isset($a['toc_id']) ? $a['toc_id'] : (isset($a['name']) ? $a['name'] : 0)); + $pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '')); + $toc_pagesel = (isset($a['toc_pagesel']) ? $a['toc_pagesel'] : (isset($a['toc-pageselector']) ? $a['toc-pageselector'] : '')); + $sheetsize = (isset($a['sheetsize']) ? $a['sheetsize'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '')); + $toc_sheetsize = (isset($a['toc_sheetsize']) ? $a['toc_sheetsize'] : (isset($a['toc-sheet-size']) ? $a['toc-sheet-size'] : '')); + + $this->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); // mPDF 5.6.19 + +} + +function TOCpagebreak($tocfont='', $tocfontsize='', $tocindent='', $TOCusePaging=true, $TOCuseLinking='', $toc_orientation='', $toc_mgl='',$toc_mgr='',$toc_mgt='',$toc_mgb='',$toc_mgh='',$toc_mgf='',$toc_ohname='',$toc_ehname='',$toc_ofname='',$toc_efname='',$toc_ohvalue=0,$toc_ehvalue=0,$toc_ofvalue=0, $toc_efvalue=0, $toc_preHTML='', $toc_postHTML='', $toc_bookmarkText='', $resetpagenum='', $pagenumstyle='', $suppress='', $orientation='', $mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0, $toc_id=0, $pagesel='', $toc_pagesel='', $sheetsize='', $toc_sheetsize='', $tocoutdent='') { // mPDF 5.6.19) { + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + //Start a new page + if($this->state==0) $this->AddPage(); + if ($this->y == $this->tMargin && (!$this->mirrorMargins ||($this->mirrorMargins && $this->page % 2==1))) { + // Don't add a page + if ($this->page==1 && count($this->PageNumSubstitutions)==0) { + if (!$suppress) { $suppress = 'off'; } + if (!$resetpagenum) { $resetpagenum= 1; } + //$this->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); + } + $this->PageNumSubstitutions[] = array('from'=>$this->page, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); + } + else { + $this->AddPage($orientation,'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$sheetsize); + } + + $this->tocontents->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); // mPDF 5.6.19 +} + +function TOC_Entry($txt, $level=0, $toc_id=0) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + if ($this->ColActive) { $ily = $this->y0; } else { $ily = $this->y; } // use top of columns + + // mPDF 5.6.19 mPDF 5.6.25 mPDF 5.6.37 + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $linkn = $this->AddLink(); + $uid = '__mpdfinternallink_' . $linkn ; + if ($this->keep_block_together) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "kt"=>true ); } + else if ($this->table_rotate) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "tbrot"=>true ); } + else if ($this->kwt) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "kwt"=>true ); } + else if ($this->ColActive) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "col"=>$this->CurrCol ); } + else $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page ); + $this->internallink['#'.$uid] = $linkn; + $this->SetLink($linkn,$ily,$this->page); + +/*-- RTL --*/ + if ($this->biDirectional) { + $txt = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $txt ); + } +/*-- END RTL --*/ + if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; } + else if (!$toc_id) { $toc_id = 0; } + else { $toc_id = strtolower($toc_id); } + $btoc = array('t'=>$txt,'l'=>$level,'p'=>$this->page, 'link'=>$linkn, 'toc_id'=>$toc_id); + if ($this->keep_block_together) { + $this->_kttoc[]= $btoc; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_toc[]= $btoc; + } + else if ($this->kwt) { + $this->kwt_toc[]= $btoc; + } +/*-- END TABLES --*/ + else if ($this->ColActive) { // *COLUMNS* + $this->col_toc[]= $btoc; // *COLUMNS* + } // *COLUMNS* + else { + $this->tocontents->_toc[]= $btoc; + } +} + +/*-- END TOC --*/ + +//====================================================== +function MovePages($target_page, $start_page, $end_page=-1) { + // move a page/pages EARLIER in the document + if ($end_page<1) { $end_page = $start_page; } + $n_toc = $end_page - $start_page + 1; + + // Set/Update PageNumSubstitutions changes before moving anything + if (count($this->PageNumSubstitutions)) { + $tp_present = false; + $sp_present = false; + $ep_present = false; + foreach($this->PageNumSubstitutions AS $k=>$v) { + if ($this->PageNumSubstitutions[$k]['from']==$target_page) { + $tp_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + if ($this->PageNumSubstitutions[$k]['from']==$start_page) { + $sp_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + if ($this->PageNumSubstitutions[$k]['from']==($end_page+1)) { + $ep_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + } + + if (!$tp_present) { + list($tp_type, $tp_suppress, $tp_reset) = $this->docPageSettings($target_page); + } + if (!$sp_present) { + list($sp_type, $sp_suppress, $sp_reset) = $this->docPageSettings($start_page); + } + if (!$ep_present) { + list($ep_type, $ep_suppress, $ep_reset) = $this->docPageSettings($start_page-1); + } + + } + + $last = array(); + //store pages + for($i = $start_page;$i <= $end_page ;$i++) + $last[]=$this->pages[$i]; + //move pages + for($i=$start_page - 1;$i>=($target_page);$i--) { + $this->pages[$i+$n_toc]=$this->pages[$i]; + } + //Put toc pages at insert point + for($i = 0;$i < $n_toc;$i++) { + $this->pages[$target_page + $i]=$last[$i]; + } + +/*-- BOOKMARKS --*/ + // Update Bookmarks + foreach($this->BMoutlines as $i=>$o) { + if($o['p']>=$target_page) { + $this->BMoutlines[$i]['p'] += $n_toc; + } + } +/*-- END BOOKMARKS --*/ + + // Update Page Links + if (count($this->PageLinks)) { + $newarr = array(); + foreach($this->PageLinks as $i=>$o) { + foreach($this->PageLinks[$i] as $key => $pl) { + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + if($p>=$start_page && $p<=$end_page) { + $this->PageLinks[$i][$key][4] = '@'.($p + ($target_page - $start_page)); + } + else if($p>=$target_page && $p<$start_page) { + $this->PageLinks[$i][$key][4] = '@'.($p+$n_toc); + } + } + } + if($i>=$start_page && $i<=$end_page) { + $newarr[($i + ($target_page - $start_page))] = $this->PageLinks[$i]; + } + else if($i>=$target_page && $i<$start_page) { + $newarr[($i + $n_toc)] = $this->PageLinks[$i]; + } + else { + $newarr[$i] = $this->PageLinks[$i]; + } + } + $this->PageLinks = $newarr; + } + + // OrientationChanges + if (count($this->OrientationChanges)) { + $newarr = array(); + foreach($this->OrientationChanges AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->OrientationChanges[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->OrientationChanges[$p]; } + else { $newarr[$p] = $this->OrientationChanges[$p]; } + } + ksort($newarr); + $this->OrientationChanges = $newarr; + } + + // Page Dimensions + if (count($this->pageDim)) { + $newarr = array(); + foreach($this->pageDim AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->pageDim[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->pageDim[$p]; } + else { $newarr[$p] = $this->pageDim[$p]; } + } + ksort($newarr); + $this->pageDim = $newarr; + } + + // HTML Headers & Footers + if (count($this->saveHTMLHeader)) { + $newarr = array(); + foreach($this->saveHTMLHeader AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLHeader[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->saveHTMLHeader[$p]; } + else { $newarr[$p] = $this->saveHTMLHeader[$p]; } + } + ksort($newarr); + $this->saveHTMLHeader = $newarr; + } + if (count($this->saveHTMLFooter)) { + $newarr = array(); + foreach($this->saveHTMLFooter AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLFooter[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->saveHTMLFooter[$p]; } + else { $newarr[$p] = $this->saveHTMLFooter[$p]; } + } + ksort($newarr); + $this->saveHTMLFooter = $newarr; + } + + // Update Internal Links + if (count($this->internallink)) { + foreach($this->internallink as $key=>$o) { + if($o['PAGE']>=$start_page && $o['PAGE']<=$end_page) { + $this->internallink[$key]['PAGE'] += ($target_page - $start_page); + } + else if($o['PAGE']>=$target_page && $o['PAGE']<$start_page) { + $this->internallink[$key]['PAGE'] += $n_toc; + } + } + } + + // Update Links + if (count($this->links)) { + foreach($this->links as $key=>$o) { + if($o[0]>=$start_page && $o[0]<=$end_page) { + $this->links[$key][0] += ($target_page - $start_page); + } + if($o[0]>=$target_page && $o[0]<$start_page) { + $this->links[$key][0] += $n_toc; + } + } + } + + // Update Form fields + if (count($this->form->forms)) { + foreach($this->form->forms as $key=>$f) { + if($f['page']>=$start_page && $f['page']<=$end_page) { + $this->form->forms[$key]['page'] += ($target_page - $start_page); + } + if($f['page']>=$target_page && $f['page']<$start_page) { + $this->form->forms[$key]['page'] += $n_toc; + } + } + } + +/*-- ANNOTATIONS --*/ + // Update Annotations + if (count($this->PageAnnots)) { + $newarr = array(); + foreach($this->PageAnnots as $p=>$anno) { + if($p>=$start_page && $p<=$end_page) { + $np = $p + ($target_page - $start_page); + foreach($anno as $o) { + $newarr[$np][] = $o; + } + } + else if($p>=$target_page && $p<$start_page) { + $np = $p + $n_toc; + foreach($anno as $o) { + $newarr[$np][] = $o; + } + } + else { + $newarr[$p] = $this->PageAnnots[$p]; + } + } + $this->PageAnnots = $newarr; + unset($newarr); + } +/*-- END ANNOTATIONS --*/ + + // Update PageNumSubstitutions + if (count($this->PageNumSubstitutions)) { + $newarr = array(); + foreach($this->PageNumSubstitutions AS $k=>$v) { + if($this->PageNumSubstitutions[$k]['from']>=$start_page && $this->PageNumSubstitutions[$k]['from']<=$end_page) { + $this->PageNumSubstitutions[$k]['from'] += ($target_page - $start_page); + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + else if($this->PageNumSubstitutions[$k]['from']>=$target_page && $this->PageNumSubstitutions[$k]['from']<$start_page) { + $this->PageNumSubstitutions[$k]['from'] += $n_toc; + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + else { + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + } + + if (!$sp_present) { + $newarr[$target_page] = array('from'=>$target_page, 'suppress'=>$sp_suppress, 'reset'=>$sp_reset, 'type'=>$sp_type); + } + if (!$tp_present) { + $newarr[($target_page + $n_toc)] = array('from'=>($target_page+$n_toc), 'suppress'=>$tp_suppress, 'reset'=>$tp_reset, 'type'=>$tp_type); + } + if (!$ep_present && $end_page>count($this->pages)) { + $newarr[($end_page+1)] = array('from'=>($end_page+1), 'suppress'=>$ep_suppress, 'reset'=>$ep_reset, 'type'=>$ep_type); + } + ksort($newarr); + $this->PageNumSubstitutions = array(); + foreach($newarr as $v) { + $this->PageNumSubstitutions[] = $v; + } + } +} + +//====================================================== +function DeletePages($start_page, $end_page=-1) { + // move a page/pages EARLIER in the document + if ($end_page<1) { $end_page = $start_page; } + $n_tod = $end_page - $start_page + 1; + $last_page = count($this->pages); + $n_atend = $last_page - $end_page + 1; + + //move pages + for($i=0;$i<$n_atend;$i++) { + $this->pages[$start_page+$i]=$this->pages[$end_page+1+$i]; + } + //delete pages + for($i = 0;$i < $n_tod ;$i++) + unset($this->pages[$last_page-$i]); + + +/*-- BOOKMARKS --*/ + // Update Bookmarks + foreach($this->BMoutlines as $i=>$o) { + if($o['p']>=$end_page) { $this->BMoutlines[$i]['p'] -= $n_tod; } + else if($p<$start_page) { unset($this->BMoutlines[$i]); } + } +/*-- END BOOKMARKS --*/ + + // Update Page Links + if (count($this->PageLinks)) { + $newarr = array(); + foreach($this->PageLinks as $i=>$o) { + foreach($this->PageLinks[$i] as $key => $pl) { + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + if($p>$end_page) { $this->PageLinks[$i][$key][4] = '@'.($p - $n_tod); } + else if($p<$start_page) { unset($this->PageLinks[$i][$key]); } + } + } + if($i>$end_page) { $newarr[($i - $n_tod)] = $this->PageLinks[$i]; } + else if($p<$start_page) { $newarr[$i] = $this->PageLinks[$i]; } + } + $this->PageLinks = $newarr; + } + + // OrientationChanges + if (count($this->OrientationChanges)) { + $newarr = array(); + foreach($this->OrientationChanges AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $t_tod)] = $this->OrientationChanges[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->OrientationChanges[$p]; } + } + ksort($newarr); + $this->OrientationChanges = $newarr; + } + + // Page Dimensions + if (count($this->pageDim)) { + $newarr = array(); + foreach($this->pageDim AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $n_tod)] = $this->pageDim[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->pageDim[$p]; } + } + ksort($newarr); + $this->pageDim = $newarr; + } + + // HTML Headers & Footers + if (count($this->saveHTMLHeader)) { + foreach($this->saveHTMLHeader AS $p=>$v) { + if($p>end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLHeader[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->saveHTMLHeader[$p]; } + } + ksort($newarr); + $this->saveHTMLHeader = $newarr; + } + if (count($this->saveHTMLFooter)) { + $newarr = array(); + foreach($this->saveHTMLFooter AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLFooter[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->saveHTMLFooter[$p]; } + } + ksort($newarr); + $this->saveHTMLFooter = $newarr; + } + + // Update Internal Links + foreach($this->internallink as $key=>$o) { + if($o['PAGE']>$end_page) { $this->internallink[$key]['PAGE'] -= $n_tod; } + else if($o['PAGE']<$start_page) { unset($this->internallink[$key]); } + } + + // Update Links + foreach($this->links as $key=>$o) { + if($o[0]>$end_page) { $this->links[$key][0] -= $n_tod; } + else if($o[0]<$start_page) { unset($this->links[$key]); } + } + + // Update Form fields + foreach($this->form->forms as $key=>$f) { + if($f['page']>$end_page) { $this->form->forms[$key]['page'] -= $n_tod; } + else if($f['page']<$start_page) { unset($this->form->forms[$key]); } + } + +/*-- ANNOTATIONS --*/ + // Update Annotations + if (count($this->PageAnnots)) { + $newarr = array(); + foreach($this->PageAnnots as $p=>$anno) { + if($p>$end_page) { foreach($anno as $o) { $newarr[($p - $n_tod)][] = $o; } } + else if($p<$start_page) { $newarr[$p] = $this->PageAnnots[$p]; } + } + ksort($newarr); + $this->PageAnnots = $newarr; + } +/*-- END ANNOTATIONS --*/ + + // Update PageNumSubstitutions + foreach($this->PageNumSubstitutions AS $k=>$v) { + if($this->PageNumSubstitutions[$k]['from']>$end_page) { $this->PageNumSubstitutions[$k]['from'] -= $n_tod; } + else if($this->PageNumSubstitutions[$k]['from']<$start_page) { unset($this->PageNumSubstitutions[$k]); } + } + + unset($newarr); + $this->page = count($this->pages); +} + + +//====================================================== +/*-- INDEX --*/ +// FROM class PDF_Ref == INDEX + +function Reference($txt) { + $this->IndexEntry($txt); +} + + +function IndexEntry($txt, $xref='') { + if ($xref) { + $this->IndexEntrySee($txt,$xref); + return; + } + $txt = strip_tags($txt); + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + + $Present=0; + $size=sizeof($this->Reference); + + if ($this->directionality == 'rtl') { // *RTL* + $txt = str_replace(':',' - ',$txt); // *RTL* + } // *RTL* + else { // *RTL* + $txt = str_replace(':',', ',$txt); + } // *RTL* + + + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<$size;$i++){ + if ($this->keep_block_together) { + if (isset($this->ktReference[$i]['t']) && $this->ktReference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->ktReference[$i]['p'])) { + $this->ktReference[$i]['op'] = $this->page; + } + } + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + if (isset($this->tbrot_Reference[$i]['t']) && $this->tbrot_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->tbrot_Reference[$i]['p'])) { + $this->tbrot_Reference[$i]['op'] = $this->page; + } + } + } + else if ($this->kwt) { + if (isset($this->kwt_Reference[$i]['t']) && $this->kwt_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->kwt_Reference[$i]['p'])) { + $this->kwt_Reference[$i]['op'] = $this->page; + } + } + } +/*-- END TABLES --*/ +/*-- COLUMNS --*/ + else if ($this->ColActive) { + if (isset($this->col_Reference[$i]['t']) && $this->col_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->col_Reference[$i]['p'])) { + $this->col_Reference[$i]['op'] = $this->page; + } + } + } +/*-- END COLUMNS --*/ + else { + if (isset($this->Reference[$i]['t']) && $this->Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + } + //If not found, add it + if ($Present==0) { + $opr = array('t'=>$txt, 'op'=>$this->page); + if ($this->keep_block_together) { + $this->ktReference[]= $opr; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_Reference[]= $opr; + } + else if ($this->kwt) { + $this->kwt_Reference[]= $opr; + } +/*-- END TABLES --*/ +/*-- COLUMNS --*/ + else if ($this->ColActive) { + $this->col_Reference[]= $opr; + } +/*-- END COLUMNS --*/ + else { + $this->Reference[]=array('t'=>$txt,'p'=>array($this->page)); + } + } +} + +// Added function to add a reference "Elephants. See Chickens" +function ReferenceSee($txta,$txtb) { + $this->IndexEntrySee($txta,$txtb); +} + +function IndexEntrySee($txta,$txtb) { + $txta = strip_tags($txta); + $txtb = strip_tags($txtb); + $txta = $this->purify_utf8_text($txta); + $txtb = $this->purify_utf8_text($txtb); + if ($this->text_input_as_HTML) { + $txta = $this->all_entities_to_utf8($txta); + $txtb = $this->all_entities_to_utf8($txtb); + } + if ($this->usingCoreFont) { + $txta = mb_convert_encoding($txta,$this->mb_enc,'UTF-8'); + $txtb = mb_convert_encoding($txtb,$this->mb_enc,'UTF-8'); + } + if ($this->directionality == 'rtl') { // *RTL* + $txta = str_replace(':',' - ',$txta); // *RTL* + $txtb = str_replace(':',' - ',$txtb); // *RTL* + } // *RTL* + else { // *RTL* + $txta = str_replace(':',', ',$txta); + $txtb = str_replace(':',', ',$txtb); + } // *RTL* + $this->Reference[]=array('t'=>$txta.' - see '.$txtb,'p'=>array()); +} + +function CreateReference($NbCol=1, $reffontsize='', $linespacing='', $offset=3, $usedivletters=1, $divlettfontsize='', $gap=5, $reffont='',$divlettfont='', $useLinking=false) { + $this->CreateIndex($NbCol, $reffontsize, $linespacing, $offset, $usedivletters, $divlettfontsize, $gap, $reffont, $divlettfont, $useLinking); +} + +function CreateIndex($NbCol=1, $reffontsize='', $linespacing='', $offset=3, $usedivletters=1, $divlettfontsize='', $gap=5, $reffont='',$divlettfont='', $useLinking=false) { + if (!$reffontsize) { $reffontsize = $this->default_font_size; } + if (!$divlettfontsize) { $divlettfontsize = ($this->default_font_size * 1.8); } + if (!$reffont) { $reffont = $this->default_font; } + if (!$divlettfont) { $divlettfont = $reffont; } + if (!$linespacing) { $linespacing= $this->default_lineheight_correction; } + if ($this->ColActive) { $this->SetColumns(0); } // *COLUMNS* + $size=sizeof($this->Reference); + if ($size == 0) { return false; } + + + if ($NbCol<2) { + $NbCol = 1; + $colWidth = $this->pgwidth; + } + else { + $this->SetColumns($NbCol,'',$gap); + $colWidth = $this->ColWidth; + } + if ($this->directionality == 'rtl') { $align = 'R'; } + else { $align = 'L'; } + $lett = ''; + if (!function_exists('cmp')) { + function cmp ($a, $b) { + return strnatcmp(strtolower($a['t']), strtolower($b['t'])); + } + } + //Alphabetic sort of the references + usort($this->Reference, 'cmp'); + $size=sizeof($this->Reference); + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + + $divlettjuststarted = false; + + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$reffont.'; font-size: '.$reffontsize.'pt; ')); + + $last_lett = ''; + for ($i=0;$i<$size;$i++){ + if ($this->Reference[$i]['t']) { + if ($usedivletters) { + + $lett = mb_strtoupper(mb_substr($this->Reference[$i]['t'],0,1,$this->mb_enc ),$this->mb_enc ); + if ($lett != $last_lett) { + + $save_bp = $this->breakpoints[$this->CurrCol]; // *COLUMNS* + $divlettjuststarted = true; + + if ($i>0) { + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$divlettfont.'; font-size: '.$divlettfontsize.'pt; font-weight: bold; page-break-after: avoid; margin-top: 0.5em; margin-collapse: collapse; ')); + } + else { + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$divlettfont.'; font-size: '.$divlettfontsize.'pt; font-weight: bold; page-break-after: avoid; ')); + } + $this->_saveTextBuffer($lett); + $this->CloseTag('DIV'); + } + } + + $this->OpenTag('DIV',array('STYLE'=>'text-indent: -'.$offset.'mm; line-height: '.$linespacing.'; font-family: '.$reffont.'; font-size: '.$reffontsize.'pt; ')); + +/*-- RTL --*/ + // Change Arabic + Persian. to Presentation Forms + if ($this->biDirectional) { + $this->Reference[$i]['t'] = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $this->Reference[$i]['t'] ); + } +/*-- END RTL --*/ + + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($this->Reference[$i]['t']); // *INDIC* + + $this->_saveTextBuffer($this->Reference[$i]['t']); + $ppp = $this->Reference[$i]['p']; // = array of page numbers to point to + if (count($ppp)) { + sort($ppp); + $newarr = array(); + $range_start = $ppp[0]; + $range_end = 0; + + if (!$this->usingCoreFont) { $spacer = "\xc2\xa0 "; } + else { $spacer = chr(160).' '; } + $this->_saveTextBuffer($spacer); + if ($this->directionality == 'rtl') { $sep = '.'; $joiner = '-'; } + else { $sep = ', '; $joiner = '-'; } + for ($zi=1;$zidirectionality == 'rtl') { +/*-- RTL --*/ + if ($zidocPageNum($ppp[$zi]); + if ($useLinking) { $href = '@'.$ppp[$zi]; } + else { $href = ''; } + $this->_saveTextBuffer($txt, $href); + } +/*-- END RTL --*/ + } + + else if ($ppp[$zi] == ($ppp[($zi-1)]+1)) { + $range_end = $ppp[$zi]; + } + else { + if ($range_end) { + if ($range_end == $range_start+1) { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $sep; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$ppp[$zi-1]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[$zi-1]) . $sep; + $this->_saveTextBuffer($txt, $href); + } + else { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + } + } + else { + if ($useLinking) { $href = '@'.$ppp[$zi-1]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[$zi-1]) . $sep; + $this->_saveTextBuffer($txt, $href); + } + $range_start = $ppp[$zi]; + $range_end = 0; + } + } + + if ($range_end) { + if ($range_end == $range_start+1) { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $sep; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$range_end; } + else { $href = ''; } + $txt = $this->docPageNum($range_end); + $this->_saveTextBuffer($txt, $href); + } + else { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $joiner; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$range_end; } + else { $href = ''; } + $txt = $this->docPageNum($range_end); + $this->_saveTextBuffer($txt, $href); + } + } + else { + if ($useLinking) { $href = '@'.$ppp[(count($ppp)-1)]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[(count($ppp)-1)]); + $this->_saveTextBuffer($txt, $href); + } + } + } + $this->CloseTag('DIV'); + + if ($divlettjuststarted) { $this->breakpoints[$this->CurrCol] = $save_bp; } // *COLUMNS* + $divlettjuststarted = false; + + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + $last_lett = $lett; + } + $this->CloseTag('DIV'); + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + if ($this->ColActive) { $this->SetColumns(0); } // *COLUMNS* +} +/*-- END INDEX --*/ + + +function AcceptPageBreak() { + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } // *TABLES* +/*-- COLUMNS --*/ + if ($this->ColActive==1) { + if($this->CurrCol<$this->NbCol-1) { + //Go to the next column + $this->CurrCol++; + $this->SetCol($this->CurrCol); + $this->y=$this->y0; + $this->ChangeColumn=1; // Number (and direction) of columns changed +1, +2, -2 etc. + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + + //Stay on the page + return false; + } + else { + //Go back to the first column - NEW PAGE + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->SetCol(0); + $this->y0 = $this->tMargin; + $this->ChangeColumn= -($this->NbCol-1); + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + //Page break + return true; + } + } +/*-- END COLUMNS --*/ +/*-- TABLES --*/ + else if ($this->table_rotate) { + if ($this->tablebuffer) { $this->printtablebuffer(); } + return true; + } +/*-- END TABLES --*/ + else { // *COLUMNS* + $this->ChangeColumn=0; + return $this->autoPageBreak; + } // *COLUMNS* + return $this->autoPageBreak; +} + + +//----------- COLUMNS --------------------- +/*-- COLUMNS --*/ + +function SetColumns($NbCol,$vAlign='',$gap=5) { +// NbCol = number of columns +// CurrCol = Number of the current column starting at 0 +// Called externally to set columns on/off and number +// Integer 2 upwards sets columns on to that number +// Anything less than 2 turns columns off + if ($NbCol<2) { // SET COLUMNS OFF + if ($this->ColActive) { + $this->ColActive=0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->NbCol=1; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->divwidth = 0; + $this->Ln(); + } + $this->ColActive=0; + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); + } + else { // SET COLUMNS ON + if ($this->ColActive) { + $this->ColActive=0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->ResetMargins(); + } + if (isset($this->y) && $this->y>$this->tMargin) $this->Ln(); + $this->NbCol=$NbCol; + $this->ColGap = $gap; + $this->divwidth = 0; + $this->ColActive=1; + $this->ColumnAdjust = true; // enables column height adjustment for the page + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); + if ((strtoupper($vAlign) == 'J') || (strtoupper($vAlign) == 'JUSTIFY')) { $vAlign = 'J'; } + else { $vAlign = ''; } + $this->colvAlign = $vAlign; + //Save the ordinate + $absL = $this->DeflMargin-($gap/2); + $absR = $this->DefrMargin-($gap/2); + $PageWidth = $this->w-$absL-$absR; // virtual pagewidth for calculation only + $ColWidth = (($PageWidth - ($gap * ($NbCol)))/$NbCol); + $this->ColWidth = $ColWidth; +/*-- RTL --*/ + + if ($this->directionality == 'rtl') { + for ($i=0;$i<$this->NbCol;$i++) { + $this->ColL[$i] = $absL + ($gap/2) + (($NbCol - ($i+1))*($PageWidth/$NbCol)) ; + $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos + } + } + else { +/*-- END RTL --*/ + for ($i=0;$i<$this->NbCol;$i++) { + $this->ColL[$i] = $absL + ($gap/2) + ($i* ($PageWidth/$NbCol) ); + $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos + } + } // *RTL* + $this->pgwidth = $ColWidth; + $this->SetCol(0); + $this->y0=$this->y; + } + $this->x = $this->lMargin; +} + +function SetCol($CurrCol) { +// Used internally to set column by number: 0 is 1st column + //Set position on a column + $this->CurrCol=$CurrCol; + $x = $this->ColL[$CurrCol]; + $xR = $this->ColR[$CurrCol]; // NB This is not R margin -> R pos + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $x += $this->MarginCorrection ; + $xR += $this->MarginCorrection ; + } + $this->SetMargins($x,($this->w - $xR),$this->tMargin); +} + +function AddColumn() { + $this->NewColumn(); + $this->ColumnAdjust = false; // disables all column height adjustment for the page. +} +function NewColumn() { + if ($this->ColActive==1) { + if($this->CurrCol<$this->NbCol-1) { + //Go to the next column + $this->CurrCol++; + $this->SetCol($this->CurrCol); + $this->y = $this->y0; + $this->ChangeColumn=1; + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + //Stay on the page + } + else { + //Go back to the first column + //Page break + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->AddPage($this->CurOrientation); + $this->SetCol(0); + $this->y0 = $this->tMargin; + $this->ChangeColumn= -($this->NbCol-1); + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + } + $this->x = $this->lMargin; + } + else { + $this->AddPage($this->CurOrientation); + } +} + +function printcolumnbuffer() { + // Columns ended (but page not ended) -> try to match all columns - unless disabled by using a custom column-break + if (!$this->ColActive && $this->ColumnAdjust && !$this->keepColumns) { + // Calculate adjustment to add to each column to calculate rel_y value + $this->ColDetails[0]['add_y'] = 0; + $last_col = 0; + // Recursively add previous column's height + for($i=1;$i<$this->NbCol;$i++) { + if (isset($this->ColDetails[$i]['bottom_margin']) && $this->ColDetails[$i]['bottom_margin']) { // If any entries in the column + $this->ColDetails[$i]['add_y'] = ($this->ColDetails[$i-1]['bottom_margin'] - $this->y0) + $this->ColDetails[$i-1]['add_y']; + $last_col = $i; // Last column actually printed + } + } + + // Calculate value for each position sensitive entry as though for one column + foreach($this->columnbuffer AS $key=>$s) { + $t = $s['s']; + if ($t == 'ACROFORM') { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + $this->columnbuffer[$key]['s'] = ''; + } + else if (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['col'])) { + $this->internallink[$key]['rel_y'] = $f['Y'] + $this->ColDetails[$f['col']]['add_y'] - $this->y0; + } + } + + $breaks = array(); + foreach($this->breakpoints AS $c => $bpa) { + foreach($bpa AS $rely) { + $breaks[] = $rely + $this->ColDetails[$c]['add_y'] - $this->y0; + } + } + + if (isset($this->ColDetails[$last_col]['bottom_margin'])) { $lcbm = $this->ColDetails[$last_col]['bottom_margin']; } + else { $lcbm = 0; } + $sum_h = $this->ColDetails[$last_col]['add_y'] + $lcbm - $this->y0; + //$sum_h = max($this->ColDetails[$last_col]['add_y'] + $this->ColDetails[$last_col]['bottom_margin'] - $this->y0, end($breaks)); + $target_h = ($sum_h / $this->NbCol); + + $cbr = array(); + for($i=1;$i<$this->NbCol;$i++) { + $th = ($sum_h * $i / $this->NbCol); + foreach($breaks AS $bk=>$val) { + if ($val > $th) { + if (($val-$th) < ($th-$breaks[$bk-1])) { $cbr[$i-1] = $val; } + else { $cbr[$i-1] = $breaks[$bk-1]; } + break; + } + } + } + $cbr[($this->NbCol-1)] = $sum_h; + + // Now update the columns - divide into columns of approximately equal value + $last_new_col = 0; + $yadj = 0; // mm + $xadj = 0; + $last_col_bottom = 0; + $lowest_bottom_y = 0; + $block_bottom = 0; + $newcolumn = 0; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + if ($s['rel_y'] >= $cbr[$newcolumn]) { + $newcolumn++; + } + else { + $newcolumn = $last_new_col ; + } + + + $block_bottom = max($block_bottom,($s['rel_y']+$s['h'])); + + if ($this->directionality == 'rtl') { // *RTL* + $xadj = -(($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap)); // *RTL* + } // *RTL* + else { // *RTL* + $xadj = ($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap); + } // *RTL* + + if ($last_new_col != $newcolumn) { // Added new column + $last_col_bottom = $this->columnbuffer[$key]['rel_y']; + $block_bottom = 0; + } + $yadj = ($s['rel_y'] - $s['y']) - ($last_col_bottom)+$this->y0; + // callback function + $t = $s['s']; + $t = preg_replace('/BT (\d+\.\d\d+) (\d+\.\d\d+) Td/e',"\$this->columnAdjustAdd('Td',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) ([\-]{0,1}\d+\.\d\d+) re/e',"\$this->columnAdjustAdd('re',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) l/e',"\$this->columnAdjustAdd('l',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/q (\d+\.\d\d+) 0 0 (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) cm \/(I|FO)/e',"\$this->columnAdjustAdd('img',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4','\\5')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) m/e',"\$this->columnAdjustAdd('draw',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) c/e',"\$this->columnAdjustAdd('bezier',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4','\\5','\\6')",$t); + + $this->columnbuffer[$key]['s'] = $t; + $this->columnbuffer[$key]['newcol'] = $newcolumn; + $this->columnbuffer[$key]['newy'] = $s['y'] + $yadj; + $last_new_col = $newcolumn; + $clb = $s['y'] + $yadj + $s['h'] ; // bottom_margin of current + if ((isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb > $this->ColDetails[$newcolumn]['max_bottom']) || (!isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb)) { $this->ColDetails[$newcolumn]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + // Adjust LINKS + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][0] += ($xadj*_MPDFK); + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + if ($this->PageAnnots[$this->page][$ref]['x'] < 0) { + $this->PageAnnots[$this->page][$ref]['x'] -= ($xadj); + } + else { + $this->PageAnnots[$this->page][$ref]['x'] += ($xadj); + } + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); // unlike PageLinks, Page annots has y values from top in mm + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$this->y0,'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->y0; + } +/*-- END TOC --*/ + + // Adjust column length to be equal + if ($this->colvAlign == 'J') { + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom']!=$this->y0) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + $yadj = ($s['newy'] - $this->y0) * ($ratio - 1); + + // Adjust LINKS + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); // y value + $this->PageLinks[$this->page][$ref][3] *= $ratio; // height + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['col'])) { + $last_col_bottom = 0; + for ($nbc=0; $nbc<$this->NbCol; $nbc++) { + if ($f['rel_y'] >= $cbr[$nbc]) { $last_col_bottom = $cbr[$nbc]; } + } + $yadj = ($f['rel_y'] - $f['Y']) - $last_col_bottom + $this->y0; + $f['Y'] += $yadj; + unset($f['col']); + unset($f['rel_y']); + $this->internallink[$key] = $f; + } + } + + $last_col = -1; + $trans_on = false; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom']!=$this->y0) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $this->pages[$this->page] .= $this->transformScale(100, $ratio*100, $x='', $this->y0, true)."\n"; + $trans_on = true; + } + } + // Now output the adjusted values + $this->pages[$this->page] .= $s['s']."\n"; + if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // only process position sensitive data + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + $trans_on = false; + } + } + if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true)."\n"; } + } + else { // if NOT $this->colvAlign == 'J' + // Now output the adjusted values + foreach($this->columnbuffer AS $s) { + $this->pages[$this->page] .= $s['s']."\n"; + } + } + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } + } + + // Columns not ended but new page -> align columns (can leave the columns alone - just tidy up the height) + else if ($this->colvAlign == 'J' && $this->ColumnAdjust && !$this->keepColumns) { + // calculate the lowest bottom margin + $lowest_bottom_y = 0; + foreach($this->columnbuffer AS $key=>$s) { + // Only process output data + $t = $s['s']; + if ($t == 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) || + (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) ) { + + $clb = $s['y'] + $s['h']; + if ((isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom']) || !isset($this->ColDetails[$s['col']]['max_bottom'])) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + $this->columnbuffer[$key]['rel_y'] = $s['y']; // Marks position sensitive data to process later + if ($t == 'ACROFORM') { $this->columnbuffer[$key]['s'] = ''; } + } + } + // Adjust column length equal + foreach($this->columnbuffer AS $key=>$s) { + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + $yadj = ($s['y'] - $this->y0) * ($ratio - 1); + + // Adjust LINKS + if (isset($s['rel_y'])) { // only process position sensitive data + // otherwise triggers for all entries in column buffer (.e.g. formatting) and makes below adjustments more than once + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); // y value + $this->PageLinks[$this->page][$ref][3] *= $ratio; // height + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + } + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$this->y0,'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->y0; + } +/*-- END TOC --*/ + $trans_on = false; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if ($this->ColDetails[$s['col']]['max_bottom']) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $this->pages[$this->page] .= $this->transformScale(100, $ratio*100, $x='', $this->y0, true)."\n"; + $trans_on = true; + } + } + // Now output the adjusted values + $this->pages[$this->page] .= $s['s']."\n"; + if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + $trans_on = false; // mPDF 5.1.001 + } + } + if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true)."\n"; } + + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } + } + + + // Just reproduce the page as it was + else { + // If page has not ended but height adjustment was disabled by custom column-break - adjust y + $lowest_bottom_y = 0; + if (!$this->ColActive && (!$this->ColumnAdjust || $this->keepColumns)) { + // calculate the lowest bottom margin + foreach($this->columnbuffer AS $key=>$s) { + // Only process output data + $t = $s['s']; + if ($t == 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) || + (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) ) { + + $clb = $s['y'] + $s['h']; + if ($clb > $this->ColDetails[$s['col']]['max_bottom']) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + } + } + } + foreach($this->columnbuffer AS $key=>$s) { + if ($s['s'] != 'ACROFORM') + $this->pages[$this->page] .= $s['s']."\n"; + } + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } +/*-- INDEX --*/ + + // Output Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ +/*-- TOC --*/ + // Output ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } +/*-- END TOC --*/ + } + foreach($this->internallink AS $key => $f) { + if (isset($this->internallink[$key]['col'])) unset($this->internallink[$key]['col']); + if (isset($this->internallink[$key]['rel_y'])) unset($this->internallink[$key]['rel_y']); + } + + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); +} + +/*-- END COLUMNS --*/ + + +//================================================================== +/*-- TABLES --*/ +function printcellbuffer() { + if (count($this->cellBorderBuffer )) { + sort($this->cellBorderBuffer); + foreach($this->cellBorderBuffer AS $cbb) { + $cba = unpack("A16dom/nbord/A1side/ns/dbw/a6ca/A10style/dx/dy/dw/dh/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd/dover/", $cbb); + $side = $cba['side']; + $details = array(); + $details[$side]['dom'] = (float) $cba['dom']; + $details[$side]['s'] = $cba['s']; + $details[$side]['w'] = $cba['bw']; + $details[$side]['c'] = $cba['ca']; + $details[$side]['style'] = trim($cba['style']); + $details['mbw']['BL'] = $cba['mbl']; + $details['mbw']['BR'] = $cba['mbr']; + $details['mbw']['RT'] = $cba['mrt']; + $details['mbw']['RB'] = $cba['mrb']; + $details['mbw']['TL'] = $cba['mtl']; + $details['mbw']['TR'] = $cba['mtr']; + $details['mbw']['LT'] = $cba['mlt']; + $details['mbw']['LB'] = $cba['mlb']; + $details['cellposdom'] = $cba['cpd']; + $details['p'] = $side; + if ($cba['over']==1) { $details[$side]['overlay'] = true; } + else { $details[$side]['overlay'] = false; } + $this->_tableRect($cba['x'],$cba['y'],$cba['w'],$cba['h'],$cba['bord'],$details, false, false); + + } + $this->cellBorderBuffer = array(); + } +} +//================================================================== +function printtablebuffer() { + + if (!$this->table_rotate) { + $this->pages[$this->page] .= $this->tablebuffer; + foreach($this->tbrot_Links AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + $this->tbrot_Links = array(); +/*-- ANNOTATIONS --*/ + foreach($this->tbrot_Annots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } + $this->tbrot_Annots = array(); +/*-- END ANNOTATIONS --*/ + +/*-- INDEX --*/ + // Output Reference (index) + foreach($this->tbrot_Reference AS $v) { + $Present=0; + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } + $this->tbrot_Reference = array(); +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->tbrot_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } + $this->tbrot_BMoutlines = array(); +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Output ToC + foreach($this->tbrot_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } + $this->tbrot_toc = array(); +/*-- END TOC --*/ + + return; + } + // else if rotated + $lm = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']; + $pw = $this->blk[$this->blklvl]['inner_width']; + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + + if ($this->table_rotate > 1) { // clockwise + if ($this->tbrot_align == 'L') { + $xadj = $this->tbrot_h ; // align L (as is) + } + else if ($this->tbrot_align == 'R') { + $xadj = $lm-$this->tbrot_x0+($pw) ; // align R + } + else { + $xadj = $lm-$this->tbrot_x0+(($pw + $this->tbrot_h)/2) ; // align C + } + $yadj = 0; + } + else { // anti-clockwise + if ($this->tbrot_align == 'L') { + $xadj = 0 ; // align L (as is) + } + else if ($this->tbrot_align == 'R') { + $xadj = $lm-$this->tbrot_x0+($pw - $this->tbrot_h) ; // align R + } + else { + $xadj = $lm-$this->tbrot_x0+(($pw - $this->tbrot_h)/2) ; // align C + } + $yadj = $this->tbrot_w; + } + + + $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj , true)."\n"; + $this->pages[$this->page] .= $this->transformRotate($this->table_rotate, $this->tbrot_x0 , $this->tbrot_y0 , true)."\n"; + + // Now output the adjusted values + $this->pages[$this->page] .= $this->tablebuffer; + + + foreach($this->tbrot_Links AS $p => $l) { + foreach($l AS $v) { + $w = $v[2]/_MPDFK; + $h = $v[3]/_MPDFK; + $ax = ($v[0]/_MPDFK) - $this->tbrot_x0; + $ay = (($this->hPt-$v[1])/_MPDFK) - $this->tbrot_y0; + if ($this->table_rotate > 1) { // clockwise + $bx = $this->tbrot_x0+$xadj-$ay-$h; + $by = $this->tbrot_y0+$yadj+$ax; + } + else { + $bx = $this->tbrot_x0+$xadj+$ay; + $by = $this->tbrot_y0+$yadj-$ax-$w; + } + $v[0] = $bx*_MPDFK; + $v[1] = ($this->h-$by)*_MPDFK; + $v[2] = $h*_MPDFK; // swap width and height + $v[3] = $w*_MPDFK; + $this->PageLinks[$p][] = $v; + } + } + $this->tbrot_Links = array(); + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['tbrot'])) { + $f['Y'] = $this->tbrot_y0; + $f['PAGE'] = $this->page; + unset($f['tbrot']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->tbrot_Annots AS $p => $l) { + foreach($l AS $v) { + $ax = abs($v['x']) - $this->tbrot_x0; // abs because -ve values are internally set and held for reference if annotMargin set + $ay = $v['y'] - $this->tbrot_y0; + if ($this->table_rotate > 1) { // clockwise + $bx = $this->tbrot_x0+$xadj-$ay; + $by = $this->tbrot_y0+$yadj+$ax; + } + else { + $bx = $this->tbrot_x0+$xadj+$ay; + $by = $this->tbrot_y0+$yadj-$ax; + } + if ($v['x'] < 0) { + $v['x'] = -$bx; + } + else { + $v['x'] = $bx; + } + $v['y'] = ($by); + $this->PageAnnots[$p][] = $v; + } + } + $this->tbrot_Annots = array(); +/*-- END ANNOTATIONS --*/ + + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->tbrot_BMoutlines AS $v) { + $v['y'] = $this->tbrot_y0; + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$this->page); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->tbrot_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($this->page)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC - uses document page number + foreach($this->tbrot_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$this->page,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->tbrot_y0; + } +/*-- END TOC --*/ + + + + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + + + $this->y = $this->tbrot_y0 + $this->tbrot_w; + $this->x = $this->lMargin; + + $this->tablebuffer = ''; +} + +//================================================================== +// Keep-with-table This buffers contents of h1-6 to keep on page with table +function printkwtbuffer() { + if (!$this->kwt_moved) { + foreach($this->kwt_buffer AS $s) { $this->pages[$this->page] .= $s['s']."\n"; } + foreach($this->kwt_Links AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + $this->kwt_Links = array(); +/*-- ANNOTATIONS --*/ + foreach($this->kwt_Annots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } + $this->kwt_Annots = array(); +/*-- END ANNOTATIONS --*/ + +/*-- INDEX --*/ + // Output Reference (index) + foreach($this->kwt_Reference AS $v) { + $Present=0; + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } + $this->kwt_Reference = array(); +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->kwt_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } + $this->kwt_BMoutlines = array(); +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Output ToC + foreach($this->kwt_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } + $this->kwt_toc = array(); +/*-- END TOC --*/ + + return; + } + + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $xadj = $this->lMargin - $this->kwt_x0 ; + //$yadj = $this->y - $this->kwt_y0 ; + $yadj = $this->tMargin - $this->kwt_y0 ; + + $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj , true)."\n"; + + // Now output the adjusted values + foreach($this->kwt_buffer AS $s) { $this->pages[$this->page] .= $s['s']."\n"; } + + // Adjust hyperLinks + foreach($this->kwt_Links AS $p => $l) { + foreach($l AS $v) { + $bx = $this->kwt_x0+$xadj; + $by = $this->kwt_y0+$yadj; + $v[0] = $bx*_MPDFK; + $v[1] = ($this->h-$by)*_MPDFK; + $this->PageLinks[$p][] = $v; + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['kwt'])) { + $f['Y'] += $yadj; + $f['PAGE'] = $this->page; + unset($f['kwt']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->kwt_Annots AS $p => $l) { + foreach($l AS $v) { + $bx = $this->kwt_x0+$xadj; + $by = $this->kwt_y0+$yadj; + if ($v['x'] < 0) { + $v['x'] = -$bx; + } + else { + $v['x'] = $bx; + } + $v['y'] = $by; + $this->PageAnnots[$p][] = $v; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->kwt_BMoutlines AS $v) { + if ($v['y'] != 0) { $v['y'] += $yadj; } + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$this->page); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->kwt_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($this->page)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->kwt_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$this->page,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][0] = $this->page; + $this->links[$v['link']][1] += $yadj; + } +/*-- END TOC --*/ + + + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + + $this->kwt_buffer = array(); + + $this->y += $this->kwt_height; +} + +/*-- END TABLES --*/ + + +//================================================================== + +function printfloatbuffer() { + if (count($this->floatbuffer)) { + $this->objectbuffer = $this->floatbuffer; + $this->printobjectbuffer(false); + $this->objectbuffer = array(); + $this->floatbuffer = array(); + $this->floatmargins = array(); + } +} +//================================================================== + +function printdivbuffer() { + $p1 = $this->blk[$this->blklvl]['startpage']; + $p2 = $this->page; + $bottom[$p1] = $this->ktBlock[$p1]['bottom_margin']; + $bottom[$p2] = $this->y; // $this->ktBlock[$p2]['bottom_margin']; + $top[$p1] = $this->kt_y00; + + $top2 = $this->h; + foreach($this->divbuffer AS $key=>$s) { + if ($s['page'] == $p2) { + $top2 = MIN($s['y'], $top2); + } + } + $top[$p2] = $top2; + $height[$p1] = ($bottom[$p1] - $top[$p1]); + $height[$p2] = ($bottom[$p2] - $top[$p2]); + $xadj[$p1] = $this->MarginCorrection; + $yadj[$p1] = -($top[$p1] - $top[$p2]); + $xadj[$p2] = 0; + $yadj[$p2] = $height[$p1]; + + // Output without any transformation + if ($this->ColActive || !$this->keep_block_together || $this->blk[$this->blklvl]['startpage'] == $this->page || ($this->page - $this->blk[$this->blklvl]['startpage']) > 1 || ($height[$p1]+$height[$p2]) > $this->h) { + foreach($this->divbuffer AS $s) { $this->pages[$s['page']] .= $s['s']."\n"; } + foreach($this->ktLinks AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + foreach($this->ktForms AS $key => $f) { + $this->form->forms[$f['n']] = $f; + } +/*-- ANNOTATIONS --*/ + foreach($this->ktAnnots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } +/*-- END ANNOTATIONS --*/ +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->ktReference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($p2,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $p2; + } + } + } + //If not found, add it + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($p2)); + } + } +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->ktBMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Adjust ToC + foreach($this->_kttoc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } +/*-- END TOC --*/ + + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + $this->keep_block_together = 0; + return; + } + else { + // Output with transformation + // mPDF 5.6.17 + $np = ''; + $lastpage = -1; + foreach($this->divbuffer AS $key=>$s) { + // callback function + $t = $s['s']; + $p = $s['page']; + if ($p != $lastpage) { + $q = ''; + if ($lastpage != -1) { $q = ' Q'."\n"; } + $t = $q . $this->StartTransform(true)."\n" . $this->transformTranslate($xadj[$p], $yadj[$p] , true)."\n" . $t; + $lastpage = $p; + } + $np .= $t."\n"; + } + if ($lastpage != -1) { $np .= ' Q'."\n"; } + + $this->pages[$this->page] .= $np; + + // Adjust hyperLinks + foreach($this->ktLinks AS $p => $l) { + foreach($l AS $v) { + $v[0] += ($xadj[$p]*_MPDFK); + $v[1] -= ($yadj[$p]*_MPDFK); + $this->PageLinks[$p2][] = $v; + } + } + foreach($this->ktForms AS $key => $f) { + $p = $f['page']; + $f['x'] += ($xadj[$p]); + $f['y'] += ($yadj[$p]); + $f['page'] = $p2; + $this->form->forms[$f['n']] = $f; + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['kt'])) { + $f['Y'] += ($yadj[$f['PAGE']]); + $f['PAGE'] = $p2; + unset($f['kt']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->ktAnnots AS $p => $l) { + foreach($l AS $v) { + if ($v['x']>0) { $v['x'] += $xadj[$p]; } + else if ($v['x']<0) { $v['x'] -= $xadj[$p]; } + $v['y'] += $yadj[$p]; + $this->PageAnnots[$p2][] = $v; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->ktBMoutlines AS $v) { + if ($v['y'] != 0) { $v['y'] += ($yadj[$v['p']]); } + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$p2); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->ktReference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$iReference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($p2,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $p2; + } + } + } + //If not found, add it + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($p2)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + // Adjust ToC + foreach($this->_kttoc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$p2,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][0] = $p2; + $this->links[$v['link']][1] += $yadj[$v['p']]; + } +/*-- END TOC --*/ + + $this->y = $top[$p2] + $height[$p1] + $height[$p2]; + $this->x = $this->lMargin; + + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + $this->keep_block_together = 0; + } +} + + +//================================================================== +// Added ELLIPSES and CIRCLES +function Circle($x,$y,$r,$style='S') { + $this->Ellipse($x,$y,$r,$r,$style); +} + +function Ellipse($x,$y,$rx,$ry,$style='S') { + if($style=='F') { $op='f'; } + elseif($style=='FD' or $style=='DF') { $op='B'; } + else { $op='S'; } + $lx=4/3*(M_SQRT2-1)*$rx; + $ly=4/3*(M_SQRT2-1)*$ry; + $h=$this->h; + $this->_out(sprintf('%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c', ($x+$rx)*_MPDFK,($h-$y)*_MPDFK, ($x+$rx)*_MPDFK,($h-($y-$ly))*_MPDFK, ($x+$lx)*_MPDFK,($h-($y-$ry))*_MPDFK, $x*_MPDFK,($h-($y-$ry))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x-$lx)*_MPDFK,($h-($y-$ry))*_MPDFK, ($x-$rx)*_MPDFK,($h-($y-$ly))*_MPDFK, ($x-$rx)*_MPDFK,($h-$y)*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x-$rx)*_MPDFK,($h-($y+$ly))*_MPDFK, ($x-$lx)*_MPDFK,($h-($y+$ry))*_MPDFK, $x*_MPDFK,($h-($y+$ry))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c %s', ($x+$lx)*_MPDFK,($h-($y+$ry))*_MPDFK, ($x+$rx)*_MPDFK,($h-($y+$ly))*_MPDFK, ($x+$rx)*_MPDFK,($h-$y)*_MPDFK, $op)); +} + +/*-- DIRECTW --*/ +// Added adaptation of shaded_box = AUTOSIZE-TEXT +function AutosizeText($text,$w,$font,$style,$szfont=72) { + $text = $this->purify_utf8_text($text); + if ($this->text_input_as_HTML) { + $text = $this->all_entities_to_utf8($text); + } + if ($this->usingCoreFont) { $text = mb_convert_encoding($text,$this->mb_enc,'UTF-8'); } + $text = ' '.$text.' '; + $width = $this->ConvertSize($w); + $loop = 0; + while ( $loop == 0 ) { + $this->SetFont($font,$style,$szfont); + $sz = $this->GetStringWidth( $text ); + if ( $sz > $w ) { $szfont --; } + else { $loop ++; } + } + $this->SetFont($font,$style,$szfont); + $this->Cell($w, 0, $text, 0, 0, "C"); +} +/*-- END DIRECTW --*/ + + + + + +// ==================================================== +// ==================================================== +/*-- RTL --*/ +function reverse_letters($str) { + $str = strtr($str, '{}[]()', '}{][)('); + return $this->mb_strrev($str, $this->mb_enc); +} + +function magic_reverse_dir(&$chunk, $join=true, $dir) { + if ($this->usingCoreFont) { return 0; } + if ($this->biDirectional) { + // mPDF 5.4.05 Include PUA for non-indexed Arabic glyphs + $pregRTLchars = $this->pregRTLchars; + if ($this->CurrentFont['unAGlyphs']) { $pregRTLchars .= "\x{F500}-\x{F7FF}"; } + + // Change Arabic + Persian. to Presentation Forms + if ($join) { + $chunk = preg_replace("/([".$pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $chunk ); + } + $contains_rtl = false; + $all_rtl = true; + $initSpace = false; + $endSpace = false; + $nonDirchars = "\x{A0}\"\'\(\)\{\}\[\].,:\\/-="; // mPDF 5.6.32 + // mPDF 5.6.43 + $bdo=array(); + preg_match_all('/([\x{202A}\x{202B}])(.*?)([\x{202C}])/u',$chunk,$m); + if (count($m[0])) { + for($i=0;$ireverse_letters($m[2][$i]); + } + else if ($m[1][$i]=="\xe2\x80\xaa") { // Left-to-Right Embedding [LRE] U+202A ‪ + $mark = code2utf(0xf880+$i); + $bdo[$i] = $m[2][$i]; + } + $chunk = preg_replace('/'.preg_quote($m[0][$i],'/').'/u',$mark,$chunk); + } + $pregRTLchars .= "\x{F800}-\x{F87F}"; + } + if (preg_match("/[".$pregRTLchars."]/u",$chunk)) { // Chunk contains RTL characters + if (preg_match("/^[ ]/",$chunk)) { $initSpace = true; $chunk = preg_replace("/^[ ]/",'',$chunk); } + if (preg_match("/[ ]$/",$chunk)) { $endSpace = true; $chunk = preg_replace("/[ ]$/",'',$chunk); } + + if (preg_match("/[^".$pregRTLchars.$nonDirchars." ]/u",$chunk)) { // Chunk also contains LTR characters + $all_rtl = false; + if ($dir == 'rtl') { + $chunk = preg_replace("/([^".$pregRTLchars.$nonDirchars."][".$nonDirchars."]*) ([".$nonDirchars."]*[^".$pregRTLchars.$nonDirchars."])/u","\\1\x07\\2",$chunk); + } + $chunk = preg_replace("/([".$pregRTLchars."][".$nonDirchars."]*) ([".$nonDirchars."]*[".$pregRTLchars."])/u","\\1\x07\\2",$chunk); + $bits = explode(' ',$chunk); + foreach($bits AS $bitkey=>$bit) { + $bit = preg_replace("/\x07/"," ",$bit); + if (preg_match("/^[".$pregRTLchars.$nonDirchars." ]*$/u",$bit)) { + $bits[$bitkey] = $this->reverse_letters($bit); + } + else if (preg_match("/[".$pregRTLchars."]/u",$bit)) { + if ($dir == 'rtl') { + $bit = preg_replace("/([^".$pregRTLchars.$nonDirchars." ])([".$nonDirchars."]*[".$pregRTLchars."])/u","\\1\x07\\2",$bit ); + $bit = preg_replace("/([".$pregRTLchars."][".$nonDirchars."]*)([^".$pregRTLchars.$nonDirchars." ])/u","\\1\x07\\2",$bit ); + } + else { + $bit = preg_replace("/([^".$pregRTLchars." ][".$nonDirchars."]*)([".$pregRTLchars." ])/u","\\1\x07\\2",$bit ); + $bit = preg_replace("/([".$pregRTLchars." ])([".$nonDirchars."]*[^".$pregRTLchars." ])/u","\\1\x07\\2",$bit ); + } + $sbits = explode("\x07",$bit ); + foreach($sbits AS $sbitkey=>$sbit) { + $sbit = preg_replace("/\x07/","",$sbit); + if (preg_match("/^[".$pregRTLchars.$nonDirchars." ]*$/u",$sbit)) { + $sbits[$sbitkey] = $this->reverse_letters($sbit); + } + else if (preg_match("/[".$pregRTLchars."]/u",$sbit) && $dir=='rtl') { + $sbits[$sbitkey] = $this->reverse_letters($sbit); + } + else { + // Reverse numerals only to RTL + $sbit = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $sbit ); // mPDF 5.6.32 // mPDF 5.6.46 + $sbits[$sbitkey] = $sbit; + } + } + if ($dir == 'rtl') { $sbits = array_reverse($sbits,false); } + $bits[$bitkey] = implode('',$sbits); + } + else if (preg_match("/[".$pregRTLchars."]/u",$bit) && $dir=='rtl') { + $bits[$bitkey] = $this->reverse_letters($bit); + } + else { + // Reverse numerals only to RTL + $bit = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $bit ); // mPDF 5.6.32 // mPDF 5.6.46 + $bits[$bitkey] = $bit; + } + } + if ($dir == 'rtl') { $bits = array_reverse($bits,false); } + $chunk = implode(' ',$bits); + } + else { $chunk = $this->reverse_letters($chunk); } + $contains_rtl = true; + + // Un-Reverse numerals back to ltr + $chunk = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $chunk ); // mPDF 5.6.13 // mPDF 5.6.32 // mPDF 5.6.46 + if ($dir == 'rtl') { + if ($endSpace) { $chunk = ' '.$chunk; } + if ($initSpace) { $chunk .= ' '; } + } + else { + if ($initSpace) { $chunk = ' '.$chunk; } + if ($endSpace) { $chunk .= ' '; } + } + } + else { $all_rtl = false; } + + // mPDF 5.6.43 + if (count($bdo)) { + for($i=0;$isubstitute = array(); + foreach($subsarray AS $key => $val) { + $this->substitute[code2utf($key)] = $val; + } +} + + +function SubstituteChars($html) { + // only substitute characters between tags + if (count($this->substitute)) { + $a=preg_split('/(<.*?>)/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + $html = ''; + foreach($a as $i => $e) { + if($i%2==0) { + $e = strtr($e, $this->substitute); + } + $html .= $e; + } + } + return $html; +} + + +function SubstituteCharsSIP(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + if (preg_match("/^(.*?)([\x{20000}-\x{2FFFF}]+)(.*)/u", $writehtml_e, $m)) { + if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { + $font = $this->CurrentFont['sipext']; + if (!in_array($font, $this->available_unifonts)) { return 0; } + $writehtml_a[$writehtml_i] = $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i; + return 4; + } + } + return 0; +} + +// If core font is selected in document which is not onlyCoreFonts - substitute with non-core font +function SubstituteCharsNonCore(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + if (mb_convert_encoding(mb_convert_encoding($writehtml_e, $this->mb_enc, "UTF-8"), "UTF-8", $this->mb_enc) == $writehtml_e) { + return 0; + } + $cw = &$this->CurrentFont['cw']; + $unicode = $this->UTF8StringToArray($writehtml_e, false); + $start = -1; + $end = 0; + $flag = 0; + $ftype = ''; + $u = array(); + if (!$this->subArrMB) { + include(_MPDF_PATH.'includes/subs_core.php'); + $this->subArrMB['a'] = $aarr; + $this->subArrMB['s'] = $sarr; + $this->subArrMB['z'] = $zarr; + } + foreach($unicode AS $c => $char) { + if (($char> 127 || ($flag==1 && $char==32)) && $char != 173 && (!isset($this->subArrMB['a'][$char]) || ($flag==1 && $char==32)) && ($char<1536 || ($char>1791 && $char < 2304) || $char>3455)) { + if ($flag==0) { $start=$c; } + $flag=1; + $u[] = $char; + } + else if ($flag>0) { $end=$c-1; break; } + } + if ($flag>0 && !$end) { $end=count($unicode)-1; } + if ($start==-1) { return 0; } + // TRY IN BACKUP SUBS FONT + if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = array("$this->backupSubsFont"); } + foreach($this->backupSubsFont AS $bsfctr=>$bsf) { + if ($this->fonttrans[$bsf] == 'chelvetica' || $this->fonttrans[$bsf] == 'ctimes' || $this->fonttrans[$bsf] == 'ccourier') { continue; } + $font = $bsf; + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($bsf, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { continue; } + $l = 0; + foreach($u AS $char) { + if ($char == 173 || $this->_charDefined($cw,$char) || ($char>1536 && $char<1791) || ($char>2304 && $char<3455 )) { + $l++; + } + else { + if ($l==0 && $bsfctr == (count($this->backupSubsFont)-1)) { // Not found even in last backup font + $cont = mb_substr($writehtml_e, $start+1); + $writehtml_e = mb_substr($writehtml_e, 0, $start+1, 'UTF-8'); + array_splice($writehtml_a, $writehtml_i+1, 0, array('', $cont)); + $this->subPos = $writehtml_i+1; + return 2; + } + else { break; } + } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l, 'UTF-8'); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + + unset($cw); + return 0; +} + + +function SubstituteCharsMB(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + $cw = &$this->CurrentFont['cw']; + $unicode = $this->UTF8StringToArray($writehtml_e, false); + $start = -1; + $end = 0; + $flag = 0; + $ftype = ''; + $u = array(); + foreach($unicode AS $c => $char) { + if (($flag == 0 || $flag==2) && (!$this->_charDefined($cw,$char) || ($flag==2 && $char==32)) && $this->checkSIP && $char > 131071) { // Unicode Plane 2 (SIP) + if (in_array($this->FontFamily ,$this->available_CJK_fonts)) { return 0; } + if ($flag==0) { $start=$c; } + $flag=2; + $u[] = $char; + } + //else if (($flag == 0 || $flag==1) && $char != 173 && !$this->_charDefined($cw,$char) && ($char<1423 || ($char>3583 && $char < 11263))) { + else if (($flag == 0 || $flag==1) && $char != 173 && (!$this->_charDefined($cw,$char) || ($flag==1 && $char==32)) && ($char<1536 || ($char>1791 && $char < 2304) || $char>3455)) { + if ($flag==0) { $start=$c; } + $flag=1; + $u[] = $char; + } + else if ($flag>0) { $end=$c-1; break; } + } + if ($flag>0 && !$end) { $end=count($unicode)-1; } + if ($start==-1) { return 0; } + if ($flag == 2) { // SIP + // Check if current CJK font has a ext-B related font + if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { + $font = $this->CurrentFont['sipext']; + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($font, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { return 0; } + $l = 0; + foreach($u AS $char) { + if ($this->_charDefined($cw,$char) || $char > 131071) { + $l++; + } + else { break; } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + // Check Backup SIP font (defined in config_fonts.php) + if (isset($this->backupSIPFont) && $this->backupSIPFont) { + if ($this->currentfontfamily != $this->backupSIPFont) { $font = $this->backupSIPFont; } + else { unset($cw); return 0; } + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($this->backupSIPFont, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { return 0; } + $l = 0; + foreach($u AS $char) { + if ($this->_charDefined($cw,$char) || $char > 131071) { + $l++; + } + else { break; } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + return 0; + } + + + // FIRST TRY CORE FONTS + if (!$this->PDFA && !$this->PDFX) { + $repl = array(); + if (!$this->subArrMB) { + include(_MPDF_PATH.'includes/subs_core.php'); + $this->subArrMB['a'] = $aarr; + $this->subArrMB['s'] = $sarr; + $this->subArrMB['z'] = $zarr; + } + if (isset($this->subArrMB['a'][$u[0]])) { + $font = 'tta'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['a'][$char]) { $repl[] = $this->subArrMB['a'][$char]; } + else { break; } + } + } + else if (isset($this->subArrMB['z'][$u[0]])) { + $font = 'ttz'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['z'][$char]) { $repl[] = $this->subArrMB['z'][$char]; } + else { break; } + } + } + else if (isset($this->subArrMB['s'][$u[0]])) { + $font = 'tts'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['s'][$char]) { $repl[] = $this->subArrMB['s'][$char]; } + else { break; } + } + } + if ($ftype=='C') { + $patt = mb_substr($writehtml_e, $start, count($repl)); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array($font, implode('|', $repl), '/'.$font, $m[3])); // e.g. + $this->subPos = $writehtml_i+3; + return 4; + } + return 0; + } + } + + // FIND IN DEFAULT FONT - removed mPDF 5.0 + + // LASTLY TRY IN BACKUP SUBS FONT + if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = array("$this->backupSubsFont"); } + foreach($this->backupSubsFont AS $bsfctr=>$bsf) { + if ($this->currentfontfamily != $bsf) { $font = $bsf; } + else { continue; } + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($bsf, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { continue; } + $l = 0; + foreach($u AS $char) { + if ($char == 173 || $this->_charDefined($cw,$char) || ($char>1536 && $char<1791) || ($char>2304 && $char<3455 )) { // Arabic and Indic + $l++; + } + else { + if ($l==0 && $bsfctr == (count($this->backupSubsFont)-1)) { // Not found even in last backup font + $cont = mb_substr($writehtml_e, $start+1); + $writehtml_e = mb_substr($writehtml_e, 0, $start+1); + array_splice($writehtml_a, $writehtml_i+1, 0, array('', $cont)); + $this->subPos = $writehtml_i+1; + return 2; + } + else { break; } + } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + + unset($cw); + return 0; +} + + +function setHiEntitySubstitutions() { + $entarr = array ( + 'nbsp' => '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', + 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', + 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', + 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', + 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', + 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', + 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', + 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', + 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', + 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', + 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', + 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', + 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', + 'thorn' => '254', 'yuml' => '255', 'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', + 'fnof' => '402', 'circ' => '710', 'tilde' => '732', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', + 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', + 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', + 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', + 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', + 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', + 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', + 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', + 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', + 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'bull' => '8226', + 'hellip' => '8230', 'permil' => '8240', 'prime' => '8242', 'Prime' => '8243', 'lsaquo' => '8249', 'rsaquo' => '8250', 'oline' => '8254', + 'frasl' => '8260', 'euro' => '8364', 'image' => '8465', 'weierp' => '8472', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', + 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', + 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', + 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', + 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', + 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', + 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', + 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', + 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', + 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830', + ); + foreach($entarr AS $key => $val) { + $this->entsearch[] = '&'.$key.';'; + $this->entsubstitute[] = code2utf($val); + } +} + +function SubstituteHiEntities($html) { + // converts html_entities > ASCII 127 to unicode + // Leaves in particular < to distinguish from tag marker + if (count($this->entsearch)) { + $html = str_replace($this->entsearch,$this->entsubstitute,$html); + } + return $html; +} + + +// Edited v1.2 Pass by reference; option to continue if invalid UTF-8 chars +function is_utf8(&$string) { + if ($string === mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { + return true; + } + else { + if ($this->ignore_invalid_utf8) { + $string = mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") ; + return true; + } + else { + return false; + } + } +} + + +function purify_utf8($html,$lo=true) { + // For HTML + // Checks string is valid UTF-8 encoded + // converts html_entities > ASCII 127 to UTF-8 + // Only exception - leaves low ASCII entities e.g. < & etc. + // Leaves in particular < to distinguish from tag marker + if (!$this->is_utf8($html)) { + echo "

    HTML contains invalid UTF-8 character(s)

    "; + while (mb_convert_encoding(mb_convert_encoding($html, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") != $html) { + $a = iconv('UTF-8', 'UTF-8', $html); + echo ($a); + $pos = $start = strlen($a); + $err = ''; + while ( ord(substr($html,$pos,1)) > 128 ) { + $err .= '[[#'.ord(substr($html,$pos,1)).']]'; + $pos++; + } + echo ''.$err.''; + $html = substr($html, $pos); + } + echo $html; + $this->Error(""); + } + $html = preg_replace("/\r/", "", $html ); + + // converts html_entities > ASCII 127 to UTF-8 + // Leaves in particular < to distinguish from tag marker + $html = $this->SubstituteHiEntities($html); + + // converts all &#nnn; or &#xHHH; to UTF-8 multibyte + // If $lo==true then includes ASCII < 128 + $html = strcode2utf($html,$lo); + return ($html); +} + +function purify_utf8_text($txt) { + // For TEXT + // Make sure UTF-8 string of characters + if (!$this->is_utf8($txt)) { $this->Error("Text contains invalid UTF-8 character(s)"); } + + $txt = preg_replace("/\r/", "", $txt ); + + return ($txt); +} +function all_entities_to_utf8($txt) { + // converts txt_entities > ASCII 127 to UTF-8 + // Leaves in particular < to distinguish from tag marker + $txt = $this->SubstituteHiEntities($txt); + + // converts all &#nnn; or &#xHHH; to UTF-8 multibyte + $txt = strcode2utf($txt); + + $txt = $this->lesser_entity_decode($txt); + return ($txt); +} + + +// ==================================================== +/*-- BARCODES --*/ +// UPC/EAN barcode +// EAN13, EAN8, UPCA, UPCE, ISBN, ISSN +// Accepts 12 or 13 digits with or without - hyphens +function WriteBarcode($code, $showtext=1, $x='', $y='', $size=1, $border=0, $paddingL=1, $paddingR=1, $paddingT=2, $paddingB=2, $height=1, $bgcol=false, $col=false, $btype='ISBN', $supplement='0', $supplement_code='', $k=1) { + if (empty($code)) { + return; + } + $codestr = $code; + $code = preg_replace('/\-/','',$code); + + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + if ($btype == 'ISSN' || $btype == 'ISBN') { + $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); + } + else { $arrcode = $this->barcode->getBarcodeArray($code, $btype); } + + if ($arrcode === false) { $this->Error('Error in barcode string: '.$codestr); } + if((($btype=='EAN13' || $btype=='ISBN' || $btype=='ISSN') && strlen($code) == 12) || ($btype=='UPCA' && strlen($code) == 11) + || ($btype=='UPCE' && strlen($code) == 11) || ($btype=='EAN8' && strlen($code) == 7)) { + $code .= $arrcode['checkdigit']; + if (stristr($codestr,'-')) { $codestr .= '-' . $arrcode['checkdigit']; } + else { $codestr .= $arrcode['checkdigit']; } + } + if ($btype == 'ISBN') { $codestr = 'ISBN '.$codestr; } + if ($btype == 'ISSN') { $codestr = 'ISSN '.$codestr; } + + if (empty($x)) { + $x = $this->x; + } + if (empty($y)) { + $y = $this->y; + } + // set foreground color + $prevDrawColor = $this->DrawColor; + $prevTextColor = $this->TextColor; + $prevFillColor = $this->FillColor; + $lw = $this->LineWidth; + $this->SetLineWidth(0.01); + + $size /= $k; // in case resized in a table + + $xres = $arrcode['nom-X'] * $size; + $llm = $arrcode['lightmL'] * $arrcode['nom-X'] * $size; // Left Light margin + $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin + + $bcw = ($arrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size + + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding + + $fbwi = $fbw - 2; // Full barcode width incl. light margins - 2mm - for isbn string + + // cf. http://www.gs1uk.org/downloads/bar_code/Bar coding getting it right.pdf + $num_height = 3 * $size; // Height of numerals + $fbh = $arrcode['nom-H'] * $size * $height; // Full barcode height incl. numerals + $bch = $fbh - (1.5 * $size); // Barcode height of bars (3mm for numerals) + + if (($btype=='EAN13' && $showtext) || $btype == 'ISSN' || $btype == 'ISBN') { // Add height for ISBN string + margin from top of bars + $tisbnm = 1.5 * $size; // Top margin between isbn (if shown) & bars + $codestr_fontsize = 2.1 * $size; + $paddingT += $codestr_fontsize + $tisbnm ; + } + $oh = $fbh + $paddingT + $paddingB; // Full overall height incl. user-defined padding + + // PRINT border background color + $xpos = $x; + $ypos = $y; + if ($col) { + $this->SetDColor($col); + $this->SetTColor($col); + } + else { + $this->SetDColor($this->ConvertColor(0)); + $this->SetTColor($this->ConvertColor(0)); + } + if ($bgcol) { + $this->SetFColor($bgcol); + } + else { $this->SetFColor($this->ConvertColor(255)); } + if (!$bgcol && !$col) { // fn. called directly - not via HTML + if ($border) { $fillb = 'DF'; } else { $fillb = 'F'; } + $this->Rect($xpos, $ypos, $ow, $oh, $fillb); + } + + + // PRINT BARS + $xpos = $x + $paddingL + $llm ; + $ypos = $y + $paddingT; + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + if ($arrcode !== false) { + foreach ($arrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + // draw a vertical bar + $this->Rect($xpos, $ypos, $bw, $bch, 'F'); + } + $xpos += $bw; + } + } + + + // print text + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->FontStyle; + $prevFontSizePt = $this->FontSizePt; + + // ISBN string + if (($btype=='EAN13' && $showtext) || $btype=='ISBN' || $btype=='ISSN') { + if ($this->onlyCoreFonts) { + $this->SetFont('chelvetica'); + } + else { + $this->SetFont('sans'); + } + + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + $this->x = $x + $paddingL + 1; // 1mm left margin (cf. $fbwi above) + // max width is $fbwi + $loop = 0; + while ( $loop == 0 ) { + $this->SetFontSize($codestr_fontsize*1.4*_MPDFK, false); // don't write + $sz = $this->GetStringWidth( $codestr ); + if ($sz > $fbwi) + $codestr_fontsize -= 0.1; + else + $loop ++; + } + $this->SetFont('','',$codestr_fontsize*1.4*_MPDFK, true, true); // * 1.4 because font height is only 7/10 of given mm + // WORD SPACING + if ($fbwi > $sz) { + $xtra = $fbwi - $sz; + $charspacing = $xtra / (strlen($codestr)-1); + if ($charspacing) { $this->_out(sprintf('BT %.3F Tc ET',$charspacing*_MPDFK)); } + } + $this->y = $y + $paddingT - ($codestr_fontsize ) - $tisbnm ; + $this->Cell($fbw , $codestr_fontsize, $codestr); + if ($charspacing) { $this->_out('BT 0 Tc ET'); } + } + + + // Bottom NUMERALS + if ($this->onlyCoreFonts) { + $this->SetFont('mono'); + } + else { + if (in_array('ocrb',$this->available_unifonts)) { $this->SetFont('ocrb'); } + else { $this->SetFont('mono'); } + } + if (isset($this->CurrentFont['desc']['CapHeight'])) { $fh = (1000/$this->CurrentFont['desc']['CapHeight']); } + else if (isset($this->CurrentFont['desc']['Ascent'])) { $fh = (1000/$this->CurrentFont['desc']['Ascent']); } + else { $fh = 1.2; } + + $charRO = ''; + if ($btype=='EAN13' || $btype=='ISBN' || $btype=='ISSN') { + $outerfontsize = 3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 6; // number of numerals in each half + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($code,1,6); // Left Inner + $charRI = substr($code,7,6); // Right Inner + if (!$supplement) $charRO = '>'; // Right Outer + } + else if ($btype=='UPCA') { + $outerfontsize = 2.3; // Inner fontsize = 3 + $outerp = $xres * 10; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 5; + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($code,1,5); // Left Inner + $charRI = substr($code,6,5); // Right Inner + $charRO = substr($code,11,1); // Right Outer + } + else if ($btype=='UPCE') { + $outerfontsize = 2.3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = 0; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 3; + $upce_code = $arrcode['code']; + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($upce_code,0,3); // Left Inner + $charRI = substr($upce_code,3,3); // Right Inner + $charRO = substr($code,11,1); // Right Outer + } + else if ($btype=='EAN8') { + $outerfontsize = 3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 4; + $charLO = '<'; // Left Outer + $charLI = substr($code,0,4); // Left Inner + $charRI = substr($code,4,4); // Right Inner + if (!$supplement) $charRO = '>'; // Right Outer + } + + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + if (!$this->usingCoreFont) { $cw = $this->_getCharWidth($this->CurrentFont['cw'],32)*3*$fh*$size/1000; } // character width at 3mm + else { $cw = $this->_getCharWidth($this->CurrentFont['cw'],48)*3*$fh*$size/1000; } // 48 == char "0" + + // Outer left character + $y_text = $y + $paddingT + $bch - ($num_height/2); + $y_text_outer = $y + $paddingT + $bch - ($num_height*($outerfontsize/3)/2); + + $this->x = $x + $paddingL - ($cw*($outerfontsize/3)*0.1); // 0.1 is correction as char does not fill full width; + $this->y = $y_text_outer; + $this->Cell($cw, $num_height, $charLO ); + + // WORD SPACING for inner chars + $xtra = $textw - ($cw*$chars); + $charspacing = $xtra / ($chars-1); + if ($charspacing) { $this->_out(sprintf('BT %.3F Tc ET',$charspacing*_MPDFK)); } + + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + + $this->SetFontSize(3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + // Inner left half characters + $this->x = $x + $paddingL + $llm + $outerp; + $this->y = $y_text; + $this->Cell($textw, $num_height, $charLI , 0, 0, '', 1); + + // Inner right half characters + $this->x = $x + $paddingL + $llm + ($bcw*0.5) + $innerp; + $this->y = $y_text; + $this->Cell($textw, $num_height, $charRI , 0, 0, '', 1); + + if ($charspacing) { $this->_out('BT 0 Tc ET'); } + + // Outer Right character + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw*($outerfontsize/3)*0.9); // 0.9 is correction as char does not fill full width + $this->y = $y_text_outer; + $this->Cell($cw*($outerfontsize/3), $num_height, $charRO , 0, 0, 'R'); + + if ($supplement) { // EAN-2 or -5 Supplement + // PRINT BARS + $supparrcode = $this->barcode->getBarcodeArray($supplement_code, 'EAN'.$supplement); + if ($supparrcode === false) { $this->Error('Error in barcode string (supplement): '.$codestr.' '.$supplement_code); } + if(strlen($supplement_code) != $supplement) { + $this->Error('Barcode supplement incorrect: '.$supplement_code); + } + $llm = $fbw - (($arrcode['lightmR'] - $supparrcode['sepM']) * $arrcode['nom-X'] * $size); // Left Light margin + $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin + + $bcw = ($supparrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size + + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding + $bch = $fbh - (1.5 * $size) - ($num_height + 0.5); // Barcode height of bars (3mm for numerals) + + $xpos = $x + $paddingL + $llm ; + $ypos = $y + $paddingT + $num_height + 0.5; + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + if ($supparrcode !== false) { + foreach ($supparrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + // draw a vertical bar + $this->Rect($xpos, $ypos, $bw, $bch, 'F'); + } + $xpos += $bw; + } + } + + // Characters + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + $this->SetFontSize(3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + $this->x = $x + $paddingL + $llm; + $this->y = $y + $paddingT; + $this->Cell($bcw, $num_height, $supplement_code, 0, 0, 'C'); + + // Outer Right character (light margin) + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw*0.9); // 0.9 is correction as char does not fill full width + $this->y = $y + $paddingT; + $this->Cell($cw*($outerfontsize/3), $num_height, '>', 0, 0, 'R'); + } + + + + // Restore ************** + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); + $this->DrawColor = $prevDrawColor; + $this->TextColor = $prevTextColor; + $this->FillColor = $prevFillColor; + $this->SetLineWidth($lw); + $this->SetY($y); +} + + + +// ==================================================== +// POSTAL and OTHER barcodes +function WriteBarcode2($code, $x='', $y='', $size=1, $height=1, $bgcol=false, $col=false, $btype='IMB', $print_ratio='', $k=1) { + if (empty($code)) { return; } + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + $arrcode = $this->barcode->getBarcodeArray($code, $btype, $print_ratio); + + if ($arrcode === false) { $this->Error('Error in barcode string: '.$code); } + if (empty($x)) { $x = $this->x; } + if (empty($y)) { $y = $this->y; } + $prevDrawColor = $this->DrawColor; + $prevTextColor = $this->TextColor; + $prevFillColor = $this->FillColor; + $lw = $this->LineWidth; + $this->SetLineWidth(0.01); + $size /= $k; // in case resized in a table + $xres = $arrcode['nom-X'] * $size; + + if ($btype == 'IMB' || $btype == 'RM4SCC' || $btype == 'KIX' || $btype == 'POSTNET' || $btype == 'PLANET') { + $llm = $arrcode['quietL'] / $k; // Left Quiet margin + $rlm = $arrcode['quietR'] / $k; // Right Quiet margin + $tlm = $blm = $arrcode['quietTB'] / $k; + $height=1; // Overrides + } + else if (in_array($btype, array('C128A','C128B','C128C','EAN128A','EAN128B','EAN128C','C39','C39+','C39E','C39E+','S25','S25+','I25','I25+','I25B','I25B+','C93','MSI','MSI+','CODABAR','CODE11'))) { + $llm = $arrcode['lightmL'] * $xres; // Left Quiet margin + $rlm = $arrcode['lightmR'] * $xres; // Right Quiet margin + $tlm = $blm = $arrcode['lightTB'] * $xres * $height; + } + + + $bcw = ($arrcode["maxw"] * $xres); + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + + $bch = ($arrcode["nom-H"] * $size * $height); + $fbh = $bch + $tlm + $blm; // Full barcode height + + // PRINT border background color + $xpos = $x; + $ypos = $y; + if ($col) { + $this->SetDColor($col); + $this->SetTColor($col); + } + else { + $this->SetDColor($this->ConvertColor(0)); + $this->SetTColor($this->ConvertColor(0)); + } + if ($bgcol) { + $this->SetFColor($bgcol); + } + else { $this->SetFColor($this->ConvertColor(255)); } + + // PRINT BARS + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + $xpos = $x + $llm ; + + if ($arrcode !== false) { + foreach ($arrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + $ypos = $y + $tlm + ($bch * $v['p'] / $arrcode['maxh']); + $this->Rect($xpos, $ypos, $bw, ($v['h'] * $bch / $arrcode['maxh']), 'F'); + } + $xpos += $bw; + } + } + + // PRINT BEARER BARS + if ($btype == 'I25B' || $btype == 'I25B+') { + $this->Rect($x, $y, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); + $this->Rect($x, $y+$tlm+$bch, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); + } + + // Restore ************** + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); + $this->DrawColor = $prevDrawColor; + $this->TextColor = $prevTextColor; + $this->FillColor = $prevFillColor; + $this->SetLineWidth($lw); + $this->SetY($y); +} + +/*-- END BARCODES --*/ + +// ==================================================== +// ==================================================== + +function StartTransform($returnstring=false) { + if ($returnstring) { return('q'); } + else { $this->_out('q'); } +} +function StopTransform($returnstring=false) { + if ($returnstring) { return('Q'); } + else { $this->_out('Q'); } +} +function transformScale($s_x, $s_y, $x='', $y='', $returnstring=false) { + if ($x === '') { + $x=$this->x; + } + if ($y === '') { + $y=$this->y; + } + if (($s_x == 0) OR ($s_y == 0)) { + $this->Error('Please do not use values equal to zero for scaling'); + } + $y = ($this->h - $y) * _MPDFK; + $x *= _MPDFK; + //calculate elements of transformation matrix + $s_x /= 100; + $s_y /= 100; + $tm[0] = $s_x; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = $s_y; + $tm[4] = $x * (1 - $s_x); + $tm[5] = $y * (1 - $s_y); + //scale the coordinate system + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function transformTranslate($t_x, $t_y, $returnstring=false) { + //calculate elements of transformation matrix + $tm[0] = 1; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = 1; + $tm[4] = $t_x * _MPDFK; + $tm[5] = -$t_y * _MPDFK; + //translate the coordinate system + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function transformRotate($angle, $x='', $y='', $returnstring=false) { + if ($x === '') { + $x=$this->x; + } + if ($y === '') { + $y=$this->y; + } + $angle = -$angle; + $y = ($this->h - $y) * _MPDFK; + $x *= _MPDFK; + //calculate elements of transformation matrix + $tm[0] = cos(deg2rad($angle)); + $tm[1] = sin(deg2rad($angle)); + $tm[2] = -$tm[1]; + $tm[3] = $tm[0]; + $tm[4] = $x + $tm[1] * $y - $tm[0] * $x; + $tm[5] = $y - $tm[0] * $y - $tm[1] * $x; + //rotate the coordinate system around ($x,$y) + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function _transform($tm, $returnstring=false) { + if ($returnstring) { return(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } + else { $this->_out(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } +} + + + +/*-- INDIC --*/ +// INDIC ============================ +// This conversion can only be done when font is set +function ConvertIndic(&$str) { + if (preg_match('/^ind_([a-z]{2})_/',$this->currentfontfamily, $m)) { + if (!class_exists('indic', false)) { include(_MPDF_PATH.'classes/indic.php'); } + if (empty($this->indic)) { $this->indic = new indic($this); } + $earr = $this->UTF8StringToArray($str, false); + $str = $this->indic->substituteIndic($earr, $m[1], $this->currentfontfamily); + } +} +/*-- END INDIC --*/ + +// AUTOFONT ========================= +function AutoFont($html) { + if ($this->onlyCoreFonts) { return $html; } + $this->useLang = true; + if ($this->autoFontGroupSize == 1) { $extra = $this->pregASCIIchars1; } + else if ($this->autoFontGroupSize == 3) { $extra = $this->pregASCIIchars3; } + else { $extra = $this->pregASCIIchars2; } + $n = ''; + $a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + foreach($a as $i => $e) { + if($i%2==0) { + $e = strcode2utf($e); + $e = $this->lesser_entity_decode($e); + + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + +/*-- CJK-FONTS --*/ + if ($this->autoFontGroups & AUTOFONT_CJK) { + $e = preg_replace("/([".$this->pregCJKchars.$extra."]*[".$this->pregCJKchars."][".$this->pregCJKchars.$extra."]*)/ue", '$this->replaceCJK(stripslashes(\'\\1\'))', $e); + } +/*-- END CJK-FONTS --*/ + +/*-- RTL --*/ + if ($this->autoFontGroups & AUTOFONT_RTL) { + // HEBREW + $e = preg_replace("/([".$this->pregHEBchars .$extra."]*[".$this->pregHEBchars ."][".$this->pregHEBchars .$extra."]*)/u", "\xef\xbf\xb0span lang=\"he\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // All Arabic + $e = preg_replace("/([".$this->pregARABICchars .$extra."]*[".$this->pregARABICchars ."][".$this->pregARABICchars .$extra."]*)/ue", '$this->replaceArabic(stripslashes(\'\\1\'))', $e); + } +/*-- END RTL --*/ + +/*-- INDIC --*/ + // INDIC + if ($this->autoFontGroups & AUTOFONT_INDIC) { + // Bengali + $e = preg_replace("/([".$this->pregBNchars .$this->pregINDextra."]*[".$this->pregBNchars ."][".$this->pregBNchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"bn\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Devanagari (= script for Hindi, Nepali + Sindhi) + $e = preg_replace("/([".$this->pregHIchars .$this->pregINDextra."]*[".$this->pregHIchars ."][".$this->pregHIchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"hi\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Gujarati + $e = preg_replace("/([".$this->pregGUchars .$this->pregINDextra."]*[".$this->pregGUchars ."][".$this->pregGUchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"gu\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Malayalam + $e = preg_replace("/([".$this->pregMLchars .$this->pregINDextra."]*[".$this->pregMLchars ."][".$this->pregMLchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"ml\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Kannada + $e = preg_replace("/([".$this->pregKNchars .$this->pregINDextra."]*[".$this->pregKNchars ."][".$this->pregKNchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"kn\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Oriya + $e = preg_replace("/([".$this->pregORchars .$this->pregINDextra."]*[".$this->pregORchars ."][".$this->pregORchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"or\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Punjabi ?= Gurmuhki + $e = preg_replace("/([".$this->pregPAchars .$this->pregINDextra."]*[".$this->pregPAchars ."][".$this->pregPAchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"pa\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Tamil + $e = preg_replace("/([".$this->pregTAchars .$this->pregINDextra."]*[".$this->pregTAchars ."][".$this->pregTAchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"ta\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Telugu + $e = preg_replace("/([".$this->pregTEchars .$this->pregINDextra."]*[".$this->pregTEchars ."][".$this->pregTEchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"te\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + } +/*-- END INDIC --*/ + + + if ($this->autoFontGroups & AUTOFONT_THAIVIET) { + // THAI + $e = preg_replace("/([\x{0E00}-\x{0E7F}".$extra."]*[\x{0E00}-\x{0E7F}][\x{0E00}-\x{0E7F}".$extra."]*)/u", "\xef\xbf\xb0span lang=\"th\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Vietnamese + $e = preg_replace("/([".$this->pregVIETchars .$this->pregVIETPluschars ."]*[".$this->pregVIETchars ."][".$this->pregVIETchars .$this->pregVIETPluschars ."]*)/u", "\xef\xbf\xb0span lang=\"vi\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + } + + $e = preg_replace('/[&]/','&',$e); + $e = preg_replace('/[<]/','<',$e); + $e = preg_replace('/[>]/','>',$e); + $e = preg_replace("/(\xef\xbf\xb0span lang=\"([a-z\-A-Z]{2,5})\"\xef\xbf\xb1)\s+/",' \\1',$e); + $e = preg_replace("/[ ]+(\xef\xbf\xb0\/span\xef\xbf\xb1)/",'\\1 ',$e); + + $e = preg_replace("/\xef\xbf\xb0span lang=\"([a-z\-A-Z]{2,5})\"\xef\xbf\xb1/","\xef\xbf\xb0span lang=\"\\1\" class=\"lang_\\1\"\xef\xbf\xb1",$e); + + $e = preg_replace("/\xef\xbf\xb0/",'<',$e); + $e = preg_replace("/\xef\xbf\xb1/",'>',$e); + + $a[$i] = $e; + } + else { + $a[$i] = '<'.$e.'>'; + } + } + $n = implode('',$a); + return $n; +} + + +/*-- CJK-FONTS --*/ +function replaceCJK($str) { + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + if (preg_match("/[".$this->pregUHCchars."]/u", $str)) { + return "\xef\xbf\xb0span lang=\"ko\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$this->pregSJISchars."]/u", $str)) { + return "\xef\xbf\xb0span lang=\"ja\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + // if in Unicode Plane 2, probably HKCS (incl in BIG5) if not Japanese + else if (preg_match("/[\x{20000}-\x{2FFFF}]/u", $str)) { + return "\xef\xbf\xb0span lang=\"zh-HK\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else{ + return "\xef\xbf\xb0span lang=\"zh-CN\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + return $str; +} +/*-- END CJK-FONTS --*/ + +/*-- RTL --*/ +function replaceArabic($str) { + // PASHTO, SINDHI, URDU, ARABIC, PERSIAN + $persian = "\x{067E}\x{0686}\x{0698}\x{06AF}"; + + $urdu = "\x{0679}\x{0688}\x{0691}\x{06BA}\x{06BE}\x{06C1}\x{06D2}"; + $pashto = "\x{067C}\x{0681}\x{0685}\x{0689}\x{0693}\x{0696}\x{069A}\x{06BC}\x{06D0}"; // ? and U+06AB, U+06CD + $sindhi = "\x{067A}\x{067B}\x{067D}\x{067F}\x{0680}\x{0684}\x{068D}\x{068A}\x{068F}\x{068C}\x{0687}\x{0683}\x{0699}\x{06AA}\x{06A6}\x{06BB}\x{06B1}\x{06B3}"; + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + + if (preg_match("/[".$this->pregNonARABICchars ."]/u", $str) ) { + if (preg_match("/[".$sindhi ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"sd\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$urdu ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"ur\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$pashto ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"ps\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$persian ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"fa\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else { + return "\xef\xbf\xb0span lang=\"ar\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + } + if (preg_match("/[".$persian ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"fa\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else { + return "\xef\xbf\xb0span lang=\"ar\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + return $str; +} + +// ARABIC =========================== +// mPDF 5.4.08 +function InitArabic() { + + // JOIN TO FOLLOWING LETTER IN LOGICAL ORDER (i.e. AS INITIAL) + $this->arabPrevLink = ""; + // U+060c; U+061b; U+061f; U+0626; U+0628; + $this->arabPrevLink .= "\xd8\x8c\xd8\x9b\xd8\x9f\xd8\xa6\xd8\xa8"; + // U+062a; U+062b; U+062c; U+062d; U+062e; + $this->arabPrevLink .= "\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae"; + // U+0633; U+0634; U+0635; U+0636; U+0637; U+0638; U+0639; U+063a; + $this->arabPrevLink .= "\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba"; + // U+0640; U+0641; U+0642; U+0643; U+0644; U+0645; U+0646; U+0647; U+0649; U+064a; + $this->arabPrevLink .= "\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x89\xd9\x8a"; + // U+0678; U+0679; U+067a; U+067b; U+067c; U+067d; U+067e; U+067f; + $this->arabPrevLink .= "\xd9\xb8\xd9\xb9\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf"; + // U+0680; U+0681; U+0682; U+0683; U+0684; U+0685; U+0686; U+0687; + $this->arabPrevLink .= "\xda\x80\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87"; + // U+069a; U+069b; U+069c; U+069d; U+069e; U+069f; + $this->arabPrevLink .= "\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f"; + // U+06a0; U+06a1; U+06a2; U+06a3; U+06a4; U+06a5; U+06a6; U+06A7; U+06A8; + $this->arabPrevLink .= "\xda\xa0\xda\xa1\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8"; + // U+06a9; U+06aa; U+06ab; U+06ac; U+06ad; U+06ae; U+06af; + $this->arabPrevLink .= "\xda\xa9\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf"; + // U+06b0; U+06b1; U+06b2; U+06b3; U+06b4; U+06b5; U+06b6; U+06b7; U+06b8; U+06b9; + $this->arabPrevLink .= "\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9"; + // U+06ba; U+06bb; U+06bc; U+06be; U+06bf; + $this->arabPrevLink .= "\xda\xba\xda\xbb\xda\xbc\xda\xbe\xda\xbf"; + // U+06c1; U+06cc; U+06ce; U+06d0; U+06d1; + $this->arabPrevLink .= "\xdb\x81\xdb\x8c\xdb\x8e\xdb\x90\xdb\x91"; + + + + + // JOIN TO PREVIOUS LETTER IN LOGICAL ORDER (i.e. AS FINAL FORM) + $this->arabNextLink = ""; + // U+0622; U+0623; U+0624; U+0625; U+0626; U+0627; U+0628; U+0629; + $this->arabNextLink .= "\xd8\xa2\xd8\xa3\xd8\xa4\xd8\xa5\xd8\xa6\xd8\xa7\xd8\xa8\xd8\xa9"; + // U+062A; U+062B; U+062C; U+062D; U+062E; U+062F; + $this->arabNextLink .= "\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae\xd8\xaf"; + // U+0630; U+0631; U+0632; U+0633; U+0634; U+0635; U+0636; U+0637; U+0638; U+0639; U+063A; + $this->arabNextLink .= "\xd8\xb0\xd8\xb1\xd8\xb2\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba"; + // U+0640; U+0641; U+0642; U+0643; U+0644; U+0645; U+0646; U+0647; U+0648; U+0649; U+064A; + $this->arabNextLink .= "\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x88\xd9\x89\xd9\x8a"; + // U+0671; U+0672; U+0675; U+0676; U+0677; U+0678; U+0679; + $this->arabNextLink .= "\xd9\xb1\xd9\xb2\xd9\xb5\xd9\xb6\xd9\xb7\xd9\xb8\xd9\xb9"; + // U+067A; U+067B; U+067C; U+067D; U+067E; U+067F; + $this->arabNextLink .= "\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf"; + // U+0680; U+0681; U+0682; U+0683; U+0684; U+0685; U+0686; U+0687; U+0688; U+0689; + $this->arabNextLink .= "\xda\x80\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87\xda\x88\xda\x89"; + // U+068A; U+068B; U+068C; U+068D; U+068F;U+068F; + $this->arabNextLink .= "\xda\x8a\xda\x8b\xda\x8c\xda\x8d\xda\x8e\xda\x8f"; + // U+0690; U+0691; U+0692; U+0693; U+0694; U+0695; U+0696; U+0697; U+0698; U+0699; + $this->arabNextLink .= "\xda\x90\xda\x91\xda\x92\xda\x93\xda\x94\xda\x95\xda\x96\xda\x97\xda\x98\xda\x99"; + // U+069A; U+069B; U+069C; U+069D; U+069E; U+069F; + $this->arabNextLink .= "\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f"; + // U+06A0; U+06A1; U+06A2; U+06A3; U+06A4; U+06A5; U+06A6; U+06A7; U+06A8; U+06A9; + $this->arabNextLink .= "\xda\xa0\xda\xa1\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8\xda\xa9"; + // U+06AA; U+06AB; U+06AC; U+06AD; U+06AE; U+06AF; + $this->arabNextLink .= "\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf"; + // U+06B0; U+06B1; U+06B2; U+06B3; U+06B4; U+06B5; U+06B6; U+06B7; U+06B8; U+06B9; + $this->arabNextLink .= "\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9"; + // U+06BA; U+06BB; U+06BC; U+06BE; U+06BF; + $this->arabNextLink .= "\xda\xba\xda\xbb\xda\xbc\xda\xbe\xda\xbf"; + // U+06C0; U+06C1; U+06C2; U+06C3; U+06C4; U+06C5; U+06C6; U+06C7; U+06C8; U+06C9; + $this->arabNextLink .= "\xdb\x80\xdb\x81\xdb\x82\xdb\x83\xdb\x84\xdb\x85\xdb\x86\xdb\x87\xdb\x88\xdb\x89"; + // U+06CA; U+06CB; U+06CC; U+06CD; U+06CE; U+06CF; + $this->arabNextLink .= "\xdb\x8a\xdb\x8b\xdb\x8c\xdb\x8d\xdb\x8e\xdb\x8f"; + // U+06D0; U+06d1; U+06D2; U+06D3; + $this->arabNextLink .= "\xdb\x90\xdb\x91\xdb\x92\xdb\x93"; + + + // VOWELS ++ + + // U+064b U+064c; U+064d; U+064e; U+064f; U+0650; U+0651; U+0652; + $this->arabVowels = "\xd9\x8b\xd9\x8c\xd9\x8d\xd9\x8e\xd9\x8f\xd9\x90\xd9\x91\xd9\x92"; + + // Added chars that may not be vowels but should not interrupt joining + // U+0670; U+0653; + $this->arabVowels .= "\xd9\xb0\xd9\x93"; + // ? should also add - U+615, 616, 617-61A, 653-65E, 6D6-6DC, 6DF-6E4, 6E7, 6E8, 6EA-6ED + + + + // ISOLATED FORM :: FINAL :: INITIAL :: MEDIAL + // FB** - FE** = Arabic presentation Forms + // F5** F6** F7** = Private use area used by unAGlyphs in mPDF + $this->arabGlyphs = array( + "\xd8\x8c"=>array("\xd8\x8c", "\xd8\x8c", "\xd8\x8c", "\xd8\x8c"), /* 060C, 060C, 060C, 060C */ + "\xd8\x9b"=>array("\xd8\x9b", "\xd8\x9b", "\xd8\x9b", "\xd8\x9b"), /* 061B, 061B, 061B, 061B */ + "\xd8\x9f"=>array("\xd8\x9f", "\xd8\x9f", "\xd8\x9f", "\xd8\x9f"), /* 061F, 061F, 061F, 061F */ + "\xd8\xa1"=>array("\xd8\xa1", "\xd8\xa1", "\xd8\xa1", "\xd8\xa1"), /* 0621, 0621, 0621, 0621 */ + "\xd8\xa2"=>array("\xd8\xa2", "\xef\xba\x82", "\xd8\xa2", "\xef\xba\x82"), /* 0622, FE82, 0622, FE82 */ + "\xd8\xa3"=>array("\xd8\xa3", "\xef\xba\x84", "\xd8\xa3", "\xef\xba\x84"), /* 0623, FE84, 0623, FE84 */ + "\xd8\xa4"=>array("\xd8\xa4", "\xef\xba\x86", "\xd8\xa4", "\xef\xba\x86"), /* 0624, FE86, 0624, FE86 */ + "\xd8\xa5"=>array("\xd8\xa5", "\xef\xba\x88", "\xd8\xa5", "\xef\xba\x88"), /* 0625, FE88, 0625, FE88 */ + "\xd8\xa6"=>array("\xd8\xa6", "\xef\xba\x8a", "\xef\xba\x8b", "\xef\xba\x8c"), /* 0626, FE8A, FE8B, FE8C */ + "\xd8\xa7"=>array("\xd8\xa7", "\xef\xba\x8e", "\xd8\xa7", "\xef\xba\x8e"), /* 0627, FE8E, 0627, FE8E */ + "\xd8\xa8"=>array("\xd8\xa8", "\xef\xba\x90", "\xef\xba\x91", "\xef\xba\x92"), /* 0628, FE90, FE91, FE92 */ + "\xd8\xa9"=>array("\xd8\xa9", "\xef\xba\x94", "\xd8\xa9", "\xef\xba\x94"), /* 0629, FE94, 0629, FE94 */ + "\xd8\xaa"=>array("\xd8\xaa", "\xef\xba\x96", "\xef\xba\x97", "\xef\xba\x98"), /* 062A, FE96, FE97, FE98 */ + "\xd8\xab"=>array("\xd8\xab", "\xef\xba\x9a", "\xef\xba\x9b", "\xef\xba\x9c"), /* 062B, FE9A, FE9B, FE9C */ + "\xd8\xac"=>array("\xd8\xac", "\xef\xba\x9e", "\xef\xba\x9f", "\xef\xba\xa0"), /* 062C, FE9E, FE9F, FEA0 */ + "\xd8\xad"=>array("\xd8\xad", "\xef\xba\xa2", "\xef\xba\xa3", "\xef\xba\xa4"), /* 062D, FEA2, FEA3, FEA4 */ + "\xd8\xae"=>array("\xd8\xae", "\xef\xba\xa6", "\xef\xba\xa7", "\xef\xba\xa8"), /* 062E, FEA6, FEA7, FEA8 */ + "\xd8\xaf"=>array("\xd8\xaf", "\xef\xba\xaa", "\xd8\xaf", "\xef\xba\xaa"), /* 062F, FEAA, 062F, FEAA */ + "\xd8\xb0"=>array("\xd8\xb0", "\xef\xba\xac", "\xd8\xb0", "\xef\xba\xac"), /* 0630, FEAC, 0630, FEAC */ + "\xd8\xb1"=>array("\xd8\xb1", "\xef\xba\xae", "\xd8\xb1", "\xef\xba\xae"), /* 0631, FEAE, 0631, FEAE */ + "\xd8\xb2"=>array("\xd8\xb2", "\xef\xba\xb0", "\xd8\xb2", "\xef\xba\xb0"), /* 0632, FEB0, 0632, FEB0 */ + "\xd8\xb3"=>array("\xd8\xb3", "\xef\xba\xb2", "\xef\xba\xb3", "\xef\xba\xb4"), /* 0633, FEB2, FEB3, FEB4 */ + "\xd8\xb4"=>array("\xd8\xb4", "\xef\xba\xb6", "\xef\xba\xb7", "\xef\xba\xb8"), /* 0634, FEB6, FEB7, FEB8 */ + "\xd8\xb5"=>array("\xd8\xb5", "\xef\xba\xba", "\xef\xba\xbb", "\xef\xba\xbc"), /* 0635, FEBA, FEBB, FEBC */ + "\xd8\xb6"=>array("\xd8\xb6", "\xef\xba\xbe", "\xef\xba\xbf", "\xef\xbb\x80"), /* 0636, FEBE, FEBF, FEC0 */ + "\xd8\xb7"=>array("\xd8\xb7", "\xef\xbb\x82", "\xef\xbb\x83", "\xef\xbb\x84"), /* 0637, FEC2, FEC3, FEC4 */ + "\xd8\xb8"=>array("\xd8\xb8", "\xef\xbb\x86", "\xef\xbb\x87", "\xef\xbb\x88"), /* 0638, FEC6, FEC7, FEC8 */ + "\xd8\xb9"=>array("\xd8\xb9", "\xef\xbb\x8a", "\xef\xbb\x8b", "\xef\xbb\x8c"), /* 0639, FECA, FECB, FECC */ + "\xd8\xba"=>array("\xd8\xba", "\xef\xbb\x8e", "\xef\xbb\x8f", "\xef\xbb\x90"), /* 063A, FECE, FECF, FED0 */ + "\xd9\x80"=>array("\xd9\x80", "\xd9\x80", "\xd9\x80", "\xd9\x80"), /* 0640, 0640, 0640, 0640 */ + "\xd9\x81"=>array("\xd9\x81", "\xef\xbb\x92", "\xef\xbb\x93", "\xef\xbb\x94"), /* 0641, FED2, FED3, FED4 */ + "\xd9\x82"=>array("\xd9\x82", "\xef\xbb\x96", "\xef\xbb\x97", "\xef\xbb\x98"), /* 0642, FED6, FED7, FED8 */ + "\xd9\x83"=>array("\xd9\x83", "\xef\xbb\x9a", "\xef\xbb\x9b", "\xef\xbb\x9c"), /* 0643, FEDA, FEDB, FEDC */ + "\xd9\x84"=>array("\xd9\x84", "\xef\xbb\x9e", "\xef\xbb\x9f", "\xef\xbb\xa0"), /* 0644, FEDE, FEDF, FEE0 */ + "\xd9\x85"=>array("\xd9\x85", "\xef\xbb\xa2", "\xef\xbb\xa3", "\xef\xbb\xa4"), /* 0645, FEE2, FEE3, FEE4 */ + "\xd9\x86"=>array("\xd9\x86", "\xef\xbb\xa6", "\xef\xbb\xa7", "\xef\xbb\xa8"), /* 0646, FEE6, FEE7, FEE8 */ + "\xd9\x87"=>array("\xd9\x87", "\xef\xbb\xaa", "\xef\xbb\xab", "\xef\xbb\xac"), /* 0647, FEEA, FEEB, FEEC */ + "\xd9\x88"=>array("\xd9\x88", "\xef\xbb\xae", "\xd9\x88", "\xef\xbb\xae"), /* 0648, FEEE, 0648, FEEE */ + +/* 0649 Alef Maksura should only appear at end of word (in Arabic) So Initial and medial are shown as isolated/final */ + "\xd9\x89"=>array("\xd9\x89", "\xef\xbb\xb0", "\xd9\x89", "\xef\xbb\xb0"), /* 0649, FEF0, 0649, FEF0 */ + +/* 0649 Alef Maksura Initial and Medial forms as given in Unicode FBE8 and FBE9 for Uighur Kazakh (not in some fonts) */ + "\xd9\x89"=>array("\xd9\x89", "\xef\xbb\xb0", "\xef\xaf\xa8", "\xef\xaf\xa9"), /* 0649, FEF0, FBE8, FBE9 not in most fonts */ + + "\xd9\x8a"=>array("\xd9\x8a", "\xef\xbb\xb2", "\xef\xbb\xb3", "\xef\xbb\xb4"), /* 064A, FEF2, FEF3, FEF4 */ + "\xd9\x8b"=>array("\xd9\x8b", "\xd9\x8b", "\xd9\x8b", "\xd9\x8b"), /* 064B, 064B, 064B, 064B */ + "\xd9\x8c"=>array("\xd9\x8c", "\xd9\x8c", "\xd9\x8c", "\xd9\x8c"), /* 064C, 064C, 064C, 064C */ + "\xd9\x8d"=>array("\xd9\x8d", "\xd9\x8d", "\xd9\x8d", "\xd9\x8d"), /* 064D, 064D, 064D, 064D */ + "\xd9\x8e"=>array("\xd9\x8e", "\xd9\x8e", "\xd9\x8e", "\xd9\x8e"), /* 064E, 064E, 064E, 064E */ + "\xd9\x8f"=>array("\xd9\x8f", "\xd9\x8f", "\xd9\x8f", "\xd9\x8f"), /* 064F, 064F, 064F, 064F */ + "\xd9\x90"=>array("\xd9\x90", "\xd9\x90", "\xd9\x90", "\xd9\x90"), /* 0650, 0650, 0650, 0650 */ + "\xd9\x91"=>array("\xd9\x91", "\xd9\x91", "\xd9\x91", "\xd9\x91"), /* 0651, 0651, 0651, 0651 */ + "\xd9\x92"=>array("\xd9\x92", "\xd9\x92", "\xd9\x92", "\xd9\x92"), /* 0652, 0652, 0652, 0652 */ + "\xd9\xb1"=>array("\xd9\xb1", "\xef\xad\x91", "\xd9\xb1", "\xef\xad\x91"), /* 0671, FB51, 0671, FB51 */ + "\xd9\xb2"=>array("\xd9\xb2", "\xef\x95\xb2", "\xd9\xb2", "\xef\x95\xb2"), /* 0672, F572, 0672, F572 */ + "\xd9\xb5"=>array("\xd9\xb5", "\xef\x95\xb5", "\xd9\xb5", "\xef\x95\xb5"), /* 0675, F575, 0675, F575 */ + "\xd9\xb8"=>array("\xd9\xb8", "\xef\x95\xb8", "\xef\xba\x8b", "\xef\xba\x8c"), /* 0678, F578, FE8B, FE8C ( as 0626 ) */ + "\xd9\xb9"=>array("\xd9\xb9", "\xef\xad\xa7", "\xef\xad\xa8", "\xef\xad\xa9"), /* 0679, FB67, FB68, FB69 */ + "\xd9\xba"=>array("\xd9\xba", "\xef\xad\x9f", "\xef\xad\xa0", "\xef\xad\xa1"), /* 067A, FB5F, FB60, FB61 */ + "\xd9\xbb"=>array("\xd9\xbb", "\xef\xad\x93", "\xef\xad\x94", "\xef\xad\x95"), /* 067B, FB53, FB54, FB55 */ + "\xd9\xbc"=>array("\xd9\xbc", "\xef\x95\xbc", "\xef\x99\xbc", "\xef\x9d\xbc"), /* 067C, F57C, F67C, F77C */ + "\xd9\xbd"=>array("\xd9\xbd", "\xef\x95\xbd", "\xef\x99\xbd", "\xef\x9d\xbd"), /* 067D, F57D, F67D, F77D */ + "\xd9\xbe"=>array("\xd9\xbe", "\xef\xad\x97", "\xef\xad\x98", "\xef\xad\x99"), /* 067E, FB57, FB58, FB59 */ + "\xd9\xbf"=>array("\xd9\xbf", "\xef\xad\xa3", "\xef\xad\xa4", "\xef\xad\xa5"), /* 067F, FB63, FB64, FB65 */ + "\xda\x80"=>array("\xda\x80", "\xef\xad\x9b", "\xef\xad\x9c", "\xef\xad\x9d"), /* 0680, FB5B, FB5C, FB5D */ + "\xda\x81"=>array("\xda\x81", "\xef\x96\x81", "\xef\x9a\x81", "\xef\x9e\x81"), /* 0681, F581, F681, F781 */ + "\xda\x82"=>array("\xda\x82", "\xef\x96\x82", "\xef\x9a\x82", "\xef\x9e\x82"), /* 0682, F582, F682, F782 */ + "\xda\x83"=>array("\xda\x83", "\xef\xad\xb7", "\xef\xad\xb8", "\xef\xad\xb9"), /* 0683, FB77, FB78, FB79 */ + "\xda\x84"=>array("\xda\x84", "\xef\xad\xb3", "\xef\xad\xb4", "\xef\xad\xb5"), /* 0684, FB73, FB74, FB75 */ + "\xda\x85"=>array("\xda\x85", "\xef\x96\x85", "\xef\x9a\x85", "\xef\x9e\x85"), /* 0685, F585, F685, F785 */ + "\xda\x86"=>array("\xda\x86", "\xef\xad\xbb", "\xef\xad\xbc", "\xef\xad\xbd"), /* 0686, FB7B, FB7C, FB7D */ + "\xda\x87"=>array("\xda\x87", "\xef\xad\xbf", "\xef\xae\x80", "\xef\xae\x81"), /* 0687, FB7F, FB80, FB81 */ + "\xda\x88"=>array("\xda\x88", "\xef\xae\x89", "\xda\x88", "\xda\x88"), /* 0688, FB89, 0688, 0688 */ + "\xda\x89"=>array("\xda\x89", "\xef\x96\x89", "\xda\x89", "\xda\x89"), /* 0689, F589, 0689, 0689 */ + "\xda\x91"=>array("\xda\x91", "\xef\xae\x8d", "\xda\x91", "\xef\xae\x8d"), /* 0691, FB8D, 0691, FB8D */ + "\xda\x93"=>array("\xda\x93", "\xef\x96\x93", "\xda\x93", "\xda\x93"), /* 0693, F593, 0693, 0693 */ + "\xda\x96"=>array("\xda\x96", "\xef\x96\x96", "\xda\x96", "\xda\x96"), /* 0696, F596, 0696, 0696 */ + "\xda\x98"=>array("\xda\x98", "\xef\xae\x8b", "\xda\x98", "\xef\xae\x8b"), /* 0698, FB8B, 0698, FB8B */ + "\xda\x9a"=>array("\xda\x9a", "\xef\x96\x9a", "\xef\x9a\x9a", "\xef\x9e\x9a"), /* 069A, F59A, F69A, F79A */ + "\xda\x9b"=>array("\xda\x9b", "\xef\x96\x9b", "\xef\x9a\x9b", "\xef\x9e\x9b"), /* 069B, F59B, F69B, F79B */ + "\xda\x9c"=>array("\xda\x9c", "\xef\x96\x9c", "\xef\x9a\x9c", "\xef\x9e\x9c"), /* 069C, F59C, F69C, F79C */ + "\xda\x9d"=>array("\xda\x9d", "\xef\x96\x9d", "\xef\x9a\x9d", "\xef\x9e\x9d"), /* 069D, F59D, F69D, F79D */ + "\xda\x9e"=>array("\xda\x9e", "\xef\x96\x9e", "\xef\x9a\x9e", "\xef\x9e\x9e"), /* 069E, F59E, F69E, F79E */ + "\xda\xa0"=>array("\xda\xa0", "\xef\x96\xa0", "\xef\x9a\xa0", "\xef\x9e\xa0"), /* 06A0, F5A0, F6A0, F7A0 */ + "\xda\xa1"=>array("\xda\xa1", "\xef\x96\xa1", "\xef\x9a\xa1", "\xef\x9e\xa1"), /* 06A1, F5A1, F6A1, F7A1 */ + "\xda\xa2"=>array("\xda\xa2", "\xef\x96\xa2", "\xef\x9a\xa2", "\xef\x9e\xa2"), /* 06A2, F5A2, F6A2, F7A2 */ + "\xda\xa3"=>array("\xda\xa3", "\xef\x96\xa3", "\xef\x9a\xa3", "\xef\x9e\xa3"), /* 06A3, F5A3, F6A3, F7A3 */ + "\xda\xa4"=>array("\xda\xa4", "\xef\xad\xab", "\xef\xad\xac", "\xef\xad\xad"), /* 06A4, FB6B, FB6C, FB6D */ + "\xda\xa5"=>array("\xda\xa5", "\xef\x96\xa5", "\xef\x9a\xa5", "\xef\x9e\xa5"), /* 06A5, F5A5, F6A5, F7A5 */ + "\xda\xa6"=>array("\xda\xa6", "\xef\xad\xaf", "\xef\xad\xb0", "\xef\xad\xb1"), /* 06A6, FB6F, FB70, FB71 */ + "\xda\xa9"=>array("\xda\xa9", "\xef\xae\x8f", "\xef\xae\x90", "\xef\xae\x91"), /* 06A9, FB8F, FB90, FB91 */ + "\xda\xaa"=>array("\xda\xaa", "\xef\x96\xaa", "\xef\x9a\xaa", "\xef\x9e\xaa"), /* 06AA, F5AA, F6AA, F7AA */ + "\xda\xab"=>array("\xda\xab", "\xef\x96\xab", "\xef\x9a\xab", "\xef\x9e\xab"), /* 06AB, F5AB, F6AB, F7AB */ + "\xda\xac"=>array("\xda\xac", "\xef\x96\xac", "\xef\x9a\xac", "\xef\x9e\xac"), /* 06AC, F5AC, F6AC, F7AC */ + "\xda\xad"=>array("\xda\xad", "\xef\xaf\x94", "\xef\xaf\x95", "\xef\xaf\x96"), /* 06AD, FBD4, FBD5, FBD6 */ + "\xda\xae"=>array("\xda\xae", "\xef\x96\xae", "\xef\x9a\xae", "\xef\x9e\xae"), /* 06AE, F5AE, F6AE, F7AE */ + "\xda\xaf"=>array("\xda\xaf", "\xef\xae\x93", "\xef\xae\x94", "\xef\xae\x95"), /* 06Af, FB93, FB94, FB95 */ + "\xda\xb0"=>array("\xda\xb0", "\xef\x96\xb0", "\xef\x9a\xb0", "\xef\x9e\xb0"), /* 06B0, F5B0, F6B0, F7B0 */ + "\xda\xb1"=>array("\xda\xb1", "\xef\xae\x9b", "\xef\xae\x9c", "\xef\xae\x9d"), /* 06B1, FB9B, FB9C, FB9D */ + "\xda\xb2"=>array("\xda\xb2", "\xef\x96\xb2", "\xef\x9a\xb2", "\xef\x9e\xb2"), /* 06B2, F5B2, F6B2, F7B2 */ + "\xda\xb3"=>array("\xda\xb3", "\xef\xae\x97", "\xef\xae\x98", "\xef\xae\x99"), /* 06B3, FB97, FB98, FB99 */ + "\xda\xb4"=>array("\xda\xb4", "\xef\x96\xb4", "\xef\x9a\xb4", "\xef\x9e\xb4"), /* 06B4, F5B4, F6B4, F7B4 */ + "\xda\xb5"=>array("\xda\xb5", "\xef\x96\xb5", "\xef\x9a\xb5", "\xef\x9e\xb5"), /* 06B5, F5B5, F6B5, F7B5 */ + "\xda\xb6"=>array("\xda\xb6", "\xef\x96\xb6", "\xef\x9a\xb6", "\xef\x9e\xb6"), /* 06B6, F5B6, F6B6, F7B6 */ + "\xda\xb7"=>array("\xda\xb7", "\xef\x96\xb7", "\xef\x9a\xb7", "\xef\x9e\xb7"), /* 06B7, F5B7, F6B7, F7B7 */ + "\xda\xb8"=>array("\xda\xb8", "\xef\x96\xb8", "\xef\x9a\xb8", "\xef\x9e\xb8"), /* 06B8, F5B8, F6B8, F7B8 */ + "\xda\xb9"=>array("\xda\xb9", "\xef\x96\xb9", "\xef\x9a\xb9", "\xef\x9e\xb9"), /* 06B9, F5B9, F6B9, F7B9 */ + "\xda\xba"=>array("\xda\xba", "\xef\xae\x9f", "\xda\xba", "\xda\xba"), /* 06BA, FB9F, 06BA, 06BA */ + "\xda\xbb"=>array("\xda\xbb", "\xef\xae\xa1", "\xef\xae\xa2", "\xef\xae\xa3"), /* 06BB, FBA1, FBA2, FBA3 */ + "\xda\xbc"=>array("\xda\xbc", "\xef\x96\xbc", "\xef\x9a\xbc", "\xef\x9e\xbc"), /* 06BC, F5BC, F6BC, F7BC */ + "\xda\xbe"=>array("\xda\xbe", "\xef\xae\xab", "\xef\xae\xac", "\xef\xae\xad"), /* 06BE, FBAB, FBAC, FBAD */ + "\xda\xbf"=>array("\xda\xbf", "\xef\x96\xbf", "\xef\x9a\xbf", "\xef\x9e\xbf"), /* 06BF, F5BF, F6BF, F7BF */ + "\xdb\x80"=>array("\xdb\x80", "\xef\xae\xa5", "\xdb\x80", "\xef\xae\xa5"), /* 06C0, FBA5, 06C0, FBA5 */ + "\xdb\x81"=>array("\xdb\x81", "\xef\xae\xa7", "\xef\xae\xa8", "\xef\xae\xa9"), /* 06C1, FBA7, FBA8, FBA9 */ + "\xdb\x8c"=>array("\xdb\x8c", "\xef\xaf\xbd", "\xef\xaf\xbe", "\xef\xaf\xbf"), /* 06CC, FBFD, FBFE, FBFF */ + "\xdb\x8d"=>array("\xdb\x8d", "\xef\x97\x8d", "\xdb\x8d", "\xef\x97\x8d"), /* 06CD, F5CD, 06CD, F5CD */ + "\xdb\x8e"=>array("\xdb\x8e", "\xef\x97\x8e", "\xef\x9b\x8e", "\xef\x9f\x8e"), /* 06CE, F5CE, F6CE, F7CE */ + "\xdb\x90"=>array("\xdb\x90", "\xef\xaf\xa5", "\xef\xaf\xa6", "\xef\xaf\xa7"), /* 06D0, FBE5, FBE6, FBE7 */ + "\xdb\x91"=>array("\xdb\x91", "\xef\x97\x91", "\xef\xad\x98", "\xef\xad\x99"), /* 06D1, F5D1, FB58, FB59 Fudge borrows from 067E */ + "\xdb\x92"=>array("\xdb\x92", "\xef\xae\xaf", "\xdb\x92", "\xef\xae\xaf"), /* 06D2, FBAF, 06D2, FBAF */ + "\xdb\x93"=>array("\xdb\x93", "\xef\xae\xb1", "\xdb\x93", "\xef\xae\xb1"), /* 06D3, FBB1, 06D3, FBB1 */ + ); + + + // LAM with ALEF ligatures (Mandatory ligatures) + + // U+0644; U+0622; U+0644; U+0623; U+0644; U+0625; U+0644; U+0627; + $this->arabLigGlyphs = "\xd9\x84\xd8\xa2\xd9\x84\xd8\xa3\xd9\x84\xd8\xa5\xd9\x84\xd8\xa7"; + $this->arabLigHex = 'FEF5FEF6FEF5FEF6FEF7FEF8FEF7FEF8FEF9FEFAFEF9FEFAFEFBFEFCFEFBFEFC'; + +} + +// mPDF 5.4.08 +function ArabJoin($str) { + if (!$this->arabGlyphs) { $this->InitArabic(); } + $crntChar = null; + $prevChar = null; + $nextChar = null; + $output = array(); + $chars = preg_split('//u', $str); + $max = count($chars); + for ($i = $max - 1; $i >= 0; $i--) { + $crntChar = $chars[$i]; + if ($i > 0){ $prevChar = $chars[$i - 1]; } + else{ $prevChar = NULL; } + if ($prevChar && mb_strpos($this->arabVowels, $prevChar, 0, 'utf-8') !== false) { + $prevChar = $chars[$i - 2]; + if ($prevChar && mb_strpos($this->arabVowels, $prevChar, 0, 'utf-8') !== false) { + $prevChar = $chars[$i - 3]; + } + } + if ($crntChar && mb_strpos($this->arabVowels, $crntChar, 0, 'utf-8') !== false) { + // If next_char = nextLink && prev_char = prevLink: + // Added && $prevchar (defined) else error on mb_strpos() + if ($chars[$i + 1] && (mb_strpos($this->arabNextLink, $chars[$i + 1], 0, 'utf-8') !== false) && $prevChar && (mb_strpos($this->arabPrevLink, $prevChar, 0, 'utf-8') !== false)) { + $output[] = $this->get_arab_glyphs($crntChar, 1); // form + } + else { + $output[] = $this->get_arab_glyphs($crntChar, 0); // form + } + continue; + } + // NB = آ أ إ ا ل + if (isset($chars[$i + 1]) && in_array($chars[$i + 1], array("\xd8\xa2","\xd8\xa3","\xd8\xa5","\xd8\xa7")) && $crntChar == "\xd9\x84"){ + continue; + } + if (ord($crntChar) < 128) { + $output[] = $crntChar; + $nextChar = $crntChar; + continue; + } + $form = 0; + if ($prevChar == "\xd9\x84" && ($crntChar == "\xd8\xa2" || $crntChar == "\xd8\xa3" || $crntChar == "\xd8\xa5" || $crntChar == "\xd8\xa7")) { + if ($chars[$i - 2] && mb_strpos($this->arabPrevLink, $chars[$i - 2], 0, 'utf-8') !== false) { + $form++; // form + } + $pos = mb_strpos($this->arabLigGlyphs, ($prevChar . $crntChar), 0, 'utf-8'); + $pos = $pos*8 + $form*4; + $pres = (mb_substr($this->arabLigHex, $pos, 4, 'utf-8')); + // If presentation forms for mandatory ligatures with diacritics not present (even if remapped from e.g. uni0644uni0625) + // try replacing with mandatory ligature Alef/lam isolated/final FEFB/FEFC + diacritic glyph + if (!$this->_charDefined($this->CurrentFont['cw'], hexdec($pres)) && $this->_charDefined($this->CurrentFont['cw'], hexdec('FEFB'))) { + if ($pres=='FEF5') { $output[] = strcode2utf('ﻻٓ'); } + else if ($pres=='FEF6') { $output[] = strcode2utf('ﻼٓ'); } + else if ($pres=='FEF7') { $output[] = strcode2utf('ﻻٔ'); } + else if ($pres=='FEF8') { $output[] = strcode2utf('ﻼٔ'); } + else if ($pres=='FEF9') { $output[] = strcode2utf('ﻻٕ'); } + else if ($pres=='FEFA') { $output[] = strcode2utf('ﻼٕ'); } + } + else { + $output[] = strcode2utf('&#x' . $pres . ';'); + } + $nextChar = $prevChar; + continue; + } + if ($prevChar && mb_strpos($this->arabPrevLink, $prevChar, 0, 'utf-8') !== false) { + $form++; + } + if ($nextChar && mb_strpos($this->arabNextLink, $nextChar, 0, 'utf-8') !== false) { + $form += 2; + } + $output[] = $this->get_arab_glyphs($crntChar, $form) ; + $nextChar = $crntChar; + } + $ra = array_reverse($output); + $s = implode($ra); + return $s; +} + +// mPDF 5.4.08 +function get_arab_glyphs($char, $type) { + if ($type>0 && isset($this->arabGlyphs[$char])) { + // If presentation form specified FB** - FE** = Arabic presentation Forms + if (preg_match("/[\x{FB50}-\x{FEFF}]/u",$this->arabGlyphs[$char][$type])) { + $unicode = $this->UTF8StringToArray($this->arabGlyphs[$char][$type], false); + if ($this->_charDefined($this->CurrentFont['cw'],$unicode[0])) { return $this->arabGlyphs[$char][$type]; } + else if (isset($this->CurrentFont['unAGlyphs'])) { + $uni = $this->UTF8StringToArray($char, false); + $pua = $uni[0] - 1536 + 62464 + 256*$type ; + if ($this->_charDefined($this->CurrentFont['cw'], $pua)) { return strcode2utf('&#x' . dechex($pua) . ';'); } + else return $char; + } + else return $char; + } + // If PUA form specified and unAGlphs font set F5** F6** F7** = Private use area used by unAGlyphs in mPDF + if (preg_match("/[\x{F500}-\x{F7FF}]/u",$this->arabGlyphs[$char][$type]) && isset($this->CurrentFont['unAGlyphs'])) { + $unicode = $this->UTF8StringToArray($this->arabGlyphs[$char][$type], false); + if ($this->_charDefined($this->CurrentFont['cw'],$unicode[0])) { return $this->arabGlyphs[$char][$type]; } + else return $char; + } + return $this->arabGlyphs[$char][$type]; + } + else return $char; +} +/*-- END RTL --*/ + + + +//=========================== +// Functions originally in htmltoolkit - moved mPDF 4.0 + +// Call-back function Used for usort in fn _tableWrite + +function _cmpdom($a, $b) { + return ($a["dom"] < $b["dom"]) ? -1 : 1; +} + +function mb_strrev($str, $enc = 'utf-8'){ + $ch = array(); + $ch = preg_split('//u',$str); + $revch = array_reverse($ch); + return implode('',$revch); +} + +/*-- COLUMNS --*/ +// Callback function from function printcolumnbuffer in mpdf +function columnAdjustAdd($type,$k,$xadj,$yadj,$a,$b,$c=0,$d=0,$e=0,$f=0) { + if ($type == 'Td') { // xpos,ypos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return 'BT '.sprintf('%.3F %.3F',$a,$b).' Td'; + } + else if ($type == 're') { // xpos,ypos,width,height + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F %.3F %.3F',$a,$b,$c,$d).' re'; + } + else if ($type == 'l') { // xpos,ypos,x2pos,y2pos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F l',$a,$b); + } + else if ($type == 'img') { // width,height,xpos,ypos + $c += ($xadj * $k); + $d -= ($yadj * $k); + return sprintf('q %.3F 0 0 %.3F %.3F %.3F',$a,$b,$c,$d).' cm /'.$e; + } + else if ($type == 'draw') { // xpos,ypos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F m',$a,$b); + } + else if ($type == 'bezier') { // xpos,ypos,x2pos,y2pos,x3pos,y3pos + $a += ($xadj * $k); + $b -= ($yadj * $k); + $c += ($xadj * $k); + $d -= ($yadj * $k); + $e += ($xadj * $k); + $f -= ($yadj * $k); + return sprintf('%.3F %.3F %.3F %.3F %.3F %.3F',$a,$b,$c,$d,$e,$f).' c'; + } +} +/*-- END COLUMNS --*/ + + + +function ConvertColor($color="#000000"){ + $color = trim(strtolower($color)); + $c = false; + if ($color=='transparent') { return false; } + else if ($color=='inherit') { return false; } + else if (isset($this->SVGcolors[$color])) $color = $this->SVGcolors[$color]; + + if (preg_match('/^[\d]+$/',$color)) { $c = (array(1,$color)); } // i.e. integer only + else if ($color[0] == '#') { //case of #nnnnnn or #nnn + $cor = preg_replace('/\s+.*/','',$color); // in case of Background: #CCC url() x-repeat etc. + if (strlen($cor) == 4) { // Turn #RGB into #RRGGBB + $cor = "#" . $cor[1] . $cor[1] . $cor[2] . $cor[2] . $cor[3] . $cor[3]; + } + $r = hexdec(substr($cor, 1, 2)); + $g = hexdec(substr($cor, 3, 2)); + $b = hexdec(substr($cor, 5, 2)); + $c = array(3,$r,$g,$b); + } + else if (preg_match('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\((.*?)\)/',$color,$m)) { // mPDF 5.6.05 + $type= $m[1]; + $cores = explode(",", $m[2]); + $ncores = count($cores); + if (stristr($cores[0],'%') ) { + $cores[0] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[0] = intval($cores[0]*255/100); } + } + if ($ncores>1 && stristr($cores[1],'%') ) { + $cores[1] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[1] = intval($cores[1]*255/100); } + if ($type=='hsl' || $type=='hsla') { $cores[1] = $cores[1]/100; } + } + if ($ncores>2 && stristr($cores[2],'%') ) { + $cores[2] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[2] = intval($cores[2]*255/100); } + if ($type=='hsl' || $type=='hsla') { $cores[2] = $cores[2]/100; } + } + if ($ncores>3 && stristr($cores[3],'%') ) { + $cores[3] += 0; + } + + if ($type=='rgb') { $c = array(3,$cores[0],$cores[1],$cores[2]); } + else if ($type=='rgba') { $c = array(5,$cores[0],$cores[1],$cores[2],$cores[3]*100); } + else if ($type=='cmyk' || $type=='device-cmyk') { $c = array(4,$cores[0],$cores[1],$cores[2],$cores[3]); } // mPDF 5.6.05 + else if ($type=='cmyka' || $type=='device-cmyka') { $c = array(6,$cores[0],$cores[1],$cores[2],$cores[3],$cores[4]*100); } // mPDF 5.6.05 + else if ($type=='hsl' || $type=='hsla') { + $conv = $this->hsl2rgb($cores[0]/360,$cores[1],$cores[2]); + if ($type=='hsl') { $c = array(3,$conv[0],$conv[1],$conv[2]); } + else if ($type=='hsla') { $c = array(5,$conv[0],$conv[1],$conv[2],$cores[3]*100); } + } + else if ($type=='spot') { + $name = strtoupper(trim($cores[0])); + // mPDF 5.6.59 + if(!isset($this->spotColors[$name])) { + if (isset($cores[5])) { $this->AddSpotColor($cores[0],$cores[2],$cores[3],$cores[4],$cores[5]); } + else { $this->Error('Undefined spot color: '.$name); } + } + $c = array(2,$this->spotColors[$name]['i'],$cores[1]); + } + } + + + // $this->restrictColorSpace + // 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] + // 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] + // 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] + if ($this->PDFA || $this->PDFX || $this->restrictColorSpace) { + if ($c[0]==1) { // GRAYSCALE + } + else if ($c[0]==2) { // SPOT COLOR + if (!isset($this->spotColorIDs[$c[1]])) { die('Error: Spot colour has not been defined - '.$this->spotColorIDs[$c[1]]); } + if ($this->PDFA) { + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "Spot color specified '".$this->spotColorIDs[$c[1]]."' (converted to process color)"; } + if ($this->restrictColorSpace!=3) { + $sp = $this->spotColors[$this->spotColorIDs[$c[1]]]; + $c = $this->cmyk2rgb(array(4,$sp['c'],$sp['m'],$sp['y'],$sp['k'])); + } + } + else if ($this->restrictColorSpace==1) { + $sp = $this->spotColors[$this->spotColorIDs[$c[1]]]; + $c = $this->cmyk2gray(array(4,$sp['c'],$sp['m'],$sp['y'],$sp['k'])); + } + } + else if ($c[0]==3) { // RGB + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "RGB color specified '".$color."' (converted to CMYK)"; } + $c = $this->rgb2cmyk($c); + } + else if ($this->restrictColorSpace==1) { $c = $this->rgb2gray($c); } + else if ($this->restrictColorSpace==3) { $c = $this->rgb2cmyk($c); } + } + else if ($c[0]==4) { // CMYK + if ($this->PDFA && $this->restrictColorSpace!=3) { + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "CMYK color specified '".$color."' (converted to RGB)"; } + $c = $this->cmyk2rgb($c); + } + else if ($this->restrictColorSpace==1) { $c = $this->cmyk2gray($c); } + else if ($this->restrictColorSpace==2) { $c = $this->cmyk2rgb($c); } + } + else if ($c[0]==5) { // RGBa + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "RGB color with transparency specified '".$color."' (converted to CMYK without transparency)"; } + $c = $this->rgb2cmyk($c); + $c = array(4, $c[1], $c[2], $c[3], $c[4]); + } + else if ($this->PDFA && $this->restrictColorSpace!=3) { + if (!$this->PDFAauto) { $this->PDFAXwarnings[] = "RGB color with transparency specified '".$color."' (converted to RGB without transparency)"; } + $c = $this->rgb2cmyk($c); + $c = array(4, $c[1], $c[2], $c[3], $c[4]); + } + else if ($this->restrictColorSpace==1) { $c = $this->rgb2gray($c); } + else if ($this->restrictColorSpace==3) { $c = $this->rgb2cmyk($c); } + } + else if ($c[0]==6) { // CMYKa + if ($this->PDFA && $this->restrictColorSpace!=3) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "CMYK color with transparency specified '".$color."' (converted to RGB without transparency)"; } + $c = $this->cmyk2rgb($c); + $c = array(3, $c[1], $c[2], $c[3]); + } + else if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "CMYK color with transparency specified '".$color."' (converted to CMYK without transparency)"; } + $c = $this->cmyk2rgb($c); + $c = array(3, $c[1], $c[2], $c[3]); + } + else if ($this->restrictColorSpace==1) { $c = $this->cmyk2gray($c); } + else if ($this->restrictColorSpace==2) { $c = $this->cmyk2rgb($c); } + } + } + if (is_array($c)) { + $c = array_pad($c, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + } + return $cstr; +} + +function rgb2gray($c) { + if (isset($c[4])) { return array(1,(($c[1] * .21) + ($c[2] * .71) + ($c[3] * .07)), ord(1), $c[4]); } + else { return array(1,(($c[1] * .21) + ($c[2] * .71) + ($c[3] * .07))); } +} + +function cmyk2gray($c) { + $rgb = $this->cmyk2rgb($c); + return $this->rgb2gray($rgb); +} + +function rgb2cmyk($c) { + $cyan = 1 - ($c[1] / 255); + $magenta = 1 - ($c[2] / 255); + $yellow = 1 - ($c[3] / 255); + $min = min($cyan, $magenta, $yellow); + + if ($min == 1) { + if ($c[0]==5) { return array (6,100,100,100,100, $c[4]); } + else { return array (4,100,100,100,100); } + // For K-Black + //if ($c[0]==5) { return array (6,0,0,0,100, $c[4]); } + //else { return array (4,0,0,0,100); } + } + $K = $min; + $black = 1 - $K; + if ($c[0]==5) { return array (6,($cyan-$K)*100/$black, ($magenta-$K)*100/$black, ($yellow-$K)*100/$black, $K*100, $c[4]); } + else { return array (4,($cyan-$K)*100/$black, ($magenta-$K)*100/$black, ($yellow-$K)*100/$black, $K*100); } +} + + +function cmyk2rgb($c) { + $rgb = array(); + $colors = 255 - ($c[4]*2.55); + $rgb[0] = intval($colors * (255 - ($c[1]*2.55))/255); + $rgb[1] = intval($colors * (255 - ($c[2]*2.55))/255); + $rgb[2] = intval($colors * (255 - ($c[3]*2.55))/255); + if ($c[0]==6) { return array (5,$rgb[0],$rgb[1],$rgb[2], $c[5]); } + else { return array (3,$rgb[0],$rgb[1],$rgb[2]); } +} + +function rgb2hsl($var_r, $var_g, $var_b) { + $var_min = min($var_r,$var_g,$var_b); + $var_max = max($var_r,$var_g,$var_b); + $del_max = $var_max - $var_min; + $l = ($var_max + $var_min) / 2; + if ($del_max == 0) { + $h = 0; + $s = 0; + } + else { + if ($l < 0.5) { $s = $del_max / ($var_max + $var_min); } + else { $s = $del_max / (2 - $var_max - $var_min); } + $del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max; + $del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max; + $del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max; + if ($var_r == $var_max) { $h = $del_b - $del_g; } + elseif ($var_g == $var_max) { $h = (1 / 3) + $del_r - $del_b; } + elseif ($var_b == $var_max) { $h = (2 / 3) + $del_g - $del_r; }; + if ($h < 0) { $h += 1; } + if ($h > 1) { $h -= 1; } + } + return array($h,$s,$l); +} + + +function hsl2rgb($h2,$s2,$l2) { + // Input is HSL value of complementary colour, held in $h2, $s, $l as fractions of 1 + // Output is RGB in normal 255 255 255 format, held in $r, $g, $b + // Hue is converted using function hue_2_rgb, shown at the end of this code + if ($s2 == 0) { + $r = $l2 * 255; + $g = $l2 * 255; + $b = $l2 * 255; + } + else { + if ($l2 < 0.5) { $var_2 = $l2 * (1 + $s2); } + else { $var_2 = ($l2 + $s2) - ($s2 * $l2); } + $var_1 = 2 * $l2 - $var_2; + $r = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2 + (1 / 3))); + $g = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2)); + $b = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2 - (1 / 3))); + } + return array($r,$g,$b); +} + +function hue_2_rgb($v1,$v2,$vh) { + // Function to convert hue to RGB, called from above + if ($vh < 0) { $vh += 1; }; + if ($vh > 1) { $vh -= 1; }; + if ((6 * $vh) < 1) { return ($v1 + ($v2 - $v1) * 6 * $vh); }; + if ((2 * $vh) < 1) { return ($v2); }; + if ((3 * $vh) < 2) { return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6)); }; + return ($v1); +} + +function _invertColor($cor) { + if ($cor[0]==3 || $cor[0]==5) { // RGB + return array(3, (255-$cor[1]), (255-$cor[2]), (255-$cor[3])); + } + else if ($cor[0]==4 || $cor[0]==6) { // CMYK + return array(4, (100-$cor[1]), (100-$cor[2]), (100-$cor[3]), (100-$cor[4])); + } + else if ($cor[0]==1) { // Grayscale + return array(1, (255-$cor[1])); + } + // Cannot cope with non-RGB colors at present + die('Error in _invertColor - trying to invert non-RGB color'); +} + +function _colAtoString($cor) { + $s = ''; + if ($cor{0}==1) $s = 'rgb('.ord($cor{1}).','.ord($cor{1}).','.ord($cor{1}).')'; + else if ($cor{0}==2) $s = 'spot('.ord($cor{1}).','.ord($cor{2}).')'; // SPOT COLOR + else if ($cor{0}==3) $s = 'rgb('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).')'; + else if ($cor{0}==4) $s = 'cmyk('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.ord($cor{4}).')'; + else if ($cor{0}==5) $s = 'rgba('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.sprintf('%0.2F',ord($cor{4})/100).')'; + else if ($cor{0}==6) $s = 'cmyka('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.ord($cor{4}).','.sprintf('%0.2F',ord($cor{5})/100).')'; + return $s; +} + +function ConvertSize($size=5,$maxsize=0,$fontsize=false,$usefontsize=true){ +// usefontsize - setfalse for e.g. margins - will ignore fontsize for % values +// Depends of maxsize value to make % work properly. Usually maxsize == pagewidth +// For text $maxsize = Fontsize +// Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize + //Identify size (remember: we are using 'mm' units here) + $size = trim(strtolower($size)); + + if ( $size == 'thin' ) $size = 1*(25.4/$this->dpi); //1 pixel width for table borders + elseif ( stristr($size,'px') ) $size *= (25.4/$this->dpi); //pixels + elseif ( stristr($size,'cm') ) $size *= 10; //centimeters + elseif ( stristr($size,'mm') ) $size += 0; //millimeters + elseif ( stristr($size,'pt') ) $size *= 25.4/72; //72 pts/inch + elseif ( stristr($size,'rem') ) { // mPDF 5.6.12 + $size += 0; //make "0.83rem" become simply "0.83" + $size *= ($this->default_font_size / _MPDFK); + } + elseif ( stristr($size,'em') ) { + $size += 0; //make "0.83em" become simply "0.83" + if ($fontsize) { $size *= $fontsize; } + else { $size *= $maxsize; } + } + elseif ( stristr($size,'%') ) { + $size += 0; //make "90%" become simply "90" + if ($fontsize && $usefontsize) { $size *= $fontsize/100; } + else { $size *= $maxsize/100; } + } + elseif ( stristr($size,'in') ) $size *= 25.4; //inches + elseif ( stristr($size,'pc') ) $size *= 38.1/9; //PostScript picas + elseif ( stristr($size,'ex') ) { // Approximates "ex" as half of font height + $size += 0; //make "3.5ex" become simply "3.5" + if ($fontsize) { $size *= $fontsize/2; } + else { $size *= $maxsize/2; } + } + elseif ( $size == 'medium' ) $size = 3*(25.4/$this->dpi); //3 pixel width for table borders + elseif ( $size == 'thick' ) $size = 5*(25.4/$this->dpi); //5 pixel width for table borders + elseif ($size == 'xx-small') { + if ($fontsize) { $size *= $fontsize*0.7; } + else { $size *= $maxsize*0.7; } + } + elseif ($size == 'x-small') { + if ($fontsize) { $size *= $fontsize*0.77; } + else { $size *= $maxsize*0.77; } + } + elseif ($size == 'small') { + if ($fontsize) { $size *= $fontsize*0.86; } + else { $size *= $maxsize*0.86; } + } + elseif ($size == 'medium') { + if ($fontsize) { $size *= $fontsize; } + else { $size *= $maxsize; } + } + elseif ($size == 'large') { + if ($fontsize) { $size *= $fontsize*1.2; } + else { $size *= $maxsize*1.2; } + } + elseif ($size == 'x-large') { + if ($fontsize) { $size *= $fontsize*1.5; } + else { $size *= $maxsize*1.5; } + } + elseif ($size == 'xx-large') { + if ($fontsize) { $size *= $fontsize*2; } + else { $size *= $maxsize*2; } + } + else $size *= (25.4/$this->dpi); //nothing == px + + return $size; +} + + +function lesser_entity_decode($html) { + //supports the most used entity codes (only does ascii safe characters) + //$html = str_replace(" "," ",$html); // mPDF 5.3.59 + $html = str_replace("<","<",$html); + $html = str_replace(">",">",$html); + + $html = str_replace("'","'",$html); + $html = str_replace(""",'"',$html); + $html = str_replace("&","&",$html); + return $html; +} + +function AdjustHTML($html, $tabSpaces=8) { + //Try to make the html text more manageable (turning it into XHTML) + if (PHP_VERSION_ID < 50307) { + if (strlen($html) > 100000) { + if (PHP_VERSION_ID < 50200) $this->Error("The HTML code is more than 100,000 characters. You should use WriteHTML() with smaller string lengths."); + else ini_set("pcre.backtrack_limit","1000000"); + } + } + +/*-- ANNOTATIONS --*/ + preg_match_all("/()/si", $html, $m); + if (count($m[1])) { + for($i=0;$i)/si", $html, $svgi); + if (count($svgi[0])) { + for($i=0;$i', $html); // mPDF 5.5.18 + } + } + + //Remove javascript code from HTML (should not appear in the PDF file) + $html = preg_replace('//is','',$html); + + //Remove special comments + $html = preg_replace('//i','',$html); + + //Remove comments from HTML (should not appear in the PDF file) + $html = preg_replace('//s','',$html); + + $html = preg_replace('/\f/','',$html); //replace formfeed by nothing + $html = preg_replace('/\r/','',$html); //replace carriage return by nothing + + // Well formed XHTML end tags + $html = preg_replace('/<(br|hr)\/>/i',"<\\1 />",$html); + // Get rid of empty + $html = preg_replace('/\s*<\/thead>/i','',$html); + $html = preg_replace('/\s*<\/tfoot>/i','',$html); + $html = preg_replace('/]*>\s*<\/table>/i','',$html); + $html = preg_replace('/\s*<\/tr>/i','',$html); + + // Remove spaces at end of table cells + $html = preg_replace("/[ \n\r]+<\/t(d|h)/",'[ ]*/",'',$html); + + // Concatenates any Substitute characters from symbols/dingbats + $html = str_replace('','|',$html); + $html = str_replace('','|',$html); + $html = str_replace('','|',$html); + + $html = preg_replace('/
    \s*/is',"
    ",$html); + + $html = preg_replace('/\s*/is',"­",$html); // mPDF 5.6.04 + + // Preserve '\n's in content between the tags
     and 
    + if (preg_match('/
    ]*\>)/', $html, -1, 2);
    +		$h = array();
    +		$c=0;
    +		foreach($html_a AS $s) {
    +			if ($c>1 && preg_match('/^<\/pre/i',$s)) { $c--; $s=preg_replace('/<\/pre/i','0 && preg_match('/^
    (.*?)
    #si',$html,$temp); + // Preserve '\n's in content between the tags + $thereistextarea = preg_match_all('#(.*?)#si',$html,$temp2); + $html = preg_replace('/[\n]/',' ',$html); //replace linefeed by spaces + $html = preg_replace('/[\t]/',' ',$html); //replace tabs by spaces + + // Converts < to < when not a tag + $html = preg_replace('/<([^!\/a-zA-Z])/i','<\\1',$html); + $html = preg_replace("/[ ]+/",' ',$html); + + $html = preg_replace('/\/li>\s+<\/(u|o)l/i','/li>\s+<\/li/i','/\\1l>\s+<\/(u|o)l/i','/li>\s+
  • ]*)>[ ]+/i','<\\1l\\2>',$html); + $html = preg_replace('/[ ]+<(u|o)l/i','<\\1l',$html); + + $iterator = 0; + while($thereispre) //Recover
    content
    + { + $temp[2][$iterator] = preg_replace("/^([^\n\t]*?)\t/me", "stripslashes('\\1') . str_repeat(' ', ( $tabSpaces - (mb_strlen(stripslashes('\\1')) % $tabSpaces)) )",$temp[2][$iterator]); + $temp[2][$iterator] = preg_replace('/\t/',str_repeat(" ",$tabSpaces),$temp[2][$iterator]); + + $temp[2][$iterator] = preg_replace('/\n/',"
    ",$temp[2][$iterator]); + $temp[2][$iterator] = str_replace('\\',"\\\\",$temp[2][$iterator]); + $html = preg_replace('#(.*?)
  • #si',''.$temp[2][$iterator].'',$html,1); + $thereispre--; + $iterator++; + } + $iterator = 0; + while($thereistextarea) //Recover + { + $temp2[2][$iterator] = preg_replace('/\t/',str_repeat(" ",$tabSpaces),$temp2[2][$iterator]); + $temp2[2][$iterator] = str_replace('\\',"\\\\",$temp2[2][$iterator]); // mPDF 5.3.88 + $html = preg_replace('#(.*?)#si',''.trim($temp2[2][$iterator]) .'',$html,1); + $thereistextarea--; + $iterator++; + } + //Restore original tag names + $html = str_replace("","
    ",$html); + $html = str_replace("","",$html); + $html = str_replace("]*)><\/textarea>/si',' ',$html); + $html = preg_replace('/(]*>)\s*()(.*?<\/table>)/si','\\2 position="top"\\3\\1\\4\\2 position="bottom"\\3',$html); // *TABLES* + $html = preg_replace('/<(h[1-6])([^>]*)(>(?:(?!h[1-6]).)*?<\/\\1>\s*_charDefined($this->CurrentFont['cw'],$cp+intval($nstr[$i]))) { // contains arabic-indic numbers + $rnum .= code2utf($cp+intval($nstr[$i])); + } + else { $rnum .= $nstr[$i]; } + } + return $rnum; +} + +function dec2alpha($valor,$toupper="true"){ +// returns a string from A-Z to AA-ZZ to AAA-ZZZ +// OBS: A = 65 ASCII TABLE VALUE + if (($valor < 1) || ($valor > 18278)) return "?"; //supports 'only' up to 18278 + $c1 = $c2 = $c3 = ''; + if ($valor > 702) // 3 letters (up to 18278) + { + $c1 = 65 + floor(($valor-703)/676); + $c2 = 65 + floor((($valor-703)%676)/26); + $c3 = 65 + floor((($valor-703)%676)%26); + } + elseif ($valor > 26) // 2 letters (up to 702) + { + $c1 = (64 + (int)(($valor-1) / 26)); + $c2 = (64 + (int)($valor % 26)); + if ($c2 == 64) $c2 += 26; + } + else // 1 letter (up to 26) + { + $c1 = (64 + $valor); + } + $alpha = chr($c1); + if ($c2 != '') $alpha .= chr($c2); + if ($c3 != '') $alpha .= chr($c3); + if (!$toupper) $alpha = strtolower($alpha); + return $alpha; +} + + +function dec2roman($valor,$toupper=true){ + //returns a string as a roman numeral + $r1=$r2=$r3=$r4=''; + if (($valor >= 5000) || ($valor < 1)) return "?"; //supports 'only' up to 4999 + $aux = (int)($valor/1000); + if ($aux!==0) + { + $valor %= 1000; + while($aux!==0) + { + $r1 .= "M"; + $aux--; + } + } + $aux = (int)($valor/100); + if ($aux!==0) + { + $valor %= 100; + switch($aux){ + case 3: $r2="C"; + case 2: $r2.="C"; + case 1: $r2.="C"; break; + case 9: $r2="CM"; break; + case 8: $r2="C"; + case 7: $r2.="C"; + case 6: $r2.="C"; + case 5: $r2="D".$r2; break; + case 4: $r2="CD"; break; + default: break; + } + } + $aux = (int)($valor/10); + if ($aux!==0) + { + $valor %= 10; + switch($aux){ + case 3: $r3="X"; + case 2: $r3.="X"; + case 1: $r3.="X"; break; + case 9: $r3="XC"; break; + case 8: $r3="X"; + case 7: $r3.="X"; + case 6: $r3.="X"; + case 5: $r3="L".$r3; break; + case 4: $r3="XL"; break; + default: break; + } + } + switch($valor){ + case 3: $r4="I"; + case 2: $r4.="I"; + case 1: $r4.="I"; break; + case 9: $r4="IX"; break; + case 8: $r4="I"; + case 7: $r4.="I"; + case 6: $r4.="I"; + case 5: $r4="V".$r4; break; + case 4: $r4="IV"; break; + default: break; + } + $roman = $r1.$r2.$r3.$r4; + if (!$toupper) $roman = strtolower($roman); + return $roman; +} +/*-- END LISTS --*/ + + +//=========================== +/*-- IMPORTS --*/ +function SetImportUse() { + $this->enableImports = true; + ini_set('auto_detect_line_endings',1); + require_once(_MPDF_PATH."mpdfi/pdf_context.php"); + require_once(_MPDF_PATH."mpdfi/pdf_parser.php"); + require_once(_MPDF_PATH."mpdfi/fpdi_pdf_parser.php"); +} + +// from mPDFI +function hex2str($hex) { + return pack("H*", str_replace(array("\r","\n"," "),"", $hex)); +} + +function str2hex($str) { + return current(unpack("H*",$str)); +} + + +function pdf_write_value(&$value) { + switch ($value[0]) { + case PDF_TYPE_NUMERIC : + case PDF_TYPE_TOKEN : + // A numeric value or a token. + // Simply output them + $this->_out($value[1]." ", false); + break; + + case PDF_TYPE_ARRAY : + // An array. Output the proper + // structure and move on. + $this->_out("[",false); + for ($i = 0; $i < count($value[1]); $i++) { + $this->pdf_write_value($value[1][$i]); + } + $this->_out("]"); + break; + + case PDF_TYPE_DICTIONARY : + // A dictionary. + $this->_out("<<",false); + reset ($value[1]); + while (list($k, $v) = each($value[1])) { + $this->_out($k . " ",false); + $this->pdf_write_value($v); + } + $this->_out(">>"); + break; + + case PDF_TYPE_OBJREF : + // An indirect object reference + // Fill the object stack if needed + $cpfn =& $this->current_parser->filename; + if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) { + $this->_newobj(false,true); + $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + } + $objid = $this->_don_obj_stack[$cpfn][$value[1]][0]; + $this->_out("{$objid} 0 R"); //{$value[2]} + break; + + case PDF_TYPE_STRING : + if ($this->encrypted) { + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + $value[1] = $this->_escape($value[1]); + } + // A string. + $this->_out('('.$value[1].')'); + break; + + case PDF_TYPE_STREAM : + // A stream. First, output the + // stream dictionary, then the + // stream data itself. + $this->pdf_write_value($value[1]); + if ($this->encrypted) { + $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]); + } + $this->_out("stream"); + $this->_out($value[2][1]); + $this->_out("endstream"); + break; + + case PDF_TYPE_HEX : + if ($this->encrypted) { + $value[1] = $this->hex2str($value[1]); + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + // remake hexstring of encrypted string + $value[1] = $this->str2hex($value[1]); + } + $this->_out("<".$value[1].">"); + break; + + case PDF_TYPE_NULL : + // The null object. + $this->_out("null"); + break; + } +} + +// ========== OVERWRITE SEARCH STRING IN A PDF FILE ================ +function OverWrite($file_in, $search, $replacement, $dest="D", $file_out="mpdf" ) { + $pdf = file_get_contents($file_in); + + if (!is_array($search)) { + $x = $search; + $search = array($x); + } + if (!is_array($replacement)) { + $x = $replacement; + $search = array($x); + } + + if (!$this->onlyCoreFonts && !$this->usingCoreFont) { + foreach($search AS $k=>$val) { + $search[$k] = $this->UTF8ToUTF16BE($search[$k] , false); + $search[$k] = $this->_escape($search[$k]); + $replacement[$k] = $this->UTF8ToUTF16BE($replacement[$k], false); + $replacement[$k] = $this->_escape($replacement[$k]); + } + } + else { + foreach($replacement AS $k=>$val) { + $replacement[$k] = mb_convert_encoding($replacement[$k],$this->mb_enc,'utf-8'); + $replacement[$k] = $this->_escape($replacement[$k]); + } + } + + // Get xref into array + $xref = array(); + preg_match("/xref\n0 (\d+)\n(.*?)\ntrailer/s",$pdf,$m); + $xref_objid = $m[1]; + preg_match_all('/(\d{10}) (\d{5}) (f|n)/',$m[2],$x); + for($i=0; $icompress) { + preg_match("/".($obj+1)." 0 obj\n<<\s*\/Filter\s*\/FlateDecode\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s",$pdf,$m); + } + else { + preg_match("/".($obj+1)." 0 obj\n<<\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s",$pdf,$m); + } + $s = $m[2]; + if (!$s) { continue; } + $oldlen = $m[1]; + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($obj+1), $s); + } + if ($this->compress) { + $s = gzuncompress($s); + } + foreach($search AS $k=>$val) { + $s = str_replace($search[$k],$replacement[$k],$s); + } + if ($this->compress) { + $s = gzcompress($s); + } + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($obj+1), $s); + } + $newlen = strlen($s); + $changes[($xref[$obj+1][0])] = ($newlen - $oldlen) + (strlen($newlen) - strlen($oldlen )); + if ($this->compress) { + $newstr = ($obj+1) . " 0 obj\n<>\nstream\n".$s."\nendstream\n"; + } + else { + $newstr = ($obj+1) . " 0 obj\n<>\nstream\n".$s."\nendstream\n"; + } + $pdf = str_replace($m[0],$newstr,$pdf); + } + + // Update xref in PDF + krsort($changes); + $newxref = "xref\n0 ".$xref_objid."\n"; + foreach($xref AS $v) { + foreach($changes AS $ck => $cv) { + if ($v[0] > $ck) { $v[0] += $cv; } + } + $newxref .= sprintf('%010d',$v[0]) . ' ' . $v[1] . ' ' .$v[2] . " \n"; + } + $newxref .= "trailer"; + $pdf = preg_replace("/xref\n0 \d+\n.*?\ntrailer/s",$newxref,$pdf); + + // Update startxref in PDF + preg_match("/startxref\n(\d+)\n%%EOF/s", $pdf, $m); + $startxref = $m[1]; + $startxref += array_sum($changes); + $pdf = preg_replace("/startxref\n(\d+)\n%%EOF/s","startxref\n".$startxref."\n%%EOF",$pdf); + + // OUTPUT + switch($dest) { + case 'I': + //Send to standard output + if(isset($_SERVER['SERVER_NAME'])) + { + //We send to a browser + Header('Content-Type: application/pdf'); + Header('Content-Length: '.strlen($pdf)); + Header('Content-disposition: inline; filename='.$file_out); + } + echo $pdf; + break; + case 'F': + //Save to local file + if (!$file_out) { $file_out = 'mpdf.pdf'; } + $f=fopen($file_out,'wb'); + if(!$f) die('Unable to create output file: '.$file_out); + fwrite($f,$pdf,strlen($pdf)); + fclose($f); + break; + case 'S': + //Return as a string + return $pdf; + case 'D': + default: + //Download file + if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) + Header('Content-Type: application/force-download'); + else + Header('Content-Type: application/octet-stream'); + Header('Content-Length: '.strlen($pdf)); + Header('Content-disposition: attachment; filename='.$file_out); + echo $pdf; + break; + } +} + + +function GetTemplateSize($tplidx, $_w=0, $_h=0) { + if (!$this->tpls[$tplidx]) + return false; + $w = $this->tpls[$tplidx]['box']['w']; + $h = $this->tpls[$tplidx]['box']['h']; + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + if($_w==0) + $_w=$_h*$w/$h; + if($_h==0) + $_h=$_w*$h/$w; + return array("w" => $_w, "h" => $_h); +} + +// Thumbnails +function Thumbnail($file, $npr=3, $spacing=10) { //$npr = number per row + $w = (($this->pgwidth + $spacing)/$npr) - $spacing; + $oldlinewidth = $this->LineWidth; + $this->SetLineWidth(0.02); + $this->SetDColor($this->ConvertColor(0)); + $h = 0; + $maxh = 0; + $x = $_x = $this->lMargin; + $_y = $this->tMargin; + if ($this->y==0) { $y = $_y; } else { $y = $this->y; } + $pagecount = $this->SetSourceFile($file); + for ($n = 1; $n <= $pagecount; $n++) { + $tplidx = $this->ImportPage($n); + $size = $this->useTemplate($tplidx, $x, $y, $w); + $this->Rect($x, $y, $size['w'], $size['h']); + $h = max($h, $size['h']); + $maxh = max($h, $maxh); + if ($n % $npr == 0) { + if (($y + $h + $spacing + $maxh)>$this->PageBreakTrigger && $n != $pagecount) { + $this->AddPage(); + $x = $_x; + $y = $_y; + } + else { + $y += $h+$spacing ; + $x = $_x; + $h = 0; + } + } + else { + $x += $w+$spacing ; + } + } + $this->SetLineWidth($oldlinewidth); +} + +function SetSourceFile($filename) { + $this->current_filename = $filename; + $fn =& $this->current_filename; + if (!isset($this->parsers[$fn])) + // $this->parsers[$fn] =& new fpdi_pdf_parser($fn,$this); + $this->parsers[$fn] = new fpdi_pdf_parser($fn,$this); + if (!$this->parsers[$fn]->success) { + $this->Error($this->parsers[$fn]->errormsg); // Delete this line to return false on fail + return false; + } + $this->current_parser =& $this->parsers[$fn]; + return $this->parsers[$fn]->getPageCount(); +} +function ImportPage($pageno=1, $crop_x=null, $crop_y=null, $crop_w=0, $crop_h=0, $boxName='/CropBox') { + $fn =& $this->current_filename; + $parser =& $this->parsers[$fn]; + $parser->setPageno($pageno); + + $this->tpl++; + $this->tpls[$this->tpl] = array(); + $tpl =& $this->tpls[$this->tpl]; + $tpl['parser'] =& $parser; + $tpl['resources'] = $parser->getPageResources(); + $tpl['buffer'] = $parser->getContent(); + if (!in_array($boxName, $parser->availableBoxes)) + return $this->Error(sprintf("Unknown box: %s", $boxName)); + $pageboxes = $parser->getPageBoxes($pageno); + /** + * MediaBox + * CropBox: Default -> MediaBox + * BleedBox: Default -> CropBox + * TrimBox: Default -> CropBox + * ArtBox: Default -> CropBox + */ + if (!isset($pageboxes[$boxName]) && ($boxName == "/BleedBox" || $boxName == "/TrimBox" || $boxName == "/ArtBox")) + $boxName = "/CropBox"; + if (!isset($pageboxes[$boxName]) && $boxName == "/CropBox") + $boxName = "/MediaBox"; + if (!isset($pageboxes[$boxName])) + return false; + $box = $pageboxes[$boxName]; + + $tpl['box'] = $box; + // To build an array that can be used by useTemplate() + $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box); + // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects() + $tpl['x'] = 0; + $tpl['y'] = 0; + $tpl['w'] = $tpl['box']['w'] ; + $tpl['h'] = $tpl['box']['h'] ; + if ($crop_w) { $tpl['box']['w'] = $crop_w; } + if ($crop_h) { $tpl['box']['h'] = $crop_h; } + if (isset($crop_x)) { $tpl['box']['x'] = $crop_x; } + if (isset($crop_y)) {$tpl['box']['y'] = $tpl['h'] - $crop_y - $crop_h ; } + + $page =& $parser->pages[$parser->pageno]; + // fix for rotated pages + $rotation = $parser->getPageRotation($pageno); + + if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0 && $tpl['box']['w'] == $tpl['w']) { + $steps = $angle / 90; + + $_w = $tpl['w']; + $_h = $tpl['h']; + $tpl['w'] = $steps % 2 == 0 ? $_w : $_h; + $tpl['h'] = $steps % 2 == 0 ? $_h : $_w; + if ($steps % 2 != 0) { + $x = $y = ($steps == 1 || $steps == -3) ? $tpl['h'] : $tpl['w']; + } else { + $x = $tpl['w']; + $y = $tpl['h']; + } + $cx=($x/2+$tpl['box']['x'])*_MPDFK; + $cy=($y/2+$tpl['box']['y'])*_MPDFK; + $angle*=-1; + $angle*=M_PI/180; + $c=cos($angle); + $s=sin($angle); + $tpl['box']['w'] = $tpl['w'] ; + $tpl['box']['h'] = $tpl['h'] ; + $tpl['buffer'] = sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm %s Q',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy, $tpl['buffer']); + } + return $this->tpl; +} +function UseTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { + if (!isset($this->tpls[$tplidx])) + $this->Error("Template does not exist!"); + if($this->state==0) { $this->AddPage(); } + $out = 'q 0 J 1 w 0 j 0 G'."\n"; // reset standard values + $x = $this->tpls[$tplidx]['x']; + $y = $this->tpls[$tplidx]['y']; + $w = $this->tpls[$tplidx]['w']; + $h = $this->tpls[$tplidx]['h']; + if ($_x == null) { $_x = $x; } + if ($_y == null) { $_y = $y; } + if ($_x === -1) { $_x = $this->x; } + if ($_y === -1) { $_y = $this->y; } + + $wh = $this->getTemplateSize($tplidx,$_w,$_h); + $_w = $wh['w']; + $_h = $wh['h']; + $out .= sprintf("q %.4F 0 0 %.4F %.2F %.2F cm", ($_w/$this->tpls[$tplidx]['box']['w']), ($_h/$this->tpls[$tplidx]['box']['h']), $_x*_MPDFK, ($this->h-($_y+$_h))*_MPDFK)."\n"; + $out .= $this->tplprefix.$tplidx." Do Q\n"; + + $s = array("w" => $_w, "h" => $_h); + $out .= "Q\n"; + $this->pages[$this->page] = $out . $this->pages[$this->page]; + return $s; +} +function SetPageTemplate($tplidx='') { + if (!isset($this->tpls[$tplidx])) { + $this->pageTemplate = ''; + return false; + } + $this->pageTemplate = $tplidx; +} +function SetDocTemplate($file='', $continue=0) { + $this->docTemplate = $file; + $this->docTemplateContinue = $continue; +} +/*-- END IMPORTS --*/ + + +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ + +// JAVASCRIPT +function _set_object_javascript ($string) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/S /JavaScript '); + $this->_out('/JS '.$this->_textstring($string)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function SetJS($script) { + $this->js = $script; +} + + + + +}//end of Class + + + + +?> \ No newline at end of file diff --git a/panel.php b/panel.php new file mode 100644 index 0000000..52063f4 --- /dev/null +++ b/panel.php @@ -0,0 +1,400 @@ + + + + +

    + + BRAK DOSTĘPU
    + + + +'; + + break; + + case "raporty": + + if($_SESSION['uprawnienia']['raporty']=='TAK') + + include ("raporty.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "zaliczki": + + if($_SESSION['uprawnienia']['zaliczki']=='TAK') + + include ("zaliczki.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "kilometry": + + if($_SESSION['uprawnienia']['kilometry']=='TAK') + + include ("kilometry.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "tankowania": + + if($_SESSION['uprawnienia']['tankowania']=='TAK') + + include ("tankowania.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "zestawienia": + + if($_SESSION['uprawnienia']['zestawienia']=='TAK') + + include ("zestawienia.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "samochod": + + if($_SESSION['uprawnienia']['samochod']=='TAK') + + include ("samochod.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "ustawienia": + + if($_SESSION['uprawnienia']['ustawienia']=='TAK') + + include ("ustawienia.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "konta": + + if($_SESSION['uprawnienia']['konta']=='TAK') + + include ("konta.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + case "vending": + + if($_SESSION['uprawnienia']['vending']=='TAK') + + include ("vending.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + + case "pos": + + if($_SESSION['uprawnienia']['pos']=='TAK') + + include ("pos.php"); + + else + + echo ' + + + + + + + +

    + + BRAK DOSTĘPU
    '; + + break; + + + case "zestawienie_zaliczek": + + include ("zestawienie_zaliczek.php"); + + break; + + case "zestawienie_kilometrow": + + include ("zestawienie_klometrow.php"); + + break; + + case "zestawienie_paliwo": + + include ("zestawienie_paliwo.php"); + + break; + + case "zestawienie_czasu": + + include ("zestawienie_czasu.php"); + + break; + + + + default: + +$sprawdzanie_uzytkownika=mysql_query("select uprawnienia1 from uzytkownicy where id_sta='5' and id='".$_SESSION['id']."'") or die(mysql_error()); + + if(mysql_num_rows($sprawdzanie_uzytkownika)>0) + + { + + } + + else + + { + + echo ' + + + + + + + + + + + + + + +

    Przy wpisach ulamkowych koniecznie wpisywac '.' (KROPKA). Np 123.45 !!!Nie uzywac przecinkow.!!!

    +

    '; + +$sql['host'] = 'sql.atm.home.pl'; + +$sql['login'] = 'atm4'; + +$sql['password'] = 'alan87'; + +$sql['db'] = 'atm4'; + + + +// polaczenie z baza danych + +mysql_connect($sql['host'],$sql['login'],$sql['password']); + +mysql_select_db($sql['db']); + + + +// nazwa tabeli w ktorej znajduja siďż˝ tematy + +$tab['forum_topics'] = "phpbb_topics"; + + + +$limit['forum_topics'] = 10; // ilosc wyswietlanych tematow + +$limit['forum_signs'] = 100; // dopuszczalna ilosc liter + + + +$path['forum'] = "forum/"; // lokalizacja katalogu z forum + + + +// zapytanie do bazy + +$sql_query = "SELECT topic_time,topic_id, topic_title FROM ".$tab['forum_topics']." ORDER BY topic_id ASC LIMIT ".$limit['forum_topics']."" or die ("Nie mozna wykonac zapytania"); + +$result = mysql_query($sql_query) or die ("Nie mozna wykonac wyniku"); + + + +// wyswietlanie rekordow + + ?> + + + + +

    '; + + +echo '

    '; + + } + + break; + +} + +ob_end_flush(); + +?> + diff --git a/pdf.php b/pdf.php new file mode 100644 index 0000000..b986fd1 --- /dev/null +++ b/pdf.php @@ -0,0 +1,50 @@ +Open(); //otwiera nowy dokument +$pdf->AddPage(); //dodaje nową stronę do dokumentu +$pdf->AddFont('arialpl','','arialpl.php'); //dodaje Twoją czcionkę arialpl do dokumentu +$pdf->SetFont('arialpl','',20); //ustawia czcionkę arialpl, rozmiar 20 +$pdf->Text(10,10, 'Witaj świecie. To jest tekst bez zawijania'); //tekst bez zawijania na pozycji x=10, y=10 +$pdf->SetFont('arialpl','',14); +$pdf->Multicell(0,4, 'Ten tekst z zamierzenia miał być długi, w każdym razie raczej nie powinien zmieścić się w jednej linijce, ale nie ma żadnego problemu, funkcja Multicell() służy do wprowadzania tekstu z zawijaniem, ba jeśli tekst będzie dłuższy od strony, utworzy ona nową! ',0, 'J',0); //tekst wieloliniowy o szerokości do prawej linii, wysokości linii 4, bez ramki, wyjustowany, bez tła +/* Dopisuje niebieski podkreślony odnośnik */ +$pdf->SetFont('arialpl','',14); +$pdf->Write(10,'Zapraszam na '); +$pdf->SetTextColor(0,0,255); //zmienia kolor czcionki +$pdf->SetFont('','U'); //zmienia styl czcionki na podkreślenie +$pdf->Write(10,'4programmers.net','http://4programmers.net'); +$iks = $pdf->GetX; +$igrek = $pdf->GetY; +$pdf->Line($iks, $igrek+2,200, $igrek+2); //wstawia linię 2mm pod tekstem, o długości 200mm. +/* narysuje granatowy prostokąt z zielonym wypełnieniem */ +$pdf->SetDrawColor(170,255,64); +$pdf->SetFillColor(54,255,102); +$pdf->Rect($iks+20, $igrek+20,200,100); +$ident = $pdf->AddLink(); +$pdf->SetLink($ident,0,2); //tworzy (ale nie wstawia do dokumentu!) link do strony 2 +$tekst = 'Tu znajduje się link do następnej strony!'; +$dlugosc_tekstu = $pdf->GetStringWidth($tekst); //oblicza długość tekstu +$pdf->Text($pdf->GetX(),$pdf->GetY(),$tekst); //wstawia tekst do dokumentu +$pdf->Link($pdf->GetX(),$pdf->GetY(),$dlugosc_tekstu,20, $ident); //wstawia pod tekstem link do dokumentu +$pdf->AddPage(); //dodaje nową stronę. +$pdf->Image('C:\obraz.png', $pdf->GetX()+10, $pdf->GetY()+10, 123, 240, 'PNG'); +$pdf->SetFont('arialpl','',8); +$pdf->SetTextColor(0,0,0); +$pdf->Text($pdf->GetX(),$pdf->GetY()+1, 'i to by było na tyle'); +$pdf->SetCompression(true); //włącza kompresję dokumentu + +/* a poniższe tylko dla ambitnych */ +$pdf->SetAuthor('Ceer'); //ustawia autora dokumentu +$pdf->SetCreator('Dokument generowany przy pomocy skryptu'); //ustawia generator dokumentu +$pdf->SetKeywords('słowo_kluczowe1, słowo_kluczowe2'); //ustawia słowa kluczowe dokumentu +$pdf->SetSubject('Nauka dynamicznego tworzenia PDFów'); //ustawia temat dokumentu +$pdf->SetTitle('Jak łatwo stworzyć PDFa'); //ustawia tytuł dokumentu + +$pdf->SetDisplayMode(100); //domyślne powiększenie dokumentu w przeglądarce +$pdf->SetMargins(20, 20 , 20); //ustawia marginesy dla dokumentu + +/* kończy zabawę i generuje dokument */ +$pdf->Output(); //zamyka i generuje dokument +?> diff --git a/pos.php b/pos.php new file mode 100644 index 0000000..e454c5d --- /dev/null +++ b/pos.php @@ -0,0 +1 @@ +
    SIĘ ROBI
    \ No newline at end of file diff --git a/progbar.css b/progbar.css new file mode 100644 index 0000000..78afc31 --- /dev/null +++ b/progbar.css @@ -0,0 +1,66 @@ +body { + margin : 0 auto; + width:100%; + font-family: "Verdana"; + color: #40454b; + font-size: 12px; + text-align:center; +} +.main { + width:540px; + margin: 0 auto; + text-align:left; +} +.heading { + font-size:14px; + font-weight:bold; + color:#CC0000; + padding:5px; + margin-left:10px; + border-bottom:solid; + border-bottom-width:1px; + border-bottom-color:#333333; + /* Use this to suppress the horizontal line under the heading */ + /* border-bottom: 0px solid #000000; */ +} +table { + font-family: "Verdana"; + color: #40454b; + font-size: 12px; +} +.demo { + margin : 0 auto; + width:100%; + margin:20px; + /* Use this to suppress all the bars and text */ + /* display: none; */ +} +td { + vertical-align: top; + padding: 0 0.5em 0 0; +} +.code { + font-family: "Courier New", Courier, monospace; + font-size: 10px; +} +.code2 { + font-family: "Courier New", Courier, monospace; + font-size: 11px; font-weight: bold; color: red; +} +.barheading { + color:#006600; + font-weight:bold; +} +.progressBar { + border: 1px solid #000000; + background-color: #EEEEEE; + width: 200px; + font-size: 6px; +} +.innerBar { + background-color:#00CC00; + width: 0%; +} +#box3 { + font-weight: bold; +} diff --git a/raporty.php b/raporty.php new file mode 100644 index 0000000..da5d6de --- /dev/null +++ b/raporty.php @@ -0,0 +1,3324 @@ +0) + + { + + + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "show_ncr": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_ncr(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż'; + + + + echo '' ; + + } + + echo '
    DataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.'
    '; + + } + + BREAK; + + + + + + case "szukaj_raporty_ncr": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.ulica like '%".$_POST['ulica']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $_POST['data1']=''; + + $_POST['data2']=''; + + $_POST['nrzlecenia']=''; + + $_POST['akcja']=''; + + $_POST['bank']=''; + + $_POST['ulica']=''; + + $_POST['miasto']=''; + + $_POST['nrseryjny']=''; + + $_POST['typ']=''; + + form_szukaj_raport_admin(); + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + $opcje1='Pokaż'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.'
    '; + + } + + BREAK; + + case "pokaz_ncr": + + form_pokaż_raporty_ncr($_GET['id_rap']); + + BREAK; + + + + } + + } + + + + + + + + } + +else + +{ + +$sprawdzanie_uzytkownika=mysql_query("select uprawnienia1 from uzytkownicy where uprawnienia1='0' and id='".$_SESSION['id']."'") or die(mysql_error()); + + if(mysql_num_rows($sprawdzanie_uzytkownika)>0) + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "pokaz": + + form_pokaż_raporty($_GET['id_rap']); + + BREAK; + + case "usun": + + if(!is_numeric($_GET['id_pr'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_rap from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $zapytanie2=mysql_query("select id_rap from raporty_pliki where id_rap='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update raporty SET plik='0' where id_rap='".$n[1]."'"); + + } + + if($usun) + + { + + echo('


    Plik zostało usunięty

    '); + + unlink ($n[0]); + + + + + + } + + else + + echo('


    Nie mozna było usun±ć pliku

    '); + + } + + BREAK; + + case "edytuj": + + if(!is_numeric($_GET['id_rap'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_raporty'])) + + form_edytuj_raporty($_GET['id_rap']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miejscowosc']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_raporty($_GET['id_rap']); + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $przystapiono=$_POST['przystapiono']; + + $zrobiony=$_POST['zrobiony']; + + $edytuj_raporty=mysql_query("update raporty SET id_akc='".$_POST['akcja']."',id_ban='".$_POST['bank']."',nrzlecenia='".$_POST['nrzlecenia']."',ulica='".$_POST['ulica']."',miejscowosc='".$_POST['miejscowosc']."',id_ban='".$_POST['bank']."',nrseryjny='".$_POST['nrseryjny']."',typ='".$_POST['typ']."',data='".$_POST['data']."',godzwyj='".$_POST['godzwyj']."',godzroz='".$_POST['godzroz']."',godzzak='".$_POST['godzzak']."',godzprzy='".$_POST['godzprzy']."',uwagi='".$_POST['uwagi']."',dopuszczony='".$dopuszczony."',przystapiono='".$przystapiono."',zrobiony='".$zrobiony."' where id_rap='".$_GET['id_rap']."'"); + + if($edytuj_raporty) + + { + + + +$id2 = $_GET['id_rap']; + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + uwaga('


    Nie mozna było wprowadzić zmian!!!

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj": + +if(!isset($_POST['dodaj_raport'])) + + form_dodaj_raport(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if (((strlen(trim($_POST['id_akc'])==16))) AND ((strlen(trim($_POST['id_ban'])==20)))) + + { + + if (!sprawdz_date($_POST['data'])) + + $blad.=('

    Musisz wprowadzic date - RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport(); + + } + + else + + { + + + + $dodaj_raport=mysql_query("insert into raporty values('','16','20','".$_SESSION['id']."','---','1','1','1','Cieslewskich 25a','Warszawa','---','---','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + + if($dodaj_raport) + + { + + uwaga('

    Raport został dodany

    '); + + } + + else + + { + + uwaga('


    Nie można było dodać Raportu

    '); + + } + + } + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $zrobiony=$_POST['zrobiony']; + + $przystapiono=$_POST['przystapiono']; + if ($dopuszczony==2) + + $blad.=('

    Nie wybrano pola Dopuszczono
    '); + + if ($zrobiony==2) + + $blad.=('
    Nie wybrano pola Zrobiono
    '); + + if ($przystapiono==2) + + $blad.=('
    Nie wybrano pola Podjazd
    '); + + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('
    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport(); + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $zrobiony=$_POST['zrobiony']; + + $przystapiono=$_POST['przystapiono']; + + + + $dodaj_raport=mysql_query("insert into raporty values('','".$_POST['id_akc']."','".$_POST['id_ban']."','".$_SESSION['id']."','".$_POST['nrzlecenia']."','".$dopuszczony."','".$zrobiony."','".$przystapiono."','".$_POST['ulica']."','".$_POST['miasto']."','".$_POST['nrseryjny']."','".$_POST['typ']."','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + +$id2 = mysql_insert_id(); + + if($dodaj_raport) + + { + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + uwaga('

    Raport został dodany

    '); + + } + + else + + uwaga('


    Nie można było dodać Raportu

    '); + + } + + }//else + +} + + break; + + case "show": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data>='".$data2."' and a.data<='".$data."' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_raporty": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.ulica like '%".$_POST['ulica']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + + form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + } //switch + + } //if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + + else + + { + +echo ' + + + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "usun_admin": + + if(!is_numeric($_GET['id_rap'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update raporty SET usun='1' where id_rap='".$_GET['id_rap']."'"); + + if($usun) + + echo('


    Raport zostało usunięty

    '); + + else + + echo('


    Nie mozna było usun±ć Raportu

    '); + + } + + BREAK; + + case "usun_plik": + + if(!is_numeric($_GET['id_pr'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_rap from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $zapytanie2=mysql_query("select id_rap from raporty_pliki where id_rap='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update raporty SET plik='0' where id_rap='".$n[1]."'"); + + } + + if($usun) + + { + + echo('

    Plik zostało usunięte!!!

    '); + + unlink ($n[0]); + + + + + + } + + else + + echo('

    Nie mozna było usun±ć + + pliku!!!

    '); + + } + + BREAK; + + + + case "pokaz_admin": + + form_pokaż_raporty($_GET['id_rap']); + + BREAK; + + case "edytuj_admin": + + if(!is_numeric($_GET['id_rap'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_raporty_admin'])) + + form_edytuj_raporty_admin($_GET['id_rap']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miejscowosc']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_raporty_admin($_GET['id_rap']); + + } + + else + + { + + $edytuj_raporty_admin=mysql_query("update raporty SET id_akc='".$_POST['akcja']."',id_ban='".$_POST['bank']."',nrzlecenia='".$_POST['nrzlecenia']."',ulica='".$_POST['ulica']."',miejscowosc='".$_POST['miejscowosc']."',id_ban='".$_POST['bank']."',nrseryjny='".$_POST['nrseryjny']."',typ='".$_POST['typ']."',data='".$_POST['data']."',godzwyj='".$_POST['godzwyj']."',godzroz='".$_POST['godzroz']."',godzzak='".$_POST['godzzak']."',id='".$_POST['id']."',godzprzy='".$_POST['godzprzy']."',uwagi='".$_POST['uwagi']."',dopuszczony='".$dopuszczony."',przystapiono='".$przystapiono."',zrobiony='".$zrobiony."' where id_rap='".$_GET['id_rap']."'"); + + + + if($edytuj_raporty_admin) + + { + + + +$id2 = $_GET['id_rap']; + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_admin": + + + + if(!isset($_POST['dodaj_raporty_admin'])) + + form_dodaj_raport_admin(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport_admin(); + + } + + else + + { + + $dodaj_kilometry_admin=mysql_query("insert into raporty values('','".$_POST['id_akc']."','".$_POST['id_ban']."','".$_POST['id']."','".$_POST['nrzlecenia']."','".$dopuszczony."','".$zrobiony."','".$przystapiono."','".$_POST['ulica']."','".$_POST['miasto']."','".$_POST['nrseryjny']."','".$_POST['typ']."','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + + + +$id2 = mysql_insert_id(); + + if($dodaj_kilometry_admin) + + { + + + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + uwaga('

    Raport został dodany

    '); + + } + + else + + uwaga('


    Nie można było wprowadzić zmian

    '); + + } + + }//else + + break; + + case "show_admin": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by a.data desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + $lp = $lp + 1; + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show_admin2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data>='".$data2."' and a.data<='".$data."' order by a.data desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + $lp = $lp + 1; + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_raporty_admin": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and + a.id_ban=d.id_ban + and a.usun='0' + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + or d.bank like '".$_POST['bank38']."' + or d.bank like '".$_POST['bank39']."' + or d.bank like '".$_POST['bank40']."' + or d.bank like '".$_POST['bank41']."' + or d.bank like '".$_POST['bank42']."' + or d.bank like '".$_POST['bank43']."' + or d.bank like '".$_POST['bank44']."' + or d.bank like '".$_POST['bank45']."' + or d.bank like '".$_POST['bank46']."' + or d.bank like '".$_POST['bank47']."') + + +) + and a.ulica like '%".$_POST['ulica']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."' + or a.id like '".$_POST['id21']."' + or a.id like '".$_POST['id22']."' + or a.id like '".$_POST['id23']."' + or a.id like '".$_POST['id24']."' + or a.id like '".$_POST['id25']."' + or a.id like '".$_POST['id26']."' + or a.id like '".$_POST['id27']."' + or a.id like '".$_POST['id28']."' + or a.id like '".$_POST['id29']."' + or a.id like '".$_POST['id30']."' + or a.id like '".$_POST['id31']."' + or a.id like '".$_POST['id32']."' + or a.id like '".$_POST['id33']."' + or a.id like '".$_POST['id34']."' + or a.id like '".$_POST['id35']."' + or a.id like '".$_POST['id36']."' + or a.id like '".$_POST['id37']."' + or a.id like '".$_POST['id38']."' + or a.id like '".$_POST['id39']."' + or a.id like '".$_POST['id40']."' +or a.id like '".$_POST['id41']."' +or a.id like '".$_POST['id42']."' +or a.id like '".$_POST['id43']."' +or a.id like '".$_POST['id44']."' +or a.id like '".$_POST['id45']."' +or a.id like '".$_POST['id46']."' +or a.id like '".$_POST['id47']."' +or a.id like '".$_POST['id48']."' +or a.id like '".$_POST['id49']."' +or a.id like '".$_POST['id50']."' +or a.id like '".$_POST['id51']."' +or a.id like '".$_POST['id52']."' +or a.id like '".$_POST['id53']."' +or a.id like '".$_POST['id54']."' +or a.id like '".$_POST['id55']."' +or a.id like '".$_POST['id56']."' +or a.id like '".$_POST['id57']."' +or a.id like '".$_POST['id58']."' +or a.id like '".$_POST['id59']."' +or a.id like '".$_POST['id60']."' +or a.id like '".$_POST['id61']."' + + ) + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + or d.bank like '".$_POST['bank38']."' + or d.bank like '".$_POST['bank39']."' + or d.bank like '".$_POST['bank40']."' + or d.bank like '".$_POST['bank41']."' + or d.bank like '".$_POST['bank42']."' + or d.bank like '".$_POST['bank43']."' + or d.bank like '".$_POST['bank44']."' + or d.bank like '".$_POST['bank45']."' + or d.bank like '".$_POST['bank46']."' + or d.bank like '".$_POST['bank47']."') + + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + else + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.data >= '".$_POST['data1']."' + and a.data <= '".$_POST['data2']."' + + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + or d.bank like '".$_POST['bank38']."' + or d.bank like '".$_POST['bank39']."' + or d.bank like '".$_POST['bank40']."' + or d.bank like '".$_POST['bank41']."' + or d.bank like '".$_POST['bank42']."' + or d.bank like '".$_POST['bank43']."' + or d.bank like '".$_POST['bank44']."' + or d.bank like '".$_POST['bank45']."' + or d.bank like '".$_POST['bank46']."' + or d.bank like '".$_POST['bank47']."') + + + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.data >= '".$_POST['data1']."' + and a.data <= '".$_POST['data2']."' + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."' + or a.id like '".$_POST['id21']."' + or a.id like '".$_POST['id22']."' + or a.id like '".$_POST['id23']."' + or a.id like '".$_POST['id24']."' + or a.id like '".$_POST['id25']."' + or a.id like '".$_POST['id26']."' + or a.id like '".$_POST['id27']."' + or a.id like '".$_POST['id28']."' + or a.id like '".$_POST['id29']."' + or a.id like '".$_POST['id30']."' + or a.id like '".$_POST['id31']."' + or a.id like '".$_POST['id32']."' + or a.id like '".$_POST['id33']."' + or a.id like '".$_POST['id34']."' + or a.id like '".$_POST['id35']."' + or a.id like '".$_POST['id36']."' + or a.id like '".$_POST['id37']."' + or a.id like '".$_POST['id38']."' + or a.id like '".$_POST['id39']."' + or a.id like '".$_POST['id40']."' +or a.id like '".$_POST['id41']."' +or a.id like '".$_POST['id42']."' +or a.id like '".$_POST['id43']."' +or a.id like '".$_POST['id44']."' +or a.id like '".$_POST['id45']."' +or a.id like '".$_POST['id46']."' +or a.id like '".$_POST['id47']."' +or a.id like '".$_POST['id48']."' +or a.id like '".$_POST['id49']."' +or a.id like '".$_POST['id50']."' +or a.id like '".$_POST['id51']."' +or a.id like '".$_POST['id52']."' +or a.id like '".$_POST['id53']."' +or a.id like '".$_POST['id54']."' +or a.id like '".$_POST['id55']."' +or a.id like '".$_POST['id56']."' +or a.id like '".$_POST['id57']."' +or a.id like '".$_POST['id58']."' +or a.id like '".$_POST['id59']."' +or a.id like '".$_POST['id60']."' +or a.id like '".$_POST['id61']."' +) + + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + or d.bank like '".$_POST['bank38']."' + or d.bank like '".$_POST['bank39']."' + or d.bank like '".$_POST['bank40']."' + or d.bank like '".$_POST['bank41']."' + or d.bank like '".$_POST['bank42']."' + or d.bank like '".$_POST['bank43']."' + or d.bank like '".$_POST['bank44']."' + or d.bank like '".$_POST['bank45']."' + or d.bank like '".$_POST['bank46']."' + or d.bank like '".$_POST['bank47']."') + + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + //$_POST['data1']=''; + + //$_POST['data2']=''; + + $_POST['nrzlecenia']=''; + + $_POST['akcja']=''; + + $_POST['bank']=''; + + $_POST['ulica']=''; + + $_POST['miasto']=''; + + $_POST['nrseryjny']=''; + + $_POST['typ']=''; + + form_szukaj_raport_admin(); + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + $color=zmien_color($color); + $lp = $lp + 1; + $banki=$banki+1 ; + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "eksport_raport": + + eksport_raport_pm(); + + eksport_raport_all(); + + BREAK; + + + + } //switch + + } //if + +} + + + +} + + + +?> + diff --git a/raporty1.php b/raporty1.php new file mode 100644 index 0000000..c3d8b9d --- /dev/null +++ b/raporty1.php @@ -0,0 +1,3246 @@ +0) + + { + + + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "show_ncr": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_ncr(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż'; + + + + echo '' ; + + } + + echo '
    DataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.'
    '; + + } + + BREAK; + + + + + + case "szukaj_raporty_ncr": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.ulica like '%".$_POST['ulica']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data DESC"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $_POST['data1']=''; + + $_POST['data2']=''; + + $_POST['nrzlecenia']=''; + + $_POST['akcja']=''; + + $_POST['bank']=''; + + $_POST['ulica']=''; + + $_POST['miasto']=''; + + $_POST['nrseryjny']=''; + + $_POST['typ']=''; + + form_szukaj_raport_admin(); + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + $opcje1='Pokaż'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.'
    '; + + } + + BREAK; + + case "pokaz_ncr": + + form_pokaż_raporty_ncr($_GET['id_rap']); + + BREAK; + + + + } + + } + + + + + + + + } + +else + +{ + +$sprawdzanie_uzytkownika=mysql_query("select uprawnienia1 from uzytkownicy where uprawnienia1='0' and id='".$_SESSION['id']."'") or die(mysql_error()); + + if(mysql_num_rows($sprawdzanie_uzytkownika)>0) + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "pokaz": + + form_pokaż_raporty($_GET['id_rap']); + + BREAK; + + case "usun": + + if(!is_numeric($_GET['id_pr'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_rap from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $zapytanie2=mysql_query("select id_rap from raporty_pliki where id_rap='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update raporty SET plik='0' where id_rap='".$n[1]."'"); + + } + + if($usun) + + { + + echo('


    Plik zostało usunięty

    '); + + unlink ($n[0]); + + + + + + } + + else + + echo('


    Nie mozna było usun±ć pliku

    '); + + } + + BREAK; + + case "edytuj": + + if(!is_numeric($_GET['id_rap'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_raporty'])) + + form_edytuj_raporty($_GET['id_rap']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miejscowosc']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_raporty($_GET['id_rap']); + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $przystapiono=$_POST['przystapiono']; + + $zrobiony=$_POST['zrobiony']; + + $edytuj_raporty=mysql_query("update raporty SET id_akc='".$_POST['akcja']."',id_ban='".$_POST['bank']."',nrzlecenia='".$_POST['nrzlecenia']."',ulica='".$_POST['ulica']."',miejscowosc='".$_POST['miejscowosc']."',id_ban='".$_POST['bank']."',nrseryjny='".$_POST['nrseryjny']."',typ='".$_POST['typ']."',data='".$_POST['data']."',godzwyj='".$_POST['godzwyj']."',godzroz='".$_POST['godzroz']."',godzzak='".$_POST['godzzak']."',godzprzy='".$_POST['godzprzy']."',uwagi='".$_POST['uwagi']."',dopuszczony='".$dopuszczony."',przystapiono='".$przystapiono."',zrobiony='".$zrobiony."' where id_rap='".$_GET['id_rap']."'"); + + if($edytuj_raporty) + + { + + + +$id2 = $_GET['id_rap']; + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + uwaga('


    Nie mozna było wprowadzić zmian!!!

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj": + +if(!isset($_POST['dodaj_raport'])) + + form_dodaj_raport(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if (((strlen(trim($_POST['id_akc'])==16))) AND ((strlen(trim($_POST['id_ban'])==20)))) + + { + + if (!sprawdz_date($_POST['data'])) + + $blad.=('

    Musisz wprowadzic date - RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport(); + + } + + else + + { + + + + $dodaj_raport=mysql_query("insert into raporty values('','16','20','".$_SESSION['id']."','---','1','1','1','Cieslewskich 25a','Warszawa','---','---','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + + if($dodaj_raport) + + { + + uwaga('

    Raport został dodany

    '); + + } + + else + + { + + uwaga('


    Nie można było dodać Raportu

    '); + + } + + } + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $zrobiony=$_POST['zrobiony']; + + $przystapiono=$_POST['przystapiono']; + if ($dopuszczony==2) + + $blad.=('

    Nie wybrano pola Dopuszczono
    '); + + if ($zrobiony==2) + + $blad.=('
    Nie wybrano pola Zrobiono
    '); + + if ($przystapiono==2) + + $blad.=('
    Nie wybrano pola Podjazd
    '); + + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('
    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport(); + + } + + else + + { + + $dopuszczony=$_POST['dopuszczony']; + + $zrobiony=$_POST['zrobiony']; + + $przystapiono=$_POST['przystapiono']; + + + + $dodaj_raport=mysql_query("insert into raporty values('','".$_POST['id_akc']."','".$_POST['id_ban']."','".$_SESSION['id']."','".$_POST['nrzlecenia']."','".$dopuszczony."','".$zrobiony."','".$przystapiono."','".$_POST['ulica']."','".$_POST['miasto']."','".$_POST['nrseryjny']."','".$_POST['typ']."','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + +$id2 = mysql_insert_id(); + + if($dodaj_raport) + + { + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + uwaga('

    Raport został dodany

    '); + + } + + else + + uwaga('


    Nie można było dodać Raportu

    '); + + } + + }//else + +} + + break; + + case "show": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data>='".$data2."' and a.data<='".$data."' order by a.data DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_raporty": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.ulica like '%".$_POST['ulica']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and c.akcja like '%".$_POST['akcja']."%' and d.bank like '%".$_POST['bank']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and a.ulica like '%".$_POST['ulica']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and c.akcja like '%".$_POST['akcja']."%' and a.nrseryjny like '%".$_POST['nrseryjny']."%' and d.bank like '%".$_POST['bank']."%' and a.miejscowosc like '%".$_POST['miasto']."%' and a.ulica like '%".$_POST['ulica']."%' and a.typ like '%".$_POST['typ']."%' and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + + form_szukaj_raport() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataNr ZleceniaAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + } //switch + + } //if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + + else + + { + +echo ' + + + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "usun_admin": + + if(!is_numeric($_GET['id_rap'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update raporty SET usun='1' where id_rap='".$_GET['id_rap']."'"); + + if($usun) + + echo('


    Raport zostało usunięty

    '); + + else + + echo('


    Nie mozna było usun±ć Raportu

    '); + + } + + BREAK; + + case "usun_plik": + + if(!is_numeric($_GET['id_pr'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_rap from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from raporty_pliki where id_pr='".$_GET['id_pr']."'"); + + $zapytanie2=mysql_query("select id_rap from raporty_pliki where id_rap='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update raporty SET plik='0' where id_rap='".$n[1]."'"); + + } + + if($usun) + + { + + echo('

    Plik zostało usunięte!!!

    '); + + unlink ($n[0]); + + + + + + } + + else + + echo('

    Nie mozna było usun±ć + + pliku!!!

    '); + + } + + BREAK; + + + + case "pokaz_admin": + + form_pokaż_raporty($_GET['id_rap']); + + BREAK; + + case "edytuj_admin": + + if(!is_numeric($_GET['id_rap'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_raporty_admin'])) + + form_edytuj_raporty_admin($_GET['id_rap']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miejscowosc']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_raporty_admin($_GET['id_rap']); + + } + + else + + { + + $edytuj_raporty_admin=mysql_query("update raporty SET id_akc='".$_POST['akcja']."',id_ban='".$_POST['bank']."',nrzlecenia='".$_POST['nrzlecenia']."',ulica='".$_POST['ulica']."',miejscowosc='".$_POST['miejscowosc']."',id_ban='".$_POST['bank']."',nrseryjny='".$_POST['nrseryjny']."',typ='".$_POST['typ']."',data='".$_POST['data']."',godzwyj='".$_POST['godzwyj']."',godzroz='".$_POST['godzroz']."',godzzak='".$_POST['godzzak']."',id='".$_POST['id']."',godzprzy='".$_POST['godzprzy']."',uwagi='".$_POST['uwagi']."',dopuszczony='".$dopuszczony."',przystapiono='".$przystapiono."',zrobiony='".$zrobiony."' where id_rap='".$_GET['id_rap']."'"); + + + + if($edytuj_raporty_admin) + + { + + + +$id2 = $_GET['id_rap']; + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET wyslano='0',plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_admin": + + + + if(!isset($_POST['dodaj_raporty_admin'])) + + form_dodaj_raport_admin(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['nrzlecenia']))==0) + + $blad.=('

    Nie podano nr zlecenia!!!
    '); if(strlen(trim($_POST['ulica']))==0) + + $blad.=('
    Nie podano ulicy!!!
    '); if(strlen(trim($_POST['miasto']))==0) + + $blad.=('
    Nie podano miasta!!!
    '); if(strlen(trim($_POST['nrseryjny']))==0) + + $blad.=('
    Nie podano nr seryjnego!!!
    '); if(strlen(trim($_POST['typ']))==0) + + $blad.=('
    Nie podano typu bankomatu!!!
    '); if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(strlen(trim($_POST['godzwyj']))==0) + + $blad.=('
    Nie podano godziny wyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzwyj'])) + + $blad.=('
    Zła forma godziny wyjazdu HH:MM !!!
    '); + + if(strlen(trim($_POST['godzroz']))==0) + + $blad.=('
    Nie podano godziny rozpoczęcia!!!
    '); + + else if (!sprawdz_czas($_POST['godzroz'])) + + $blad.=('
    Zła forma godziny rozpoczęcia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzzak']))==0) + + $blad.=('
    Nie podano godziny zakończenia!!!
    '); + + else if (!sprawdz_czas($_POST['godzzak'])) + + $blad.=('
    Zła forma godziny zakończenia HH:MM !!!
    '); + + if(strlen(trim($_POST['godzprzy']))==0) + + $blad.=('
    Nie podano godziny przyjazdu!!!
    '); + + else if (!sprawdz_czas($_POST['godzprzy'])) + + $blad.=('
    Zła forma godziny przyjazdu HH:MM !!!
    '); + + if($blad) + + { + + uwaga($blad); + + form_dodaj_raport_admin(); + + } + + else + + { + + $dodaj_kilometry_admin=mysql_query("insert into raporty values('','".$_POST['id_akc']."','".$_POST['id_ban']."','".$_POST['id']."','".$_POST['nrzlecenia']."','".$dopuszczony."','".$zrobiony."','".$przystapiono."','".$_POST['ulica']."','".$_POST['miasto']."','".$_POST['nrseryjny']."','".$_POST['typ']."','".$_POST['data']."','".$_POST['godzwyj']."','".$_POST['godzroz']."','".$_POST['godzzak']."','".$_POST['godzprzy']."','".$_POST['uwagi']."','0','0','0')"); + + + +$id2 = mysql_insert_id(); + + if($dodaj_kilometry_admin) + + { + + + +//--------------------- uplad ----------------------- + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik2']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik2']['type']; // typ pliku + +$p_nazwa=$_FILES['plik2']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik2']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik2']['type']=="image/pjpeg") OR ($_FILES['plik2']['type']=="image/jpeg") OR ($_FILES['plik2']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik3']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik3']['type']; // typ pliku + +$p_nazwa=$_FILES['plik3']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik3']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik3']['type']=="image/pjpeg") OR ($_FILES['plik3']['type']=="image/jpeg") OR ($_FILES['plik3']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik4']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik4']['type']; // typ pliku + +$p_nazwa=$_FILES['plik4']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik4']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik4']['type']=="image/pjpeg") OR ($_FILES['plik4']['type']=="image/jpeg") OR ($_FILES['plik4']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +$p_pojemnosc=$_FILES['plik5']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik5']['type']; // typ pliku + +$p_nazwa=$_FILES['plik5']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik5']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="raporty/"; + +if (($_FILES['plik5']['type']=="image/pjpeg") OR ($_FILES['plik5']['type']=="image/jpeg") OR ($_FILES['plik5']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przesłanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into raporty_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update raporty SET plik='1' where id_rap='".$id2."'"); + + } + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 2 Mb
    '); + +} + +} + +//--------------------- koniecupload ------------ + + + + + + uwaga('

    Raport został dodany

    '); + + } + + else + + uwaga('


    Nie można było wprowadzić zmian

    '); + + } + + }//else + + break; + + case "show_admin": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' order by a.data desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + $lp = $lp + 1; + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show_admin2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.id_rap,a.data,a.plik,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.data>='".$data2."' and a.data<='".$data."' order by a.data desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_raport_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + $lp = $lp + 1; + + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_raporty_admin": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and + a.id_ban=d.id_ban + and a.usun='0' + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and + + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + or d.bank like '".$_POST['bank38']."') + + +) + and a.ulica like '%".$_POST['ulica']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."' + or a.id like '".$_POST['id21']."' + or a.id like '".$_POST['id22']."' + or a.id like '".$_POST['id23']."' + or a.id like '".$_POST['id24']."' + or a.id like '".$_POST['id25']."' + or a.id like '".$_POST['id26']."' + or a.id like '".$_POST['id27']."' + or a.id like '".$_POST['id28']."' + or a.id like '".$_POST['id29']."' + or a.id like '".$_POST['id30']."' + or a.id like '".$_POST['id31']."' + or a.id like '".$_POST['id32']."' + or a.id like '".$_POST['id33']."' + or a.id like '".$_POST['id34']."' + or a.id like '".$_POST['id35']."' + or a.id like '".$_POST['id36']."' + or a.id like '".$_POST['id37']."' + or a.id like '".$_POST['id38']."' + or a.id like '".$_POST['id39']."' + or a.id like '".$_POST['id40']."' + + ) + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + + + ) + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + else + + { + + if ($_POST['id']<>0) + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.data >= '".$_POST['data1']."' + and a.data <= '".$_POST['data2']."' + + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + or d.bank like '".$_POST['bank37']."' + + + ) + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + + + } + + else + + { + + $pobierz_userow=mysql_query("select a.plik,a.id_rap,a.data,a.nrzlecenia,b.nazwisko,b.imie,c.akcja,d.bank,a.ulica,a.miejscowosc,a.nrseryjny,a.typ,a.dopuszczony,a.zrobiony,a.przystapiono from raporty a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' + and a.data >= '".$_POST['data1']."' + and a.data <= '".$_POST['data2']."' + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."' + or a.id like '".$_POST['id21']."' + or a.id like '".$_POST['id22']."' + or a.id like '".$_POST['id23']."' + or a.id like '".$_POST['id24']."' + or a.id like '".$_POST['id25']."' + or a.id like '".$_POST['id26']."' + or a.id like '".$_POST['id27']."' + or a.id like '".$_POST['id28']."' + or a.id like '".$_POST['id29']."' + or a.id like '".$_POST['id30']."' + or a.id like '".$_POST['id31']."' + or a.id like '".$_POST['id32']."' + or a.id like '".$_POST['id33']."' + or a.id like '".$_POST['id34']."' + or a.id like '".$_POST['id35']."' + or a.id like '".$_POST['id36']."' + or a.id like '".$_POST['id37']."' + or a.id like '".$_POST['id38']."' + or a.id like '".$_POST['id39']."' + or a.id like '".$_POST['id40']."') + + + and + (c.akcja like '".$_POST['akcja4']."' + or c.akcja like '".$_POST['akcja5']."' + or c.akcja like '".$_POST['akcja6']."' + or c.akcja like '".$_POST['akcja7']."' + or c.akcja like '".$_POST['akcja8']."' + or c.akcja like '".$_POST['akcja9']."' + or c.akcja like '".$_POST['akcja10']."' + or c.akcja like '".$_POST['akcja11']."' + or c.akcja like '".$_POST['akcja12']."' + or c.akcja like '".$_POST['akcja13']."' + or c.akcja like '".$_POST['akcja14']."' + or c.akcja like '".$_POST['akcja15']."' + or c.akcja like '".$_POST['akcja16']."' + or c.akcja like '".$_POST['akcja17']."' + or c.akcja like '".$_POST['akcja18']."' + or c.akcja like '".$_POST['akcja19']."' + or c.akcja like '".$_POST['akcja20']."' + or c.akcja like '".$_POST['akcja21']."' + or c.akcja like '".$_POST['akcja22']."' + or c.akcja like '".$_POST['akcja23']."' + or c.akcja like '".$_POST['akcja24']."' + or c.akcja like '".$_POST['akcja25']."' + or c.akcja like '".$_POST['akcja26']."' + or c.akcja like '".$_POST['akcja27']."' + or c.akcja like '".$_POST['akcja28']."' + or c.akcja like '".$_POST['akcja29']."' + or c.akcja like '".$_POST['akcja30']."' + or c.akcja like '".$_POST['akcja31']."' + or c.akcja like '".$_POST['akcja32']."' + or c.akcja like '".$_POST['akcja33']."' + or c.akcja like '".$_POST['akcja34']."' + or c.akcja like '".$_POST['akcja35']."' + or c.akcja like '".$_POST['akcja36']."' + or c.akcja like '".$_POST['akcja37']."' + or c.akcja like '".$_POST['akcja38']."' + or c.akcja like '".$_POST['akcja39']."' + or c.akcja like '".$_POST['akcja40']."' + or c.akcja like '".$_POST['akcja41']."') + + and a.nrseryjny like '%".$_POST['nrseryjny']."%' + and + (d.bank like '".$_POST['bank4']."' + or d.bank like '".$_POST['bank5']."' + or d.bank like '".$_POST['bank6']."' + or d.bank like '".$_POST['bank7']."' + or d.bank like '".$_POST['bank8']."' + or d.bank like '".$_POST['bank9']."' + or d.bank like '".$_POST['bank10']."' + or d.bank like '".$_POST['bank11']."' + or d.bank like '".$_POST['bank12']."' + or d.bank like '".$_POST['bank13']."' + or d.bank like '".$_POST['bank14']."' + or d.bank like '".$_POST['bank15']."' + or d.bank like '".$_POST['bank16']."' + or d.bank like '".$_POST['bank17']."' + or d.bank like '".$_POST['bank18']."' + or d.bank like '".$_POST['bank19']."' + or d.bank like '".$_POST['bank20']."' + or d.bank like '".$_POST['bank21']."' + or d.bank like '".$_POST['bank22']."' + or d.bank like '".$_POST['bank23']."' + or d.bank like '".$_POST['bank24']."' + or d.bank like '".$_POST['bank25']."' + or d.bank like '".$_POST['bank26']."' + or d.bank like '".$_POST['bank27']."' + or d.bank like '".$_POST['bank28']."' + or d.bank like '".$_POST['bank29']."' + or d.bank like '".$_POST['bank30']."' + or d.bank like '".$_POST['bank31']."' + or d.bank like '".$_POST['bank32']."' + or d.bank like '".$_POST['bank33']."' + or d.bank like '".$_POST['bank34']."' + or d.bank like '".$_POST['bank35']."' + or d.bank like '".$_POST['bank36']."' + + + ) + and a.miejscowosc like '%".$_POST['miasto']."%' + and a.ulica like '%".$_POST['ulica']."%' + and a.typ like '%".$_POST['typ']."%' + and a.nrzlecenia like '%".$_POST['zlecenie']."%' order by a.data desc"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + //$_POST['data1']=''; + + //$_POST['data2']=''; + + $_POST['nrzlecenia']=''; + + $_POST['akcja']=''; + + $_POST['bank']=''; + + $_POST['ulica']=''; + + $_POST['miasto']=''; + + $_POST['nrseryjny']=''; + + $_POST['typ']=''; + + form_szukaj_raport_admin(); + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + $color=zmien_color($color); + $lp = $lp + 1; + $banki=$banki+1 ; + if(strlen(trim($u['dopuszczony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $dopuszczony=''; + + if(strlen(trim($u['zrobiony'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $zrobiony=''; + + if(strlen(trim($u['przystapiono'])==1)) + + $nazwa='tak'; + + else + + $nazwa='nie'; + + $przystapiono=''; if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    LpDataNr ZleceniaInżynierAkcjaBankUlicaMiastoNr SeryjnyTypDPZPlikiOpcje
    '.$lp.'
    '.$u['data'].'
    '.$u['nrzlecenia'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$u['ulica'].'
    '.$u['miejscowosc'].'
    '.$u['nrseryjny'].'
    '.$u['typ'].'
    '.$dopuszczony.'
    '.$przystapiono.'
    '.$zrobiony.'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "eksport_raport": + + eksport_raport_pm(); + + eksport_raport_all(); + + BREAK; + + + + } //switch + + } //if + +} + + + +} + + + +?> + diff --git a/samochod.old b/samochod.old new file mode 100644 index 0000000..20cefcb --- /dev/null +++ b/samochod.old @@ -0,0 +1,461 @@ + + + + + + + +

    '; + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + { + switch($_GET['kto']) + { + + + + + + case "edytuj_samochod": + if(!is_numeric($_GET['id_sam'])) + uwaga(BLAD. ' Brak danych!'); + else + { + if(!isset($_POST['edytuj_samochod'])) + form_edytuj_samochod($_GET['id_sam']); + else + { + $blad=''; + if(strlen(trim($_POST['auto']))==0) + $blad.=('

    Musisz podać nazwę auta!!!
    '); + if(strlen(trim($_POST['nr_rej']))==0) + $blad.=('
    Musisz podać nr rejestracji!!!
    '); + if(strlen(trim($_POST['rok_auta']))==0) + $blad.=('
    Nie podano roku auta!!!
    '); else if (!sprawdz_rok($_POST['rok_auta'])) + $blad.=('
    Zła forma daty RRRR - rok zakupu!!!
    '); + if(strlen(trim($_POST['data_zakupu']))==0) + $blad.=('
    Nie podano daty zakupu auta!!!
    '); + else if (!sprawdz_date($_POST['data_zakupu'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - data zakupu!!!
    '); + if(strlen(trim($_POST['ocac']))==0) + $blad.=('
    Nie podano OC!!!
    '); + else if (!sprawdz_date($_POST['ocac'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - OC!!!
    '); if(strlen(trim($_POST['ocac2']))==0) + $blad.=('
    Nie podano AC!!!
    '); + else if (!sprawdz_date($_POST['ocac2'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - AC!!!
    '); + if(strlen(trim($_POST['przeglad']))==0) + $blad.=('
    Nie podano daty przegl±du +!!!
    '); + else if (!sprawdz_date($_POST['przeglad'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - przegl±d!!!
    '); + + // koniec sprawdzania danych + if($blad) + { + uwaga($blad); + form_edytuj_samochod($_GET['id_sam']); + } + else + { + $edytuj_samochod=mysql_query("update samochody SET auto='".$_POST['auto']."',nr_rej='".$_POST['nr_rej']."',rok_auta='".$_POST['rok_auta']."',rok_zakupu='".$_POST['data_zakupu']."',ocac='".$_POST['ocac']."',ocac2='".$_POST['ocac2']."',przeglad='".$_POST['przeglad']."',uwagi='".$_POST['uwagi']."',id='".$_POST['id']."',id_ube='".$_POST['id_ube']."' where id_sam='".$_GET['id_sam']."'"); + if($edytuj_samochod) + uwaga('

    Zmiany zostały wprowadzone

    '); + else + uwaga('


    Nie mozna było wprowadzić zmian

    +'); + } + }//else + } //else + BREAK; + case "edytuj_naprawe": + if(!is_numeric($_GET['id_nap'])) + uwaga(BLAD. ' Brak danych!'); + else + { + if(!isset($_POST['edytuj_naprawe'])) + form_edytuj_naprawe($_GET['id_nap']); + else + { + $blad=''; + if(strlen(trim($_POST['data_naprawy']))==0) + $blad.=('

    Nie podano daty naprawy!!!
    '); else if (!sprawdz_date($_POST['data_naprawy'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - data naprawy!!!
    '); + if(strlen(trim($_POST['naprawa']))==0) + $blad.=('
    Nie wprowadzono rodzaju naprawy!!!
    '); + if(strlen(trim($_POST['lokalizacja']))==0) + $blad.=('
    Nie podano lokalizacji +!!!
    '); + if(strlen(trim($_POST['koszt']))==0) + $blad.=('
    Nie podano kosztu!!!
    '); else if (!sprawdz_koszt($_POST['koszt'])) + $blad.=('
    Zła forma kosztu XX.XX!!!
    '); + + // koniec sprawdzania danych + if($blad) + { + uwaga($blad); + form_edytuj_naprawe($_GET['id_nap']); + } + else + { + $edytuj_samochod=mysql_query("update naprawa SET data_naprawy='".$_POST['data_naprawy']."',naprawa='".$_POST['naprawa']."',lokalizacja='".$_POST['lokalizacja']."',koszt='".$_POST['koszt']."',id_sam='".$_POST['id_sam']."' where id_nap='".$_GET['id_nap']."'"); + $id2 = $_GET['id_nap']; + if($edytuj_naprawe) + { +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku +$p_typ=$_FILES['plik1']['type']; // typ pliku +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + +$p_roz= array_pop(explode(".", $p_nazwa)); + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); +$liczba = $losowa + $p_pojemnosc; +$p_nazwa_zm=(md5($liczba)).".".$p_roz; +$folder="naprawa/"; +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + $path_file=$folder.$p_nazwa_zm; + $zapytanie=mysql_query("insert into naprawa_pliki values('','.$id2.','$path_file')"); + $zapytanie2=mysql_query("update naprawa SET plik='1' where id_nap='".$id2."'"); +} +else +{ +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); +} +} + + uwaga('

    Zmiany zostały wprowadzone

    '); + } + else + uwaga('


    Nie mozna było wprowadzić zmian

    + + +'); + } + }//else + } //else + BREAK; + case "usun_plik": + if(!is_numeric($_GET['id_pn'])) + uwaga('Brak danych!'); + else + { + $usun_plik=mysql_query("select nazwa,id_nap from naprawa_pliki where id_pn='".$_GET['id_pn']."'"); + $n=mysql_fetch_array($usun_plik); + $usun=mysql_query("delete from naprawa_pliki where id_pn='".$_GET['id_pn']."'"); + $zapytanie2=mysql_query("select id_nap from naprawa_pliki where id_nap='".$n[1]."'"); + $z=mysql_fetch_array($zapytanie2); + if ($z[0]==0) + { + $zapytanie3=mysql_query("update naprawa SET plik='0' where id_nap='".$n[1]."'"); + } + if($usun) + { + echo('


    Plik zostało usunięty

    +'); + unlink ($n[0]); + + + } + else + echo('


    Nie mozna było usun±ć pliku

    '); + } + BREAK; + + case "usun_samochod": + if(!is_numeric($_GET['id_sam'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("delete from samochody where id_sam='".$_GET['id_sam']."'"); + if($usun) + echo('


    Samochód został usunięty

    '); + else + echo('


    Nie mozna było usun±ć Samochodu

    '); + } + BREAK; + case "usun_naprawe": + if(!is_numeric($_GET['id_nap'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("delete from naprawa where id_nap='".$_GET['id_nap']."'"); + if($usun) + echo('


    Naprawa została usunięta

    '); + else + echo('


    Nie mozna było usun±ć Naprawy

    '); + } + BREAK; + case "pokaz_samochod": + form_pokaż_samochod($_GET['id_sam']); + BREAK; + case "pokaz_naprawe": + form_pokaż_naprawe($_GET['id_nap']); + BREAK; + case "dodaj_samochod": + + if(!isset($_POST['dodaj_samochod'])) + form_dodaj_samochod(); // jezeli nie probowano dodac usera to wyswietla formularz + + else + { + // sprawdzanie formularza + $blad=''; + if(strlen(trim($_POST['auto']))==0) + $blad.=('

    Musisz podać nazwę auta!!!
    '); + if(strlen(trim($_POST['nr_rej']))==0) + $blad.=('
    Musisz podać nr rejestracji!!!
    '); + if(strlen(trim($_POST['rok_auta']))==0) + $blad.=('
    Nie podano roku auta!!!
    '); else if (!sprawdz_rok($_POST['rok_auta'])) + $blad.=('
    Zła forma daty RRRR - rok zakupu!!!
    '); + if(strlen(trim($_POST['data_zakupu']))==0) + $blad.=('
    Nie podano daty zakupu auta!!!
    '); + else if (!sprawdz_date($_POST['data_zakupu'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - data zakupu!!!
    '); + if(strlen(trim($_POST['oc']))==0) + $blad.=('
    Nie podano OC!!!
    '); + else if (!sprawdz_date($_POST['oc'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - OC!!!
    '); if(strlen(trim($_POST['ac']))==0) + $blad.=('
    Nie podano AC!!!
    '); + else if (!sprawdz_date($_POST['ac'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - AC!!!
    '); + if(strlen(trim($_POST['przeglad']))==0) + $blad.=('
    Nie podano daty przegl±du +!!!
    '); + else if (!sprawdz_date($_POST['przeglad'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - przegl±d!!!
    '); + + // koniec sprawdzania danych + if($blad) + { + uwaga($blad); + form_dodaj_samochod(); + } + else + { + $dodaj_samochod=mysql_query("insert into samochody values('','".$_POST['auto']."','".$_POST['nr_rej']."','".$_POST['przypisany']."','".$_POST['rok_auta']."','".$_POST['data_zakupu']."','".$_POST['oc']."','".$_POST['ac']."','".$_POST['ubezpieczenia']."','".$_POST['przeglad']."','".$_POST['uwagi']."','0')"); + if($dodaj_samochod) + uwaga('

    Samochod został dodany

    '); + else + uwaga('


    Nie można było dodać Samochodu

    +'); + } + }//else + break; + + + case "dodaj_naprawe": + + if(!isset($_POST['dodaj_naprawe'])) + form_dodaj_naprawe(); // jezeli nie probowano dodac usera to wyswietla formularz + + else + { + // sprawdzanie formularza + $blad=''; + if(strlen(trim($_POST['data_naprawy']))==0) + $blad.=('

    Nie podano daty naprawy!!!
    '); else if (!sprawdz_date($_POST['data_naprawy'])) + $blad.=('
    Zła forma daty RRRR-MM-DD - data naprawy!!!
    '); + if(($_POST['id_sam'])==0) + $blad.=('
    Nie wybrano samochodu!!!
    '); + if(strlen(trim($_POST['naprawa']))==0) + $blad.=('
    Nie wprowadzono rodzaju naprawy!!!
    '); + if(strlen(trim($_POST['lokalizacja']))==0) + $blad.=('
    Nie podano lokalizacji +!!!
    '); + if(strlen(trim($_POST['koszt']))==0) + $blad.=('
    Nie podano kosztu!!!
    '); else if (!sprawdz_koszt($_POST['koszt'])) + $blad.=('
    Zła forma kosztu XX.XX!!!
    '); + + // koniec sprawdzania danych + if($blad) + { + uwaga($blad); + form_dodaj_naprawe(); + } + else + { + $dodaj_samochod=mysql_query("insert into naprawa values('','".$_POST['data_naprawy']."','".$_POST['id_sam']."','".$_POST['naprawa']."','".$_POST['lokalizacja']."','".$_POST['koszt']."','0')"); + $id2 = mysql_insert_id(); + if($dodaj_samochod) + { +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku +$p_typ=$_FILES['plik1']['type']; // typ pliku +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + +$p_roz= array_pop(explode(".", $p_nazwa)); + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; +$losowa = rand(1,100000000); +$liczba = $losowa + $p_pojemnosc; +$p_nazwa_zm=(md5($liczba)).".".$p_roz; +$folder="naprawa/"; +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + $path_file=$folder.$p_nazwa_zm; + $zapytanie=mysql_query("insert into naprawa_pliki values('','.$id2.','$path_file')"); + $zapytanie2=mysql_query("update naprawa SET plik='1' where id_nap='".$id2."'"); +} +else +{ +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); +} +} + uwaga('

    Naprawa została dodanana

    '); + + } + else + uwaga('


    Nie można było dodać Naprawy

    '); + } + }//else + break; + + + + case "show_samochod": + // pobieranie userów + $data1=date("Y-m-d",strtotime("-7 days",time())); + $pobierz_samochod=mysql_query("select a.id_sam,a.auto,a.nr_rej,b.imie,b.nazwisko,a.rok_auta,a.rok_zakupu,a.ocac,a.ocac2,c.ubezpieczenia,a.przeglad from samochody a,uzytkownicy b,ubezpieczenia c where a.id=b.id and a.id_ube=c.id_ube order by a.auto asc"); + if(mysql_num_rows($pobierz_samochod)==0) + uwaga('


    W bazie nie ma żadnych wproadzonych samochodów!!!

    '); + else + { + $color=$color1; + + echo '

    '; + while($u=mysql_fetch_array($pobierz_samochod)) + { + + $color=zmien_color($color); + $opcje1='Pokaż | '; + $opcje2='Edytuj | '; + $opcje2.='Usuń'; + $data2 = $u['przeglad']; + if ($data2 <= $data1) + { + $color='#FCA1A1'; + } + $sql=mysql_query("SELECT kmstop FROM kilometry where id_sam='".$u['id_sam']."' ORDER BY kmstop DESC LIMIT 1"); + + while($a=mysql_fetch_array($sql)) + { + $kmstop = $a['kmstop']; + } + + + echo '' ; + } + + echo '
    Nazwa autaNr rejest.PrzypisanyRok autaData zakupuOCACUbezpieczycielPrzegl±dStan kmOpcje
    '.$u['auto'].'
    '.$u['nr_rej'].'
    '.$u['imie'].' '.$u['nazwisko'].'
    '.$u['rok_auta'].'
    '.$u['rok_zakupu'].'
    '.$u['ocac'].'
    '.$u['ocac2'].'
    '.$u['ubezpieczenia'].'
    '.$u['przeglad'].'
    '.$kmstop.' km
    '.$opcje1.''.$opcje2.'
    '; + } + BREAK; + case "szukaj_samochod": + // pobieranie userów + $pobierz_samochod=mysql_query("select a.id_sam,a.auto,a.nr_rej,b.imie,b.nazwisko,a.rok_auta,a.rok_zakupu,a.ocac,c.ubezpieczenia,a.przeglad from samochody a,uzytkownicy b,ubezpieczenia c where a.id=b.id and a.id_ube=c.id_ube and a.auto like'%".$_POST['auto']."%' and a.nr_rej like'%".$_POST['nrrej']."%' and a.rok_auta like'%".$_POST['rokauta']."%' and a.id_ube='".$_POST['id_ube']."' order by a.auto asc"); + if(mysql_num_rows($pobierz_samochod)==0) + uwaga('

    W bazie nie ma żadnych wproadzonych samochodów!!!

    '); + else + { + $color=$color1; + echo '

    '; + while($u=mysql_fetch_array($pobierz_samochod)) + { + $sql=mysql_query("SELECT kmstop FROM kilometry where id_sam='".$u['id_sam']."' ORDER BY kmstop DESC LIMIT 1"); + while($a=mysql_fetch_array($sql)) + { + $color=zmien_color($color); + $opcje1='Pokaż | '; + $opcje2='Edytuj | '; + $opcje2.='Usuń'; + echo '' ; + } + } + echo '
    Nazwa autaNr rejest.PrzypisanyRok autaData zakupuOC/ACUbezpieczycielPrzegl±dOpcje
    '.$u['auto'].'
    '.$u['nr_rej'].'
    '.$u['imie'].' '.$u['nazwisko'].'
    '.$u['rok_auta'].'
    '.$u['rok_zakupu'].'
    '.$u['ocac'].'
    '.$u['ubezpieczenia'].'
    '.$a['kmstop'].' km
    '.$opcje1.''.$opcje2.'
    '; + } + BREAK; + case "show_naprawa": + // pobieranie userów + $pobierz_naprawe=mysql_query("select a.id_nap,a.plik,a.data_naprawy,b.auto,b.nr_rej,a.naprawa,a.lokalizacja,a.koszt from naprawa a,samochody b where a.id_sam=b.id_sam order by a.data_naprawy desc"); + if(mysql_num_rows($pobierz_naprawe)==0) + uwaga('

    W bazie nie ma żadnych wprowadzonej naprawy!!!

    '); + else + { + $color=$color1; +form_szukaj_naprawe(); + $zapytanie=mysql_query("select sum(koszt) as koszt from naprawa"); + $z= mysql_fetch_array($zapytanie); + echo '

    '; + echo '
    '; + echo "Suma kwoty napraw: ".$z[koszt]. " PLN

    "; + echo '
    '; + echo '
    '; + while($u=mysql_fetch_array($pobierz_naprawe)) + { + if(strlen(trim($u['plik'])==1)) + $plik='JEST'; + else + $plik='BRAK'; + $naprawa = str_split($u['naprawa'], 35); + $color=zmien_color($color); + $opcje1='Pokaż | '; + $opcje2='Edytuj | '; + $opcje2.='Usuń'; + echo '' ; + } + echo '
    Data naprawyNazwa autaRodzaj naprawyLokalizacjaKosztPlikiOpcje
    '.$u['data_naprawy'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$naprawa[0].'...
    '.$u['lokalizacja'].'
    '.$u['koszt'].' PLN
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + } + BREAK; + case "szukaj_naprawe": + // pobieranie userów + $pobierz_naprawe=mysql_query("select a.id_nap,a.data_naprawy,a.plik,b.auto,b.nr_rej,a.naprawa,a.lokalizacja,a.koszt from naprawa a,samochody b where a.id_sam=b.id_sam and a.data_naprawy like '%".$_POST['data']."%' and b.nr_rej like '%".$_POST['nr_rej']."%' and a.lokalizacja like '%".$_POST['lokalizacja']."%' order by a.data_naprawy desc"); + if(mysql_num_rows($pobierz_naprawe)==0) + uwaga('

    W bazie nie ma żadnych wprowadzonej naprawy!!!

    +'); + else + { + $color=$color1; + $_POST['data']=''; + $_POST['nr_rej']=''; + $_POST['lokalizacja']=''; + form_szukaj_naprawe(); + + echo '

    '; + while($u=mysql_fetch_array($pobierz_naprawe)) + { + if(strlen(trim($u['plik'])==1)) + $plik='JEST'; + else + $plik='BRAK'; + $naprawa2 = str_split($u['naprawa'], 35); + $color=zmien_color($color); + $opcje1='Pokaż | '; + $opcje2='Edytuj | '; + $opcje2.='Usuń'; + echo '' ; + } + $zapytanie=mysql_query("select sum(a.koszt) as koszt from naprawa a,samochody b where a.id_sam=b.id_sam and b.nr_rej like '%".$_POST['nr_rej']."%'"); + $z= mysql_fetch_array($zapytanie); + echo '
    Data naprawyNazwa autaRodzaj naprawyLokalizacjaKosztPlikiOpcje
    '.$u['data_naprawy'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$naprawa2[0].'...
    '.$u['lokalizacja'].'
    '.$u['koszt'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + echo '
    '; + echo "Suma kwoty napraw: ".$z[koszt]. " PLN"; + echo '
    '; + echo ''; + } + BREAK; + } //switch + } //if + +?> diff --git a/samochod.php b/samochod.php new file mode 100644 index 0000000..4fec864 --- /dev/null +++ b/samochod.php @@ -0,0 +1,979 @@ + + + + + + + + + + + + + + +

    '; + + + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + + + + + + + + + + + case "edytuj_samochod": + + if(!is_numeric($_GET['id_sam'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_samochod'])) + + form_edytuj_samochod($_GET['id_sam']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['auto']))==0) + + $blad.=('

    Musisz podać nazwę auta!!!
    '); + + if(strlen(trim($_POST['nr_rej']))==0) + + $blad.=('
    Musisz podać nr rejestracji!!!
    '); + + if(strlen(trim($_POST['rok_auta']))==0) + + $blad.=('
    Nie podano roku auta!!!
    '); else if (!sprawdz_rok($_POST['rok_auta'])) + + $blad.=('
    Zła forma daty RRRR - rok zakupu!!!
    '); + + if(strlen(trim($_POST['data_zakupu']))==0) + + $blad.=('
    Nie podano daty zakupu auta!!!
    '); + + else if (!sprawdz_date($_POST['data_zakupu'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - data zakupu!!!
    '); + + if(strlen(trim($_POST['ocac']))==0) + + $blad.=('
    Nie podano OC!!!
    '); + + else if (!sprawdz_date($_POST['ocac'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - OC!!!
    '); if(strlen(trim($_POST['ocac2']))==0) + + + + if(strlen(trim($_POST['olej']))==0) + + $blad.=('
    Zła forma KM!!!
    '); + + if(strlen(trim($_POST['przeglad']))==0) + + $blad.=('
    Nie podano daty przegl±du + +!!!
    '); + + else if (!sprawdz_date($_POST['przeglad'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - przegl±d!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_samochod($_GET['id_sam']); + + } + + else + + { + + $edytuj_samochod=mysql_query("update samochody SET auto='".$_POST['auto']."',nr_rej='".$_POST['nr_rej']."',rok_auta='".$_POST['rok_auta']."',rok_zakupu='".$_POST['data_zakupu']."',ocac='".$_POST['ocac']."',ocac2='".$_POST['olej']."',przeglad='".$_POST['przeglad']."',uwagi='".$_POST['uwagi']."',id='".$_POST['id']."',id_ube='".$_POST['id_ube']."',status='".$_POST['status']."' where id_sam='".$_GET['id_sam']."'"); + + if($edytuj_samochod) + + uwaga('

    Zmiany zostały wprowadzone

    '); + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    + +'); + + } + + }//else + + } //else + + BREAK; + + case "edytuj_naprawe": + + if(!is_numeric($_GET['id_nap'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_naprawe'])) + + form_edytuj_naprawe($_GET['id_nap']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data_naprawy']))==0) + + $blad.=('

    Nie podano daty naprawy!!!
    '); else if (!sprawdz_date($_POST['data_naprawy'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - data naprawy!!!
    '); + + if(strlen(trim($_POST['naprawa']))==0) + + $blad.=('
    Nie wprowadzono rodzaju naprawy!!!
    '); + + if(strlen(trim($_POST['lokalizacja']))==0) + + $blad.=('
    Nie podano lokalizacji + +!!!
    '); + + if(strlen(trim($_POST['koszt']))==0) + + $blad.=('
    Nie podano kosztu!!!
    '); else if (!sprawdz_koszt($_POST['koszt'])) + + $blad.=('
    Zła forma kosztu XX.XX!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_naprawe($_GET['id_nap']); + + } + + else + + { + + $edytuj_naprawe=mysql_query("update naprawa SET data_naprawy='".$_POST['data_naprawy']."',naprawa='".$_POST['naprawa']."',lokalizacja='".$_POST['lokalizacja']."',koszt='".$_POST['koszt']."',kilometry='".$_POST['kilometry']."',id_sam='".$_POST['id_sam']."' where id_nap='".$_GET['id_nap']."'"); + + $id2 = $_GET['id_nap']; + + if($edytuj_naprawe) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + + + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="naprawa/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into naprawa_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update naprawa SET plik='1' where id_nap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    + + + + + +'); + + } + + }//else + + } //else + + BREAK; + + case "usun_plik": + + if(!is_numeric($_GET['id_pn'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_nap from naprawa_pliki where id_pn='".$_GET['id_pn']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from naprawa_pliki where id_pn='".$_GET['id_pn']."'"); + + $zapytanie2=mysql_query("select id_nap from naprawa_pliki where id_nap='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update naprawa SET plik='0' where id_nap='".$n[1]."'"); + + } + + if($usun) + + { + + echo('


    Plik zostało usunięty

    + +'); + + unlink ($n[0]); + + + + + + } + + else + + echo('


    Nie mozna było usun±ć pliku

    '); + + } + + BREAK; + + + + case "usun_samochod": + + if(!is_numeric($_GET['id_sam'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("delete from samochody where id_sam='".$_GET['id_sam']."'"); + + if($usun) + + echo('


    Samochód został usunięty

    '); + + else + + echo('


    Nie mozna było usun±ć Samochodu

    '); + + } + + BREAK; + + case "usun_naprawe": + + if(!is_numeric($_GET['id_nap'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("delete from naprawa where id_nap='".$_GET['id_nap']."'"); + + if($usun) + + echo('


    Naprawa została usunięta

    '); + + else + + echo('


    Nie mozna było usun±ć Naprawy

    '); + + } + + BREAK; + + case "pokaz_samochod": + + form_pokaż_samochod($_GET['id_sam']); + + BREAK; + + case "pokaz_naprawe": + + form_pokaż_naprawe($_GET['id_nap']); + + BREAK; + + case "dodaj_samochod": + + + + if(!isset($_POST['dodaj_samochod'])) + + form_dodaj_samochod(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['auto']))==0) + + $blad.=('

    Musisz podać nazwę auta!!!
    '); + + if(strlen(trim($_POST['nr_rej']))==0) + + $blad.=('
    Musisz podać nr rejestracji!!!
    '); + + if(strlen(trim($_POST['rok_auta']))==0) + + $blad.=('
    Nie podano roku auta!!!
    '); else if (!sprawdz_rok($_POST['rok_auta'])) + + $blad.=('
    Zła forma daty RRRR - rok zakupu!!!
    '); + + if(strlen(trim($_POST['data_zakupu']))==0) + + $blad.=('
    Nie podano daty zakupu auta!!!
    '); + + else if (!sprawdz_date($_POST['data_zakupu'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - data zakupu!!!
    '); + + if(strlen(trim($_POST['oc']))==0) + + $blad.=('
    Nie podano OC!!!
    '); + + else if (!sprawdz_date($_POST['oc'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - OC!!!
    '); if(strlen(trim($_POST['ac']))==0) + + $blad.=('
    Nie podano AC!!!
    '); + + else if (!sprawdz_date($_POST['ac'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - AC!!!
    '); + + if(strlen(trim($_POST['przeglad']))==0) + + $blad.=('
    Nie podano daty przegl±du + +!!!
    '); + + else if (!sprawdz_date($_POST['przeglad'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - przegl±d!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_samochod(); + + } + + else + + { + + $dodaj_samochod=mysql_query("insert into samochody values('','".$_POST['auto']."','".$_POST['nr_rej']."','".$_POST['przypisany']."','".$_POST['rok_auta']."','".$_POST['data_zakupu']."','".$_POST['oc']."','".$_POST['ac']."','".$_POST['ubezpieczenia']."','".$_POST['przeglad']."','".$_POST['uwagi']."','0','0')"); + + if($dodaj_samochod) + + uwaga('

    Samochod został dodany

    '); + + else + + uwaga('


    Nie można było dodać Samochodu

    + +'); + + } + + }//else + + break; + + + + + + case "dodaj_naprawe": + + + + if(!isset($_POST['dodaj_naprawe'])) + + form_dodaj_naprawe(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['data_naprawy']))==0) + + $blad.=('

    Nie podano daty naprawy!!!
    '); else if (!sprawdz_date($_POST['data_naprawy'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD - data naprawy!!!
    '); + + if(($_POST['id_sam'])==0) + + $blad.=('
    Nie wybrano samochodu!!!
    '); + + if(strlen(trim($_POST['naprawa']))==0) + + $blad.=('
    Nie wprowadzono rodzaju naprawy!!!
    '); + + if(strlen(trim($_POST['lokalizacja']))==0) + + $blad.=('
    Nie podano lokalizacji + +!!!
    '); + + if(strlen(trim($_POST['koszt']))==0) + + $blad.=('
    Nie podano kosztu!!!
    '); else if (!sprawdz_koszt($_POST['koszt'])) + + $blad.=('
    Zła forma kosztu XX.XX!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_naprawe(); + + } + + else + + { + + $dodaj_samochod=mysql_query("insert into naprawa values('','".$_POST['data_naprawy']."','".$_POST['id_sam']."','".$_POST['naprawa']."','".$_POST['lokalizacja']."','".$_POST['koszt']."','0','".$_POST['kilometry']."')"); + + $id2 = mysql_insert_id(); + + if($dodaj_samochod) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="naprawa/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into naprawa_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update naprawa SET plik='1' where id_nap='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + uwaga('

    Naprawa została dodanana

    '); + + + + } + + else + + uwaga('


    Nie można było dodać Naprawy

    '); + + } + + }//else + + break; + + + + + + + + case "show_samochod": + + + + + echo'

    + +
    Opcje wyszukiwania
    + + + + + + + + + + + +
    Wszystkie
    Sprzedane
    Użytkowane
    Opcje sortowanie
    Data OC +
    Data przegladu +
    Rocznik samochodu + + +
    '; + + + // pobieranie userów + + $jakisort=$_POST['jakisort']; + + $data1=date("Y-m-d",strtotime("+14 days",time())); + if ($jakisort=='') + { + $jakisort='a.rok_auta'; + $jakist=0; + } else + + { + $jakisort=$_POST['jakisort']; + $jakist=$_POST['jakist']; } + $pobierz_samochod=mysql_query("select a.id_sam,a.auto,a.nr_rej,a.status,b.imie,b.nazwisko,a.rok_auta,a.rok_zakupu,a.ocac,a.ocac2,c.ubezpieczenia,a.przeglad from samochody a,uzytkownicy b,ubezpieczenia c where a.id=b.id and a.id_ube=c.id_ube and a.status like '%$jakist%' order by $jakisort asc"); + + if(mysql_num_rows($pobierz_samochod)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych samochodów!!!

    '); + + else + + { + + $color=$color1; + + + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_samochod)) + + { + + if($u['status']=='0') $status='używany'; else { $status= 'sprzedany';} + + $color=zmien_color($color); + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + $data2 = $u['przeglad']; + + if (($data2 <= $data1) and ($u['status']=='0')) + + { + + $color='#FCA1A1'; + + } + + $data3 = $u['ocac']; + + if (($data3 <= $data1) and ($u['status']=='0')) + + { + + $color='#FCA1A1'; + + } + + + + if($u['status']=='1') + + { + + $color='#D4D6FC'; + + } + + + + $sql=mysql_query("SELECT kmstop FROM kilometry where id_sam='".$u['id_sam']."' ORDER BY id_kil DESC LIMIT 1"); + + + + while($a=mysql_fetch_array($sql)) + + { + + $kmstop = $a['kmstop']; + + } + + + + + + echo '' ; + + } + + + + echo '
    Nazwa autaNr rejest.PrzypisanyRok autaData zakupuOCWymiana olejuUbezpieczeniePrzegl±dStan kmStatusOpcje
    '.$u['auto'].'
    '.$u['nr_rej'].'
    '.$u['imie'].' '.$u['nazwisko'].'
    '.$u['rok_auta'].'
    '.$u['rok_zakupu'].'
    '.$u['ocac'].'
    '.$u['ocac2'].'
    '.$u['ubezpieczenia'].'
    '.$u['przeglad'].'
    '.$kmstop.' km
    '.$status.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_samochod": + + // pobieranie userów + + $pobierz_samochod=mysql_query("select a.id_sam,a.auto,a.nr_rej,b.imie,b.nazwisko,a.rok_auta,a.rok_zakupu,a.ocac,c.ubezpieczenia,a.przeglad from samochody a,uzytkownicy b,ubezpieczenia c where a.id=b.id and a.id_ube=c.id_ube and a.auto like'%".$_POST['auto']."%' and a.nr_rej like'%".$_POST['nrrej']."%' and a.rok_auta like'%".$_POST['rokauta']."%' and a.id_ube='".$_POST['id_ube']."' order by a.auto asc"); + + if(mysql_num_rows($pobierz_samochod)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych samochodów!!!

    '); + + else + + { + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_samochod)) + + { + + $sql=mysql_query("SELECT kmstop FROM kilometry where id_sam='".$u['id_sam']."' ORDER BY kmstop DESC LIMIT 1"); + + while($a=mysql_fetch_array($sql)) + + { + + $color=zmien_color($color); + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + } + + echo '
    Nazwa autaNr rejest.PrzypisanyRok autaData zakupuOC/ACUbezpieczycielPrzegl±dOpcje
    '.$u['auto'].'
    '.$u['nr_rej'].'
    '.$u['imie'].' '.$u['nazwisko'].'
    '.$u['rok_auta'].'
    '.$u['rok_zakupu'].'
    '.$u['ocac'].'
    '.$u['ubezpieczenia'].'
    '.$a['kmstop'].' km
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "show_naprawa": + + // pobieranie userów + + $pobierz_naprawe=mysql_query("select a.id_nap,a.plik,a.data_naprawy,a.kilometry,b.auto,b.nr_rej,a.naprawa,a.lokalizacja,a.koszt from naprawa a,samochody b where a.id_sam=b.id_sam order by a.data_naprawy desc"); + + if(mysql_num_rows($pobierz_naprawe)==0) + + uwaga('

    W bazie nie ma żadnych wprowadzonej naprawy!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_naprawe(); + + $zapytanie=mysql_query("select sum(koszt) as koszt from naprawa"); + + $z= mysql_fetch_array($zapytanie); + + echo '

    '; + + echo '
    '; + + echo "Suma kwoty napraw: ".$z[koszt]. " PLN

    "; + + echo '
    '; + + echo '
    '; + + while($u=mysql_fetch_array($pobierz_naprawe)) + + { + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $naprawa = str_split($u['naprawa'], 200); + + $color=zmien_color($color); + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    Data naprawyNazwa autaRodzaj naprawyLokalizacjaKosztKilometryPlikiOpcje
    '.$u['data_naprawy'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$naprawa[0].'
    '.$u['lokalizacja'].'
    '.$u['koszt'].' PLN
    '.$u['kilometry'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_naprawe": + + // pobieranie userów + + $pobierz_naprawe=mysql_query("select a.id_nap,a.kilometry,a.data_naprawy,a.plik,b.auto,b.nr_rej,a.naprawa,a.lokalizacja,a.koszt from naprawa a,samochody b where a.id_sam=b.id_sam and b.id_sam='".$_POST['id_sam']."' and a.data_naprawy like '%".$_POST['data']."%' and a.lokalizacja like '%".$_POST['lokalizacja']."%' order by a.data_naprawy desc"); + + if(mysql_num_rows($pobierz_naprawe)==0) + + uwaga('

    W bazie nie ma żadnych wprowadzonej naprawy!!!

    + +'); + + else + + { + + $color=$color1; + + $_POST['data']=''; + + $_POST['nr_rej']=''; + + $_POST['lokalizacja']=''; + + form_szukaj_naprawe(); + + + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_naprawe)) + + { + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + $naprawa2 = str_split($u['naprawa'], 200); + + $color=zmien_color($color); + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + $zapytanie=mysql_query("select sum(a.koszt) as koszt from naprawa a,samochody b where a.id_sam=b.id_sam and b.id_sam='".$_POST['id_sam']."'"); + + $z= mysql_fetch_array($zapytanie); + + echo '
    Data naprawyNazwa autaRodzaj naprawyLokalizacjaKosztKilometryPlikiOpcje
    '.$u['data_naprawy'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$naprawa2[0].'
    '.$u['lokalizacja'].'
    '.$u['koszt'].'
    '.$u['kilometry'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + echo '
    '; + + echo "Suma kwoty napraw: ".$z[koszt]. " PLN"; + + echo '
    '; + + echo ''; + + } + + BREAK; + + } //switch + + } //if + + + +?> + diff --git a/style.css b/style.css new file mode 100644 index 0000000..2498fd7 --- /dev/null +++ b/style.css @@ -0,0 +1,136 @@ +BODY { + MARGIN-TOP: 5px; FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, sans-serif +} +TD { + FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, sans-serif +} +SMALL { + FONT-SIZE: 10px; FONT-FAMILY: Verdana, Arial, sans-serif +} +FORM { + MARGIN: 0px +} +A { + TEXT-DECORATION: none +} +A.lmenu { + COLOR: #000000 +} +A:hover { + TEXT-DECORATION: underline +} +.main { + FONT-SIZE: 11px; COLOR: #333333; FONT-FAMILY: Tahoma, Helvetica, sans-serif +} +.smain { + FONT-SIZE: 9px; COLOR: #333333; FONT-FAMILY: Tahoma, Helvetica, sans-serif +} +.menu-sep { + FONT-SIZE: 10px; COLOR: #ffffff; FONT-FAMILY: Tahoma, Verdana +} +.menu { + FONT-WEIGHT: FONT-SIZE: 12px; COLOR: #404040; FONT-FAMILY: Tahoma, Verdana +} +.menu2 { + FONT-SIZE: 10px; COLOR: #404040; FONT-FAMILY: Tahoma, Verdana +} +.menu3 { + FONT-SIZE: 12px; COLOR: #404040; FONT-FAMILY: Tahoma, Verdana +} +.topmenu { + FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #000000; FONT-FAMILY: Verdana +} +.topmenu2 { + FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #cc3300; FONT-FAMILY: Verdana +} +.pomoc { + FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #ffffff; FONT-FAMILY: Tahoma, Verdana +} +.title { + PADDING-RIGHT: 10px; FONT-WEIGHT: bold; FONT-SIZE: 18px; COLOR: #cfcfcf; FONT-FAMILY: Arial +} +.black { + COLOR: #000000 +} +.submit { + BORDER-RIGHT: #d6d6d6 1px solid; BORDER-TOP: #d6d6d6 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 11px; BORDER-LEFT: #d6d6d6 1px solid; WIDTH: 100px; COLOR: #333333; BORDER-BOTTOM: #d6d6d6 1px solid; BACKGROUND-COLOR: #f2f2f2 +} +.input { + FONT-SIZE: 13px; FONT-FAMILY: arial +} +.homepl-black { + FONT-WEIGHT: bold; COLOR: #000000 +} +.homepl-red { + FONT-WEIGHT: bold; COLOR: #cc3300 +} +.nopadd { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px +} +H3 { + PADDING-LEFT: 15px; FONT-WEIGHT: normal; FONT-SIZE: 9pt; COLOR: #777777; FONT-FAMILY: monospace +} +.sep-top { + BACKGROUND-IMAGE: url(/gfx/home-gr-gray/sep-top.gif); BACKGROUND-COLOR: #939393 +} +.lmenu-sep-top { + BACKGROUND-IMAGE: url(/gfx/home-gr-gray/sep-top.gif); BACKGROUND-COLOR: #939393 +} +.sep-mid { + PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND-IMAGE: url(/gfx/home-gr-gray/sep-top.gif); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BACKGROUND-COLOR: #cccccc +} +.th { + FONT-WEIGHT: bold; BACKGROUND-COLOR: #ffffff +} +.ttitle { + FONT-WEIGHT: bold; COLOR: #cc3300 +} +.lmenutitle { + FONT-WEIGHT: bold; COLOR: #000000 +} +.navbar { + COLOR: #000000 +} +.kbtab1 { + BORDER-RIGHT: #dedede 0px solid; PADDING-RIGHT: 7px; BORDER-TOP: #dedede 0px solid; PADDING-LEFT: 7px; FONT-WEIGHT: normal; FONT-SIZE: 11px; PADDING-BOTTOM: 2px; BORDER-LEFT: #dedede 1px solid; COLOR: #333333; PADDING-TOP: 2px; BORDER-BOTTOM: #dedede 1px solid; FONT-FAMILY: tahoma; TEXT-DECORATION: none +} +.kbtab2 { + BORDER-RIGHT: #dedede 1px solid; PADDING-RIGHT: 7px; BORDER-TOP: #dedede 0px solid; PADDING-LEFT: 7px; FONT-WEIGHT: normal; FONT-SIZE: 11px; PADDING-BOTTOM: 2px; BORDER-LEFT: #dedede 1px solid; COLOR: #333333; PADDING-TOP: 2px; BORDER-BOTTOM: #dedede 1px solid; FONT-FAMILY: tahoma; TEXT-DECORATION: none +} +.kbtab3 { + BORDER-RIGHT: #dedede 1px solid; PADDING-RIGHT: 7px; BORDER-TOP: #dedede 0px solid; PADDING-LEFT: 7px; FONT-WEIGHT: normal; FONT-SIZE: 11px; PADDING-BOTTOM: 2px; BORDER-LEFT: #dedede 0px solid; COLOR: #333333; PADDING-TOP: 2px; BORDER-BOTTOM: #dedede 1px solid; FONT-FAMILY: tahoma; TEXT-DECORATION: none +} +#tooltip { + BORDER-RIGHT: #000000 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #000000 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 10px; BACKGROUND: #f6f6f6; FILTER: alpha(opacity=92); PADDING-BOTTOM: 3px; BORDER-LEFT: #000000 1px solid; COLOR: #000000; PADDING-TOP: 3px; BORDER-BOTTOM: #000000 1px solid; FONT-FAMILY: Verdana; POSITION: absolute; moz-opacity: 0.92; opacity: 0.92 +} +.waitDiv { + Z-INDEX: 110; LEFT: 0px; WIDTH: 100%; POSITION: absolute; TOP: 0px +} +.waitDivBg { + Z-INDEX: 100; FILTER: alpha(opacity=40); LEFT: 0px; WIDTH: 100%; POSITION: absolute; TOP: 0px; HEIGHT: 500px; BACKGROUND-COLOR: #707070; moz-opacity: 0.4; opacity: 0.4 +} +.waitDivInner { + BORDER-RIGHT: #525252 1px solid; PADDING-RIGHT: 30px; BORDER-TOP: #525252 1px solid; PADDING-LEFT: 30px; Z-INDEX: 101; FILTER: alpha(opacity=90); LEFT: 0px; PADDING-BOTTOM: 15px; BORDER-LEFT: #525252 1px solid; PADDING-TOP: 15px; BORDER-BOTTOM: #525252 1px solid; POSITION: absolute; TOP: 0px; BACKGROUND-COLOR: #fff; TEXT-ALIGN: center; moz-opacity: 0.9; opacity: 0.9 +} +.waitdiv P { + MARGIN: 5px 0px 0px; FONT: 12px arial; COLOR: #959595 +} +div#stopka +{ + color:#212121; + clear:both; + + text-align:center; + vertical-align:middle; + height:1.6em; + padding:0px; + margin-top:15px; +} +.data { + color: #ffffff; + font-size: 12px; + font-family: tahoma; +} +.link { + FONT-WEIGHT: FONT-SIZE: 12px; COLOR: #404040; FONT-FAMILY: Tahoma, Verdana +} \ No newline at end of file diff --git a/tankowania.php b/tankowania.php new file mode 100644 index 0000000..79fb751 --- /dev/null +++ b/tankowania.php @@ -0,0 +1,880 @@ +0) + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "pokaz": + + form_pokaż_tankowania($_GET['id_tan']); + + BREAK; + + case "edytuj": + + if(!is_numeric($_GET['id_tan'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_tankowania'])) + + form_edytuj_tankowania($_GET['id_tan']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if ($_POST['id_sam']==0) + + $blad.=('
    Musisz wybrać samochód!!!
    '); + + if(strlen(trim($_POST['stankm']))==0) + + $blad.=('
    Musisz podać Stan licznika!!!
    '); + + else if (!sprawdz_liczbe($_POST['stankm'])) + + $blad.=('
    Zła forma Stan Km !!!
    '); + + if(strlen(trim($_POST['litry']))==0) + + $blad.=('
    Musisz podać Litry!!!
    '); else if (!sprawdz_liczbe($_POST['litry'])) + + $blad.=('
    Zła forma Litrów !!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_tankowania($_GET['id_tan']); + + } + + else + + { + + $edytuj_tankowania=mysql_query("update tankowania SET data_tan='".$_POST['data']."',stankm='".$_POST['stankm']."',litry='".$_POST['litry']."',wyjazd='".$_POST['wyjazd']."' where id_tan='".$_GET['id_tan']."'"); + + if($edytuj_tankowania) + + uwaga('

    Zmiany zostały wprowadzone

    '); + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj": + + + + if(!isset($_POST['dodaj_tankowania'])) + + form_dodaj_tankowania(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if ($_POST['id_sam']==0) + + $blad.=('
    Musisz wybrać samochód!!!
    '); + + if(strlen(trim($_POST['stankm']))==0) + + $blad.=('
    Musisz podać Stan licznika!!!
    '); + + else if (!sprawdz_liczbe($_POST['stankm'])) + + $blad.=('
    Zła forma Stan Km !!!
    '); + + if(strlen(trim($_POST['litry']))==0) + + $blad.=('
    Musisz podać Litry!!!
    '); else if (!sprawdz_liczbe($_POST['litry'])) + + $blad.=('
    Zła forma Litrów !!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_tankowania(); + + } + + else + + { + + $dodaj_tankowania=mysql_query("insert into tankowania values('','".$_POST['data']."','".$_SESSION['id']."','".$_POST['id_sam']."','".$_POST['stankm']."','".$_POST['litry']."','0','".$_POST['wyjazd']."')"); + + if($dodaj_tankowania) + + { + + uwaga('

    Tankowanie zostało dodane

    '); + + } + + else + + uwaga('


    Nie można było dodać Tankowanie

    '); + + } + + }//else + + break; + + case "show": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.id=b.id and a.id_sam=c.id_sam and a.usun='0' and a.id='".$_SESSION['id']."' order by data_tan desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + +form_szukaj_tankowania(); + + + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + echo '' ; + + } + + echo '
    DataUżytkownikAutoStan KmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej']. '
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "show2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.id=b.id and a.id_sam=c.id_sam and a.usun='0' and a.id='".$_SESSION['id']."' and a.data_tan>='".$data2."' and a.data_tan<='".$data."' order by data_tan desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + +form_szukaj_tankowania(); + + + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataUżytkownikAutoStanKmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_tankowania": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.id=b.id and a.id_sam=c.id_sam and a.usun='0' and a.id='".$_SESSION['id']."' and a.data_tan >= '".$_POST['data1']."' and a.data_tan <= '".$_POST['data2']."' order by data_tan desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + } + + echo '
    DataUżytkownikAutoStanKmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + + + } //switch + + } //if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + + else + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "usun_admin": + + if(!is_numeric($_GET['id_tan'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update tankowania SET usun='1' where id_tan='".$_GET['id_tan']."'"); + + if($usun) + + echo('


    Tankowanie zostało usunięte

    '); + + else + + echo('

    Nie mozna było usun±ć Tankowania

    '); + + } + + BREAK; + + case "pokaz_admin": + + form_pokaż_tankowania_admin($_GET['id_tan']); + + BREAK; + + case "edytuj_admin": + + if(!is_numeric($_GET['id_tan'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_tankowania_admin'])) + + form_edytuj_tankowania_admin($_GET['id_tan']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('
    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if ($_POST['id_sam']==0) + + $blad.=('
    Musisz wybrać samochód!!!
    '); + + if(strlen(trim($_POST['stankm']))==0) + + $blad.=('
    Musisz podać Stan licznika!!!
    '); + + else if (!sprawdz_liczbe($_POST['stankm'])) + + $blad.=('
    Zła forma Stan Km !!!
    '); + + if(strlen(trim($_POST['litry']))==0) + + $blad.=('
    Musisz podać Litry!!!
    '); else if (!sprawdz_liczbe($_POST['litry'])) + + $blad.=('
    Zła forma Litrów !!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_tankowania_admin($_GET['id_tan']); + + } + + else + + { + + $edytuj_tankowania_admin=mysql_query("update tankowania SET data_tan='".$_POST['data']."',id='".$_POST['id']."',id_sam='".$_POST['id_sam']."',stankm='".$_POST['stankm']."',litry='".$_POST['litry']."',wyjazd='".$_POST['wyjazd']."' where id_tan='".$_GET['id_tan']."'"); + + if($edytuj_tankowania_admin) + + uwaga('

    Zmiany zostały wprowadzone

    + +'); + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    + +'); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_admin": + + + + if(!isset($_POST['dodaj_tankowania_admin'])) + + form_dodaj_tankowania_admin(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if ($_POST['id_sam']==0) + + $blad.=('
    Musisz wybrać samochód!!!
    '); + + if(strlen(trim($_POST['stankm']))==0) + + $blad.=('
    Musisz podać Stan licznika!!!
    '); + + else if (!sprawdz_liczbe($_POST['stankm'])) + + $blad.=('
    Zła forma Stan Km !!!
    '); + + if(strlen(trim($_POST['litry']))==0) + + $blad.=('
    Musisz podać Litry!!!
    '); else if (!sprawdz_liczbe($_POST['litry'])) + + $blad.=('
    Zła forma Litrów !!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_tankowania_admin(); + + } + + else + + { + + $dodaj_kilometry_admin=mysql_query("insert into tankowania values('','".$_POST['data']."','".$_POST['id']."','".$_POST['id_sam']."','".$_POST['stankm']."','".$_POST['litry']."','0','".$_POST['wyjazd']."')"); + + if($dodaj_kilometry_admin) + + { + + uwaga('

    Tankowanie został dodany

    + +'); + + } + + else + + uwaga('


    Nie można było dodać + + tankowania

    '); + + } + + }//else + + break; + + case "show_admin": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam order by data_tan DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    + +'); + + else + + { + + $color=$color1; + +form_szukaj_tankowania_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    DataUżytkownikAutoStan KmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show_admin2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.data_tan>='".$data2."' and a.data_tan<='".$data."' order by data_tan DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    + +'); + + else + + { + + $color=$color1; + +form_szukaj_tankowania_admin(); + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    DataUżytkownikAutoStan KmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_tankowania_admin": + + // pobieranie userów + + if ($_POST['auto']<>0) { + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.id_sam,c.id_sam,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.id_sam='".$_POST['auto']."' and a.wyjazd like '%".$_POST['wyjazd']."%' order by data_tan DESC"); + + + } + + else { + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.wyjazd like '%".$_POST['wyjazd']."%' order by data_tan DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.id='".$_POST['id']."' and a.wyjazd like '%".$_POST['wyjazd']."%' order by data_tan DESC"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.data_tan >= '".$_POST['data1']."' and a.data_tan <= '".$_POST['data2']."' and a.wyjazd like '%".$_POST['wyjazd']."%' order by data_tan DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.wyjazd,a.id_tan,a.data_tan,b.nazwisko,b.imie,c.auto,c.nr_rej,a.stankm,a.litry from tankowania a,uzytkownicy b,samochody c where a.usun='0' and a.id=b.id and a.id_sam=c.id_sam and a.data_tan >= '".$_POST['data1']."' and a.data_tan <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and a.wyjazd like '%".$_POST['wyjazd']."%' order by data_tan DESC"); + + } + + }} + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + form_szukaj_tankowania_admin(); + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + echo '' ; + + } + + echo '
    Data:UżytkownikAutoStan KmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].' '.$u['nr_rej'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + } //switch + + } //if + +} + + + + + + + +?> + diff --git a/test.php b/test.php new file mode 100644 index 0000000..dacea87 --- /dev/null +++ b/test.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/ustawienia.php b/ustawienia.php new file mode 100644 index 0000000..dc20f97 --- /dev/null +++ b/ustawienia.php @@ -0,0 +1,259 @@ +'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['stanowisko']))==0) + echo('

    Musisz podać nazwę stanowiska!!!

    '); + else if (mysql_num_rows($pobierz_kategoria)>0) + echo('

    Podane nazwa już istnieje!!!

    '); + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO `stanowisko` ( `id_sta` , `stanowisko` ) VALUES (NULL,'".$_POST['stanowisko']."')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update stanowisko SET stanowisko='".$_POST['stanowisko']."' where id_sta='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('


    Stanowisko zostało dodane

    '); + $_POST['stanowisko'] = ''; + } + else + echo('


    Nie można było zapisać stanowiska w bazie

    '); + $_POST['stanowisko'] = ''; + } + } + BREAK; + case "dodano_akcje": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select akcja from akcja where akcja='".$_POST['akcja']."' and usun='0' and id_akc <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['akcja']))==0) + echo('


    Musisz podać nazwę akcji

    '); + else if (mysql_num_rows($pobierz_kategoria)>0) + echo('


    Podane nazwa już istnieje

    '); + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO `akcja` ( `id_akc` , `akcja` ) VALUES (NULL,'".$_POST['akcja']."')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update akcja SET akcja='".$_POST['akcja']."' where id_akc='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('


    Akcja zostało dodane

    '); + $_POST['akcja'] = ''; + } + else + echo('


    Nie można było zapisać akcji w bazie

    '); + $_POST['akcja'] = ''; + } + } + BREAK; + case "dodano_bank": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select bank from bank where bank='".$_POST['bank']."' and usun='0' and id_ban <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['bank']))==0) + echo('

    Musisz podać nazwę banku

    '); + else if (mysql_num_rows($pobierz_kategoria)>0) + echo('

    Podana nazwa już istnieje

    '); + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO `bank` ( `id_ban` , `bank` ) VALUES (NULL,'".$_POST['bank']."')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update bank SET bank='".$_POST['bank']."' where id_ban='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('


    Bank został dodany

    '); + $_POST['bank'] = ''; + } + else + echo('


    Nie można było zapisać banku w bazie

    '); + $_POST['bank'] = ''; + } + } + BREAK; + case "dodano_ubezpieczenie": + if(!is_numeric($_GET['id'])) + $pobierz_kategoria=mysql_query("select ubezpieczenia from ubezpieczenia where ubezpieczenia='".$_POST['ubezpieczyciel']."' and usun='0' and id_ube <>'".$_GET['id']."'") or die(mysql_error()); + if(strlen(trim($_POST['ubezpieczyciel']))==0) + echo('

    Musisz podać nazwę ubezpieczyciela!!!

    '); + else if (mysql_num_rows($pobierz_kategoria)>0) + echo('

    Podana nazwa już istnieje!!!

    '); + else + { + { + if($_POST['id']==0) + $zapis_do_bazy=mysql_query("INSERT INTO `ubezpieczenia` ( `id_ube` , `ubezpieczenia` ) VALUES (NULL,'".$_POST['ubezpieczyciel']."')"); + else if($_POST['id']>0) + { + $zapis_do_bazy=mysql_query("update ubezpieczenia SET ubezpieczenia='".$_POST['ubezpieczyciel']."' where id_ube='".$_POST['id']."'"); + } + if($zapis_do_bazy) + { + echo('


    Ubezpieczyciel został dodany

    '); + $_POST['ubezpieczyciel'] = ''; + } + else + echo('


    Nie można było zapisać ubezpieczyciela w bazie

    '); + $_POST['ubezpieczyciel'] = ''; + } + } + BREAK; + case "edytuj_stanowisko": + if(isset($_GET['id'])) + form_edytujstanowisko($_GET['id']); + else + echo('

    BRAK DANYCH

    '); + BREAK; + case "edytuj_akcje": + if(isset($_GET['id'])) + form_edytujakcje($_GET['id']); + else + echo('

    BRAK DANYCH

    '); + BREAK; + case "edytuj_bank": + if(isset($_GET['id'])) + form_edytujbank($_GET['id']); + else + echo('

    BRAK DANYCH

    '); + BREAK; + case "edytuj_ubezpieczenia": + if(isset($_GET['id'])) + form_edytujubezpieczyciel($_GET['id']); + else + echo('

    BRAK DANYCH

    '); + BREAK; + case "usun_stanowisko": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update stanowisko SET usun='1' where id_sta='".$_GET['id']."'"); + if($usun) + echo('


    Stanowisko zostało usunięte

    '); + else + echo('


    Nie mozna było usunąć stanowiska

    '); + } + BREAK; + case "usun_akcje": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update akcja SET usun='1' where id_akc='".$_GET['id']."'"); + if($usun) + echo('


    Akcja zostało usunięte

    '); + else + echo('


    Nie mozna było usunąć akcji

    '); + } + BREAK; + case "usun_bank": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update bank SET usun='1' where id_ban='".$_GET['id']."'"); + if($usun) + echo('


    Bank został usunięty

    '); + else + echo('


    Nie mozna było usunąć banku

    '); + } + BREAK; + case "usun_ubezpieczenia": + if(!is_numeric($_GET['id'])) + uwaga('Brak danych!'); + else + { + $usun=mysql_query("update ubezpieczenia SET usun='1' where id_ube='".$_GET['id']."'"); + if($usun) + echo('


    Ubezpieczyciel został usunięty

    '); + else + echo('


    Nie mozna było usunąć ubezpieczyciela

    '); + } + BREAK; + BREAK; + } +} +if(!isset($_GET['kto']) or ($_GET['kto']!='edytuj_stanowisko')) +form_stanowisko(); +$stanowisko=mysql_query("select id_sta,stanowisko from stanowisko where usun='0' order by stanowisko asc"); +if(mysql_num_rows($stanowisko)==0) + echo('


    W bazie nie ma wprowadzonych danych

    '); +else + { + $color=$color1; + echo '

    Lista stanowisk

    '; + echo '
    '; + while($s=mysql_fetch_array($stanowisko)) + { + $color=zmien_color($color); + echo ''; + } + echo '
    Nazwa stanowiskaOpcje
     '.$s['stanowisko'].'Edytuj | Usun


    '; + } + +if(!isset($_GET['kto']) or ($_GET['kto']!='edytuj_akcje')) +form_akcja(); +$akcja=mysql_query("select id_akc,akcja from akcja where usun='0' order by akcja asc"); +if(mysql_num_rows($akcja)==0) + echo('

    W bazie nie ma wprowadzonych danych

    '); +else + { + $color=$color1; + echo '

    Lista akcji

    '; + echo '
    '; + while($a=mysql_fetch_array($akcja)) + { + $color=zmien_color($color); + echo ''; + } + echo '
    Nazwa akcjiOpcje
     '.$a['akcja'].'Edytuj | Usun


    '; + } + + if(!isset($_GET['kto']) or ($_GET['kto']!='edytuj_bank')) +form_bank(); +$bank=mysql_query("select id_ban,bank from bank where usun='0' order by bank asc"); +if(mysql_num_rows($bank)==0) + echo('

    W bazie nie ma wprowadzonych danych

    '); +else + { + $color=$color1; + echo '
    Lista banków

    '; + echo '
    '; + while($b=mysql_fetch_array($bank)) + { + $color=zmien_color($color); + echo ''; + } + echo '
    Nazwa bankuOpcje
     '.$b['bank'].'Edytuj | Usun


    '; + } + if(!isset($_GET['kto']) or ($_GET['kto']!='edytuj_ubezpieczenia')) +form_ubezpieczenia(); +$ubez=mysql_query("select id_ube,ubezpieczenia from ubezpieczenia where usun='0' order by ubezpieczenia asc"); +if(mysql_num_rows($ubez)==0) + echo('

    W bazie nie ma wprowadzonych danych

    '); +else + { + $color=$color1; + echo '

    Lista ubezpieczycieli

    '; + echo '
    '; + while($u=mysql_fetch_array($ubez)) + { + $color=zmien_color($color); + echo ''; + } + echo '
    Nazwa ubezpieczycieliOpcje
     '.$u['ubezpieczenia'].'Edytuj | Usun


    '; + } +?> \ No newline at end of file diff --git a/vending.php b/vending.php new file mode 100644 index 0000000..0232032 --- /dev/null +++ b/vending.php @@ -0,0 +1,3001 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Zarz±dzanie lokalizacjami
    Zarz±dzanie magazynem
    Produkty
    Zestawienia
    + + + + + + + + + + + + + + + + + + + +

    '; + + + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_maszyne": + $Typ_maszyny=mysql_query("select * from Typ_maszyny where usun='0' order by Nazwa_typ_masz asc"); + ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dodaj maszyne
      
    Nr seryjny:
    Nr seryjny Malcomm:
    Dostawca:
    Lokalizacja:
    Ilo¶ć produktów:
    Data postawienia:
    Data wystawienia FV:
    Typ maszyny:
    Stan maszyny:
    Status:
    Uwagi:
    '; + + echo'
    '; + echo''; + + + echo''; + + + + + + + echo'
    '; ?> + '; + + echo''; + echo ''; + echo''; + echo ''; + echo'
    '; + echo ' '; + + echo ''; + + + + + + //koniec sortowania magazynu + + + + + + + $stan_produktow=0; + $cena=0; + + if ($_POST['produkt']<>0) {$produkt=$_POST['produkt']; $produkt2=$_POST['produkt'];} else {$produkt=1; $produkt2=99999;} + + if ($_POST['grupa']<>0) {$grupa=$_POST['grupa']; $grupa2=$_POST['grupa'];} else {$grupa=1; $grupa2=99999;} + + + $magazyn=mysql_query("select * from magazyn_ven where usun='0' order by ID_mag_ven asc"); + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod, stawka_vat, minimum, powiadomienie, chciane from typ_produktu where usun='0' and chciane='Tak' and ID_produktu >= $produkt and ID_produktu <=$produkt2 and ID_grupy >= $grupa and ID_grupy <=$grupa2 order by Nazwa_produktu asc"); + +if(mysql_num_rows($typ_produktu)==0) + + echo('

    W bazie nie ma wprowadzonych danych

    '); + +else + + { + + $color=$color1; + + echo '

    Stan produktów w magazynie

    '; + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + $id_produktu=$s['ID_produktu']; + $magazyn=mysql_query("select * from magazyn_ven where usun='0' and ID_produktu=$id_produktu order by ID_mag_ven asc"); + + while($a=mysql_fetch_array($magazyn)) + + { + $stan_produktow=$stan_produktow+$a['ruch']; + if ($a['cena_zakupu']<>0) {$cena=$a['cena_zakupu'];} + + } + + + + $color=zmien_color($color); + + if ($stan_produktow<$s['minimum'] and $s['powiadomienie']=='Tak') {$color="#FCA1A1";} + $wartosc=$stan_produktow*$cena; + $wartoscsuma=$wartoscsuma+$wartosc; + echo ''; + $stan_produktow=0; + $cena=0; + } + echo ''; + + echo '
    Nazwa produktuStanOstatnia cena zakupuWarto¶ć magazynuOpcje
     '.$s['Nazwa_produktu'].' '.$stan_produktow.' '.$cena.' '.$wartosc.'
     '.$wartoscsuma.'


    '; + + } + + BREAK; + + + case "magazyn2": + + echo 'Zakladka magazynu czę¶ci'; + + BREAK; + + + case "maszyny": + $pobierz_maszyne=mysql_query("select a.id_masz,a.nr_ser_mal,a.nr_ser,a.dostawca,a.lokalizacja,a.sloty,a.uwagi,b.Nazwa_typ_masz,a.status,a.stan,a.sprzedany,a.usun,a.umowa,a.dat_post from maszyny a,Typ_maszyny b where a.ID_typu=b.ID_typu and a.usun='0' and a.sprzedany='0' order by a.status,nr_ser_mal asc"); + $data1=date("Y-m-d",strtotime("+0 days",time())); + if(mysql_num_rows($pobierz_maszyne)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych maszyn!!!

    '); + + else + + { + + $color=$color1; + + echo ' + + + + + + + + + + +
    - Lokalizacja nieaktywna
    - Maszyna niesprawna
    + + + + '; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_maszyne)) + + { + + + + $color=zmien_color($color); + + $opcje1='Załadunek | '; + + $opcje2='Edytuj | '; + + //$opcje2.='Usuń'; + + $opcje3='| Rozlicz'; + + $data2 = $u['umowa']; + + if ($data2 >= date('0000-00-00')) + + { + + if ($u['status']=='Nieaktywny') + + { + + $color='#808080'; + + } + + + } + + + + if ($u['stan']=='Niesprawny') + + {$color='#FCA1A1';} + + + if ($u['status']=='Negocjacje') + + { + + $color='#FCC00F'; + + } + + + + echo '' ; + + } + + + + echo '
    Wew nr seryjnyNr seryjnyDostawcaLokalizacjaAktualny licznikUwagiTyp maszynyStatusStanFaktura VatData postawieniaOpcje
    '.$u['nr_ser_mal'].'
    '.$u['nr_ser'].'
    '.$u['dostawca'].'
    '.$u['lokalizacja'].'
    '.$u['sloty'].'
    '.$u['uwagi'].'
    '.$u['Nazwa_typ_masz'].'
    '.$u['status'].'
    '.$u['stan'].'
    '.$u['umowa'].'
    '.$u['dat_post'].'
    '.$opcje1.''.$opcje2.''.$opcje3.'
    '; + + } + + + + BREAK; + + + + case "dodaj_typ": + + ?>
    + +
    + + + + + + + + + + + + + +
    Dodaj typ maszynu
      
    Nazwa typu:
    + + + +

    + + '".$_GET['id']."'") or die(mysql_error()); + + if(strlen(trim($_POST['typ']))==0) + + echo('

    Musisz podać nazwę typu!!!

    '); + + else if (mysql_num_rows($pobierz_kategoria)>0) + + echo('

    Podane nazwa już istnieje!!!

    '); + + else + + { + + { + + + + $zapis_do_bazy=mysql_query("INSERT INTO `Typ_maszyny` ( `ID_typu` , `Nazwa_typ_masz` ) VALUES (NULL,'".$_POST['typ']."')"); + + + + if($zapis_do_bazy) + + { + + echo('


    Typ został dodany

    '); + + $_POST['typ'] = ''; + + } + + else + + echo('


    Nie można było zapisać typu w bazie

    '); + + $_POST['typ'] = ''; + + } + + } + + + + + + BREAK; + + + + case "wys_typy": + + $Typ_maszyny=mysql_query("select ID_typu, Nazwa_typ_masz from Typ_maszyny where usun='0' order by Nazwa_typ_masz asc"); + +if(mysql_num_rows($Typ_maszyny)==0) + + echo('


    W bazie nie ma wprowadzonych danych

    '); + +else + + { + + $color=$color1; + + echo '

    Lista typów

    '; + + echo '
    '; + + while($s=mysql_fetch_array($Typ_maszyny)) + + { + + $color=zmien_color($color); + + echo ''; + + } + + echo '
    Nazwa typuOpcje
     '.$s['Nazwa_typ_masz'].'Edytuj | Usun


    '; + + } + BREAK; + + + + BREAK; + + case "usun_typ": + + if(!is_numeric($_GET['id'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update Typ_maszyny SET usun='1' where ID_typu='".$_GET['id']."'"); + + if($usun) + + echo('

    Typ zostal usunięty

    '); + + else + + echo('


    Nie mozna było usun±ć typu

    '); + + } + + BREAK; + + + + case "edytuj_typ": + + if(isset($_GET['id'])) + + $mysql=mysql_fetch_array(mysql_query("select * from Typ_maszyny where ID_typu='".$_GET['id']."'")); + $id_typ=$_GET['id']; + ?>

    + +
    + + + + + + + + + + + + + +
    Edycja typu
      
    Nazwa typu:
    + + + +

    + + '".$_GET['id']."'") or die(mysql_error()); + + if(strlen(trim($_POST['typ']))==0) + + echo('

    Musisz podać nazwę typu!!!

    '); + + else if (mysql_num_rows($pobierz_kategoria)>0) + + echo('

    Podana nazwa już istnieje!!!

    '); + + else + + { + + { + + + + $zapis_do_bazy=mysql_query("update Typ_maszyny SET Nazwa_typ_masz='".$_POST['typ']."' where ID_typu='".$_POST['id']."'"); + + + + if($zapis_do_bazy) + + { + + echo('


    Typ został zedytowany

    '); + + $_POST['typ'] = ''; + + } + + else + + echo('


    Nie można było edytować typu w bazie

    '); + + $_POST['typ'] = ''; + + } + + } + + + + + + BREAK; + + + case "dodaj_prod": + + ?>

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dodaj produkt
      
    Nazwa produktu:
    Stawka VAT:
    Lokalizacja:
    Grupa produktu:
    Grupa produktu 2: + +
    Produkt w sprzedaży:
    Przypomnienie o stanie minimalnym:
    Stan minimalny:
    + + + +

    + + '".$_GET['id']."'") or die(mysql_error()); + + if(strlen(trim($_POST['typ_prod']))==0) + + echo('

    Musisz podać nazwę typu produktu!!!

    '); + + else if (mysql_num_rows($pobierz_kategoria)>0) + + echo('

    Podane nazwa już istnieje!!!

    '); + + else + + { + + { + + + + $zapis_do_bazy=mysql_query("INSERT INTO `typ_produktu` ( `ID_produktu` , `Nazwa_produktu` , `grupa_prod` , `stawka_vat`, `minimum`, `lokalizacja`, `powiadomienie`, `ID_grupy`, `chciane` ) VALUES (NULL,'".$_POST['typ_prod']."','".$_POST['grupa']."','".$_POST['stawka_vat']."','".$_POST['minimum']."','".$_POST['lokalizacja']."','".$_POST['powiadomienie']."','".$_POST['grupa2']."','".$_POST['chciane']."')"); + + + + if($zapis_do_bazy) + + { + + echo('


    Produkt został dodany

    '); + + $_POST['typ_prod'] = ''; + + } + + else + + echo('


    Nie można było zapisać typu w bazie

    '); + + $_POST['typ_prod'] = ''; + + } + + } + + + + + + BREAK; + + + case "wys_prod": + + $typ_produktu=mysql_query("select a.ID_produktu, a.Nazwa_produktu, a.grupa_prod, a.stawka_vat, a.lokalizacja, a.ID_grupy, a.minimum, a.powiadomienie, a.chciane, b.ID_grupy ,b.nazwa_grupy from typ_produktu a, grupy_produktow b where a.ID_grupy=b.ID_grupy and a.usun='0' order by a.Nazwa_produktu asc"); + +if(mysql_num_rows($typ_produktu)==0) + + echo('


    W bazie nie ma wprowadzonych danych

    '); + +else + + { + + $color=$color1; + + echo '

    Lista typów produktów

    '; + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + + $color=zmien_color($color); + + + + + + echo ''; + + } + + echo '
    Nazwa produktuGrupa produktuStawka VATLokalizacjaStan minimalnyPowiadomienieW sprzedażyGrupa produktu 2Opcje
     '.$s['Nazwa_produktu'].' '.$s['grupa_prod'].' '.$s['stawka_vat'].' '.$s['lokalizacja'].' '.$s['minimum'].' '.$s['powiadomienie'].' '.$s['chciane'].' '.$s['nazwa_grupy'].'Edytuj


    '; + + } + BREAK; + + + case "edytuj_typ_produktu": + + if(isset($_GET['id'])) + + $mysql=mysql_fetch_array(mysql_query("select * from typ_produktu where ID_produktu='".$_GET['id']."'")); + $id_typ=$_GET['id']; + ?>
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Edycja produktu
      
    Nazwa produktu:
    Stawka VAT:
    Lokalizacja:
    Przypomnienie o stanie minimalnym:
    Produkt w sprzedaży:
    Stan minimalny:
    + + + +

    + + '".$_GET['id']."'") or die(mysql_error()); + + if(strlen(trim($_POST['typ_prod']))==0) + + echo('

    Musisz podać nazwę produktu!!!

    '); + + else if (mysql_num_rows($pobierz_kategoria)>6) + + echo('

    Podana nazwa już istnieje!!!

    '); + + else + + { + + { + + + + $zapis_do_bazy=mysql_query("update typ_produktu SET Nazwa_produktu='".$_POST['typ_prod']."',stawka_vat='".$_POST['stawka_vat']."',minimum='".$_POST['minimum']."',lokalizacja='".$_POST['lokalizacja']."',powiadomienie='".$_POST['powiadomienie']."' ,chciane='".$_POST['chciane']."' where ID_produktu='".$_POST['id']."'"); + + + + if($zapis_do_bazy) + + { + + echo('


    Produkt został zedytowany

    '); + + $_POST['typ_prod'] = ''; + + } + + else + + echo('


    Nie można było zedytować produktu w bazie

    '); + + $_POST['typ_prod'] = ''; + + } + + } + + + + + + BREAK; + + + case "usun_produkt": + + if(!is_numeric($_GET['id'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update typ_produktu SET usun='1' where ID_produktu='".$_GET['id']."'"); + + if($usun) + + echo('


    Produkt zostal usunięty

    '); + + else + + echo('


    Nie mozna było usun±ć produktu

    '); + + } + + BREAK; + + + case "dodawanie_maszyny": + + + + + + + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['nr_ser']))==0) + + $blad.=('

    Musisz podać nr seryjny!!!
    '); + + if(strlen(trim($_POST['nr_ser_mal']))==0) + + $blad.=('
    Musisz podać wewnetrzny nr seryjny Malcomm!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + + + } + + else + + { + + $dodaj_maszyne=mysql_query("insert into maszyny values('','".$_POST['nr_ser_mal']."','".$_POST['nr_ser']."','".$_POST['dostawca']."','".$_POST['lokalizacja']."','".$_POST['sloty']."','".$_POST['uwagi']."','".$_POST['typ_maszyny']."','".$_POST['status']."','".$_POST['stan']."','".$_POST['data_k_umo']."','".$_POST['data_postawienia']."','0','0')"); + + if($dodaj_maszyne) + + uwaga('

    Maszyna została dodana

    '); + + else + + uwaga('


    Nie udalo sie dodać maszyny

    + +'); + + + + }//else + + break; + + + + + + + + + + case "usun_maszyne": + + + + $usun=mysql_query("update maszyny SET usun='1' where ID_masz='".$_GET['id_masz']."'"); + + if($usun) + + echo('


    Maszyna została usunieta

    '); + + else + + echo('


    Nie mozna było usun±ć maszyny

    '); + + + BREAK; + + + case "edytuj_maszyne": + $a=mysql_fetch_array(mysql_query("select * from maszyny where ID_masz='".$id_masz."'")); + + + $Typ_maszyny=mysql_query("select * from Typ_maszyny where usun='0' order by Nazwa_typ_masz asc"); + + ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Edytuj
      
    Nr seryjny:
    Nr seryjny Malcomm:
    Dostawca:
    Lokalizacja:
    Ilo¶ć slotów:
    Data postawienia:
    Data wystawienia FV:
    Stan:
    Status:
    Uwagi:

    Zmiany zostały wprowadzone

    '); + + else + + uwaga('


    Nie mozna było wprowadzić zmian

    '); + + + + + + BREAK; + + + case "rozlicz_maszyne": + + echo '

    ' ; + + + echo '
    ' ; + + + $maszyny=mysql_query("select * from maszyny where usun='0' and ID_masz=$id_masz order by nr_ser asc"); + while($m=mysql_fetch_array($maszyny)) { + + echo 'Maszyna rozliczana: ' ; echo ''; echo $m['Nr_ser_mal']; echo ' '; echo $m['lokalizacja'] ; echo ''; + $jakamaszyna=$m['Nr_ser_mal']; + $lokalizacja=$m['lokalizacja']; + } + + echo '
    ' ; + + + ?>
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      
    Rozlicza: + +
    Zabrano: PLN
    Data rozliczenia:
    Uwagi:
    Musisz podać ile zabrano gotówki!!!
    '); + + + if(strlen(trim($_POST['data_postawienia']))==0) + + $blad.=('
    Musisz podać date rozliczenia!!!
    '); + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + + + } + + else + + { + $obrot=$_POST['stan_pocz']-$zostawiono; + $rozzalicz=$_POST['stan_zysk']; + $dodaj_rozliczenie=mysql_query("insert into rozliczenie_m values('','".$_POST['stan_pocz']."','".$_POST['stan_zost']."','".$_POST['stan_zysk']."',$obrot,'".$_POST['id']."','".$_POST['data_postawienia']."','".$_POST['id_masz']."','".$_POST['uwagi']."','0')"); + + if($dodaj_rozliczenie) { + + uwaga('

    Maszyna została rozliczona

    '); + + echo 'Suma '; echo $rozzalicz; echo ' zł została dodana do zaliczek.'; + + $dodaj_zaliczke=mysql_query("insert into zaliczki values('','".$_POST['data_postawienia']."','".$_POST['id']."','gotówka ' '".$jakamaszyna."' '".$lokalizacja."',$rozzalicz,'0','0','0','5')"); + + + + + } + + else + + uwaga('


    Nie udalo sie rozliczyć maszyny

    + +'); + + + + }//else + + + + + BREAK; + + + case "zestawienie_roz": + + //Sortowanie rozliczen + + $data=date("Y-m-d",strtotime("+0 days",time())); + $uzytkownik=mysql_query("select * from uzytkownicy where usun='0' and id_sta='3' and telefon='tak' and blok='NIE' order by nazwisko asc"); + $maszyny=mysql_query("select * from maszyny where usun='0' and status='aktywny' order by Nr_ser_mal asc"); + + echo'

    '; + + + + + $kl=$kl+1; + $im=$im+1; + +} + +?> + + + + +
    '; + + + + echo'' ; + echo' '; + + + $iu=4; + $kl1=2; + + + + while($a=mysql_fetch_array($uzytkownik)) { + + + + echo ''; + + + + + $kl=$kl+1; + $iu=$iu+1; + +} + +?> + + + +
    '.$a['nazwisko'].' '.$a['imie'].'

    +
    +
    +
    +
    +
    + + ' ; + + + + $im=4; + $kl1=2; + + + + while($a=mysql_fetch_array($maszyny)) { + + + + echo '
    '.$a['Nr_ser_mal'].' '.$a['lokalizacja'].'

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    Data od Data do
    + + + + + + + +


    + = '".$_POST['data1']."' and a.data_roz <= '".$_POST['data2']."' + + + and + + (a.ID_masz like '".$_POST['idm4']."' + or a.ID_masz like '".$_POST['idm5']."' + or a.ID_masz like '".$_POST['idm6']."' + or a.ID_masz like '".$_POST['idm7']."' + or a.ID_masz like '".$_POST['idm8']."' + or a.ID_masz like '".$_POST['idm9']."' + or a.ID_masz like '".$_POST['idm10']."' + or a.ID_masz like '".$_POST['idm11']."' + or a.ID_masz like '".$_POST['idm12']."' + or a.ID_masz like '".$_POST['idm13']."' + or a.ID_masz like '".$_POST['idm14']."' + or a.ID_masz like '".$_POST['idm15']."' + or a.ID_masz like '".$_POST['idm16']."' + or a.ID_masz like '".$_POST['idm17']."' + or a.ID_masz like '".$_POST['idm18']."' + or a.ID_masz like '".$_POST['idm19']."' + or a.ID_masz like '".$_POST['idm20']."' + or a.ID_masz like '".$_POST['idm21']."' + or a.ID_masz like '".$_POST['idm22']."' + or a.ID_masz like '".$_POST['idm23']."' + or a.ID_masz like '".$_POST['idm24']."' + or a.ID_masz like '".$_POST['idm25']."' + or a.ID_masz like '".$_POST['idm26']."' + or a.ID_masz like '".$_POST['idm27']."' + or a.ID_masz like '".$_POST['idm28']."' + or a.ID_masz like '".$_POST['idm29']."' + or a.ID_masz like '".$_POST['idm30']."' + or a.ID_masz like '".$_POST['idm31']."' + or a.ID_masz like '".$_POST['idm32']."' + or a.ID_masz like '".$_POST['idm33']."' + or a.ID_masz like '".$_POST['idm34']."' + or a.ID_masz like '".$_POST['idm35']."' + or a.ID_masz like '".$_POST['idm36']."' + or a.ID_masz like '".$_POST['idm37']."' + or a.ID_masz like '".$_POST['idm38']."' + or a.ID_masz like '".$_POST['idm39']."' + or a.ID_masz like '".$_POST['idm40']."' + or a.ID_masz like '".$_POST['idm41']."' + or a.ID_masz like '".$_POST['idm42']."' + or a.ID_masz like '".$_POST['idm43']."' + or a.ID_masz like '".$_POST['idm44']."' + or a.ID_masz like '".$_POST['idm45']."' + or a.ID_masz like '".$_POST['idm46']."' + or a.ID_masz like '".$_POST['idm47']."' + or a.ID_masz like '".$_POST['idm48']."' + or a.ID_masz like '".$_POST['idm49']."' + or a.ID_masz like '".$_POST['idm50']."' + or a.ID_masz like '".$_POST['idm51']."' + or a.ID_masz like '".$_POST['idm52']."' + or a.ID_masz like '".$_POST['idm53']."' + or a.ID_masz like '".$_POST['idm54']."' + or a.ID_masz like '".$_POST['idm55']."' + or a.ID_masz like '".$_POST['idm56']."' + or a.ID_masz like '".$_POST['idm57']."' + or a.ID_masz like '".$_POST['idm58']."' + or a.ID_masz like '".$_POST['idm59']."' + or a.ID_masz like '".$_POST['idm60']."' + or a.ID_masz like '".$_POST['idm61']."' + or a.ID_masz like '".$_POST['idm62']."' + or a.ID_masz like '".$_POST['idm63']."' + or a.ID_masz like '".$_POST['idm64']."' + or a.ID_masz like '".$_POST['idm65']."' + or a.ID_masz like '".$_POST['idm66']."' + or a.ID_masz like '".$_POST['idm67']."' + or a.ID_masz like '".$_POST['idm68']."' + or a.ID_masz like '".$_POST['idm69']."' + or a.ID_masz like '".$_POST['idm70']."' + or a.ID_masz like '".$_POST['idm71']."' + or a.ID_masz like '".$_POST['idm72']."' + or a.ID_masz like '".$_POST['idm73']."' + or a.ID_masz like '".$_POST['idm74']."' + or a.ID_masz like '".$_POST['idm75']."' + or a.ID_masz like '".$_POST['idm76']."' + or a.ID_masz like '".$_POST['idm77']."' + or a.ID_masz like '".$_POST['idm78']."' + or a.ID_masz like '".$_POST['idm79']."' + or a.ID_masz like '".$_POST['idm80']."' + or a.ID_masz like '".$_POST['idm81']."' + or a.ID_masz like '".$_POST['idm82']."' + or a.ID_masz like '".$_POST['idm83']."' + or a.ID_masz like '".$_POST['idm84']."' + or a.ID_masz like '".$_POST['idm85']."' + or a.ID_masz like '".$_POST['idm86']."' + or a.ID_masz like '".$_POST['idm87']."' + or a.ID_masz like '".$_POST['idm89']."') + + + and + + (a.id like '".$_POST['id4']."' + or a.id like '".$_POST['id5']."' + or a.id like '".$_POST['id6']."' + or a.id like '".$_POST['id7']."' + or a.id like '".$_POST['id8']."' + or a.id like '".$_POST['id9']."' + or a.id like '".$_POST['id10']."' + or a.id like '".$_POST['id11']."' + or a.id like '".$_POST['id12']."' + or a.id like '".$_POST['id13']."' + or a.id like '".$_POST['id14']."' + or a.id like '".$_POST['id15']."' + or a.id like '".$_POST['id16']."' + or a.id like '".$_POST['id17']."' + or a.id like '".$_POST['id18']."' + or a.id like '".$_POST['id19']."' + or a.id like '".$_POST['id20']."' + or a.id like '".$_POST['id21']."' + or a.id like '".$_POST['id22']."' + or a.id like '".$_POST['id23']."' + or a.id like '".$_POST['id24']."' + or a.id like '".$_POST['id25']."' + or a.id like '".$_POST['id26']."' + or a.id like '".$_POST['id27']."' + or a.id like '".$_POST['id28']."' + or a.id like '".$_POST['id29']."' + or a.id like '".$_POST['id30']."' + or a.id like '".$_POST['id31']."' + or a.id like '".$_POST['id32']."' + or a.id like '".$_POST['id33']."' + or a.id like '".$_POST['id34']."' + or a.id like '".$_POST['id35']."' + or a.id like '".$_POST['id36']."' + or a.id like '".$_POST['id37']."' + or a.id like '".$_POST['id38']."' + or a.id like '".$_POST['id39']."' + ) + + + order by a.data_roz asc"); + $data1=date("Y-m-d",strtotime("+14 days",time())); + if(mysql_num_rows($pobierz_rozliczenie)==0) + + uwaga('

    W bazie nie ma żadnych wprowadzonych rozliczen!!!

    '); + + else + + { + + $color=$color1; + + + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_rozliczenie)) + + { + + + + $color=zmien_color($color); + + + + $opcje='Usuń'; + + + + + + + + + + + + + $i=$i+1; + echo '' ; + $suma=$suma+$u['obrot']; + $sumapo=$sumapo+$u['stan_pocz']; + $sumazost=$sumazost+$u['stan_zost']; + $sumazab=$sumazab+$u['stan_zysk']; + + + $idmasz=$u['ID_masz']; + $obrot=$u['stan_zysk']; + $suma1[$idmasz]=$suma1[$idmasz]+$obrot; + + + + + + + + + + + } + echo '' ; + + + + echo '
    Lp.ZabranoUżytkownikDataMaszynaUwagiOpcje
    '.$i.'
    '.$u['stan_zysk'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['data_roz'].'
    '.$u['Nr_ser_mal'].'
    '.$u['uwagi'].'
    '.$opcje.'
    '.$sumazab.' PLN
    '; + + } + + echo' '; + $maszyny=mysql_query("select * from maszyny where usun='0' order by ID_masz asc"); + + while($d=mysql_fetch_array($maszyny)) + + { + echo '' ; + + $color=zmien_color($color); + } + echo'
    MaszynaObrót
    '.$d['Nr_ser_mal'].' '.$d['lokalizacja'].'
    '.$suma1[$d['ID_masz']].'
    '; + BREAK; + + + case "usun_wpis_roz": + $usun=mysql_query("update rozliczenie_m SET usun='1' where ID_roz='".$_GET['ID_roz']."'"); + + if($usun) + + echo('

    Rozliczenie zostało usuniete

    '); + + else + + echo('


    Nie mozna było usun±ć rozliczenia

    '); + + + + BREAK; + + + case "zaladunek": + + + + $maszyny=mysql_query("select * from maszyny where usun='0' and ID_masz=$id_masz order by nr_ser asc"); + while($m=mysql_fetch_array($maszyny)) + + + + + if ($m['ID_typu']==9) { + + + //poczatek zaladunku snackomatu + $zaladunek=mysql_query("select * from zaladunek where ID_masz=$id_masz and usun=0 order by ID_zal asc"); + while($a=mysql_fetch_array($zaladunek)){ $id_ost_zal=$a['ID_zal'];} + + + + + echo '

    ' ; + echo '
    ' ; + $maszyny=mysql_query("select * from maszyny where usun='0' and ID_masz=$id_masz order by nr_ser asc"); + while($m=mysql_fetch_array($maszyny)) { + + echo 'Załadunek maszyny: ' ; echo ''; echo $m['Nr_ser_mal']; echo ' '; echo $m['lokalizacja'] ; echo ''; + + } + + echo '
    ' ; + $jakamaszyna=$m[Nr_ser_mal]; + + ?>
    + + + + + + + + + + + + + + + + + +
      
    Rozlicza: + +
    Data załadunku:
    Stan licznikow:
    +
    + Produkty snackomatu + + +
    W bazie nie ma wprowadzonych danych

    '); + +else + + { + echo'

    '; + while($s=mysql_fetch_array($typ_produktu)) { + $produkt=$s['ID_produktu']; + $szczegoly=mysql_query("select * from szcz_zal where ID_zal=$id_ost_zal and ID_produktu=$produkt order by ID_szcz asc"); + while($a=mysql_fetch_array($szczegoly)) {$ost_zost=$a['ile_zost']; $ost_cena=$a['cena'];} + $color=zmien_color($color); + echo ''; + + + + $ost_cena= 0; +$iz=$iz+1; +$ost_zost=0; + + } + + } + + + + ?> + +
    Nazwa produktuCenaOstatnio zostawionoIlo¶ć pocz±tkowaIlo¶ć dołożonaIlo¶ć końcowa
    '.$s['Nazwa_produktu'].'
    + + +
    + +
    ' ; + echo '
    ' ; + $maszyny=mysql_query("select * from maszyny where usun='0' and ID_masz=$id_masz order by nr_ser asc"); + while($m=mysql_fetch_array($maszyny)) { + + echo 'Załadunek maszyny: ' ; echo ''; echo $m['Nr_ser_mal']; echo ' '; echo $m['lokalizacja'] ; echo ''; + + } + + echo '
    ' ; + $jakamaszyna=$m[Nr_ser_mal]; + + ?>
    + + + + + + + + + + + + + + + + + +
      
    Rozlicza: + +
    Data załadunku:
    Stan licznikow:
    +
    + Produkty kawomatu + +
    W bazie nie ma wprowadzonych danych

    '); + +else + + { + echo'

    '; + while($s=mysql_fetch_array($typ_produktu)) { + + echo ''; +$iz=$iz+1; + } + + } + + + + ?> + +
    Nazwa produktuIlo¶ć dołożona
    '.$s['Nazwa_produktu'].'
    + + + +
    + +
    Musisz podać osobe rozliczaj±c±!!!
    '); + + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + + + } + + else + + { + + $dodaj_zaladunek=mysql_query("insert into zaladunek values('','".$_POST['ID_masz']."','".$_POST['id']."','".$_POST['data_zal']."','".$_POST['liczniki']."','0')"); + + if($dodaj_zaladunek) + + uwaga('

    Załadunek został dodany

    '); + + else + + uwaga('


    Nie udalo sie dodać załadunku

    + +'); + + + + }//else + + //Zapis szczegolow do bazy + $iz=1; + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod from typ_produktu where usun='0' and grupa_prod='snackomat' order by Nazwa_produktu asc"); + + + while($s=mysql_fetch_array($typ_produktu)) + + + { + + if (($_POST['akcja1'.$iz]=="" and $_POST['akcja2'.$iz]=="" and $_POST['akcja3'.$iz]=="")) {$iz=$iz+1;} else + { + $sprzedano=$_POST['sprzedaz'.$iz]-$_POST['akcja1'.$iz]; + $zarobiono=$sprzedano*$_POST['cena'.$iz]; + $dodaj_zaladunek1=mysql_query("insert into szcz_zal values('','".$_POST['ID_zal']."','".$s['ID_produktu']."','".$_POST['cena'.$iz.'']."','".$_POST['akcja1'.$iz.'']."','".$_POST['akcja2'.$iz.'']."','".$_POST['akcja3'.$iz.'']."','$sprzedano','$zarobiono','0')"); + if ($_POST['akcja2'.$iz.'']>0) {$ruch=$_POST['akcja2'.$iz.'']-2*($_POST['akcja2'.$iz.'']);} + if ($_POST['akcja2'.$iz.'']<0) {$ruch=$_POST['akcja2'.$iz.'']+2*(-($_POST['akcja2'.$iz.'']));} + if ($_POST['akcja2'.$iz.'']==0) {$ruch=0;} + + + + if ($ruch<>0) + { + $dodaj_zakup=mysql_query("insert into magazyn_ven values('','".$_POST['data_zal']."',3,'".$id."','".$s['ID_produktu']."','$ruch','0','Brak','0')"); + } + + + + $iz=$iz+1; + if($dodaj_zaladunek1) + + uwaga('


    Załadunek produktów został dodany

    '); + + else + + uwaga('


    Nie udalo sie dodać załadunku produktów

    '); + + + } + } + + + + + + + + + + //Koniec zapisu szczegolow do bazy + + + + BREAK; + + + case "załadunek_kawa": + + + + + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['id']))==0) + + $blad.=('

    Musisz podać osobe rozliczaj±c±!!!
    '); + + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + + + } + + else + + { + + $dodaj_zaladunek=mysql_query("insert into zaladunek values('','".$_POST['ID_masz']."','".$_POST['id']."','".$_POST['data_zal']."','".$_POST['liczniki']."','0')"); + + if($dodaj_zaladunek) + + uwaga('

    Załadunek został dodany

    '); + + else + + uwaga('


    Nie udalo sie dodać załadunku

    + +'); + + + + }//else + + //Zapis szczegolow do bazy kawa + + + $iz=1; + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod from typ_produktu where usun='0' and grupa_prod='kawomat' order by Nazwa_produktu asc"); + + + while($s=mysql_fetch_array($typ_produktu)) + + + { + + if ($_POST['akcja2'.$iz]==0) {$iz=$iz+1;} else + { + + $dodaj_zaladunek1=mysql_query("insert into szcz_zal values('','".$_POST['ID_zal']."','".$s['ID_produktu']."','0','0','".$_POST['akcja2'.$iz.'']."','0','0','0','0')"); + if ($_POST['akcja2'.$iz.'']>0) {$ruch=$_POST['akcja2'.$iz.'']-2*($_POST['akcja2'.$iz.'']);} + if ($_POST['akcja2'.$iz.'']<0) {$ruch=$_POST['akcja2'.$iz.'']+2*(-($_POST['akcja2'.$iz.'']));} + if ($_POST['akcja2'.$iz.'']==0) {$ruch=0;} + + $dodaj_zakup=mysql_query("insert into magazyn_ven values('','".$_POST['data_zal']."',3,'".$id."','".$s['ID_produktu']."','$ruch','0','Brak','0')"); + + + + + $iz=$iz+1; + if($dodaj_zaladunek1) + + uwaga('


    Załadunek produktów został dodany

    '); + + else + + uwaga('


    Nie udalo sie dodać załadunku produktów

    '); + + + } + } + + + + + + + + + + + + + + + + + + + + + + + //Koniec zapisu szczegolow do bazy kawa + + + + BREAK; + + + case "zestawienie_zal": + + //Sortowanie rozliczen + + $data=date("Y-m-d",strtotime("+0 days",time())); + $maszyny=mysql_query("select * from maszyny where usun='0' and sprzedany='0' order by Nr_ser_mal asc"); + + echo'

    '; + + + + echo'' ; + echo' '; + + + $iu=4; + $kl1=2; + + + + + + + echo'
    ' ; + + + + $im=4; + $kl1=2; + + + + while($a=mysql_fetch_array($maszyny)) { + + + + echo ''; + + + + + $kl=$kl+1; + $im=$im+1; + +} + +?> + + + + +
    '.$a['Nr_ser_mal'].' '.$a['lokalizacja'].'

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    Data od Data do
    + + +
    + + + +


    + = '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' + and + + (a.ID_masz like '".$_POST['idm4']."' + or a.ID_masz like '".$_POST['idm5']."' + or a.ID_masz like '".$_POST['idm6']."' + or a.ID_masz like '".$_POST['idm7']."' + or a.ID_masz like '".$_POST['idm8']."' + or a.ID_masz like '".$_POST['idm9']."' + or a.ID_masz like '".$_POST['idm10']."' + or a.ID_masz like '".$_POST['idm11']."' + or a.ID_masz like '".$_POST['idm12']."' + or a.ID_masz like '".$_POST['idm13']."' + or a.ID_masz like '".$_POST['idm14']."' + or a.ID_masz like '".$_POST['idm15']."' + or a.ID_masz like '".$_POST['idm16']."' + or a.ID_masz like '".$_POST['idm17']."' + or a.ID_masz like '".$_POST['idm18']."' + or a.ID_masz like '".$_POST['idm19']."' + or a.ID_masz like '".$_POST['idm20']."' + or a.ID_masz like '".$_POST['idm21']."' + or a.ID_masz like '".$_POST['idm22']."' + or a.ID_masz like '".$_POST['idm23']."' + or a.ID_masz like '".$_POST['idm24']."' + or a.ID_masz like '".$_POST['idm25']."' + or a.ID_masz like '".$_POST['idm26']."' + or a.ID_masz like '".$_POST['idm27']."' + or a.ID_masz like '".$_POST['idm28']."' + or a.ID_masz like '".$_POST['idm29']."' + or a.ID_masz like '".$_POST['idm30']."' + or a.ID_masz like '".$_POST['idm31']."' + or a.ID_masz like '".$_POST['idm32']."' + or a.ID_masz like '".$_POST['idm33']."' + or a.ID_masz like '".$_POST['idm34']."' + or a.ID_masz like '".$_POST['idm35']."' + or a.ID_masz like '".$_POST['idm36']."' + or a.ID_masz like '".$_POST['idm37']."' + or a.ID_masz like '".$_POST['idm38']."' + or a.ID_masz like '".$_POST['idm38']."' + or a.ID_masz like '".$_POST['idm39']."' + or a.ID_masz like '".$_POST['idm40']."' + or a.ID_masz like '".$_POST['idm41']."' + or a.ID_masz like '".$_POST['idm42']."' + or a.ID_masz like '".$_POST['idm43']."' + or a.ID_masz like '".$_POST['idm44']."' + or a.ID_masz like '".$_POST['idm45']."') + + + order by a.data_zal asc"); + $data1=date("Y-m-d",strtotime("+0 days",time())); + if(mysql_num_rows($pobierz_zaladunek)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych załadunków!!!

    '); + + else + + { + + $color=$color1; + + + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_zaladunek)) + + { + + + + $color=zmien_color($color); + + + + + + + + $i=$i+1; + echo '' ; + + //sumowanie produktow + $idzal=$u['ID_zal']; + + $szczegoly=mysql_query("select * from szcz_zal where usun='0' and ID_zal=$idzal order by ID_szcz asc"); + + while($u=mysql_fetch_array($szczegoly)) + + { + $zaro=$u['zarobiono']; + $sprzed=$u['sprzedano']; + $idprod=$u['ID_produktu']; + + $sprzedano[$idprod]=$sprzedano[$idprod]+$sprzed; + $zarobek[$idprod]=$zarobek[$idprod]+$zaro; + $sprzed1=$u['ile_dolo']; + + + $dolozono[$idprod]=$dolozono[$idprod]+$sprzed1; + + + } + + + + //koniec sumowania + + + } + + + + echo '
    Lp.MaszynaUżytkownikDataLicznikiOpcje
    '.$i.'
    '.$u['Nr_ser_mal'].' '.$u['lokalizacja'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['data_zal'].'
    '.$u['liczniki'].'
    Szczegóły
    '; + echo'
    Sprzedaz produktów (snackomat)
    Sprzedaż liczona od 21.05.2010
    '; + //wyswietlanie produktow snack + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod from typ_produktu where grupa_prod='snackomat' and usun='0' order by Nazwa_produktu asc"); + + $color=$color1; + + + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + + $color=zmien_color($color); + + echo ''; + + } + + echo '
    Nazwa produktuSprzedanoSprzedaż Brutto
     '.$s['Nazwa_produktu'].' '.$sprzedano[$s['ID_produktu']].' '.$zarobek[$s['ID_produktu']].'


    '; + + + + + //koniec wyswietlania produktow + echo '
    Sprzedaz produktów (kawomat)
    Sprzedaż liczona od 21.05.2010
    '; + //wyswietlanie produktow kawa + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod from typ_produktu where grupa_prod='kawomat' and usun='0' order by Nazwa_produktu asc"); + + $color=$color1; + + + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + + $color=zmien_color($color); + + echo ''; + + } + + echo '
    Nazwa produktuSprzedanoSprzedaż Brutto
     '.$s['Nazwa_produktu'].' '.$dolozono[$s['ID_produktu']].'


    '; + + + + + //koniec wyswietlania produktow kawa + +echo '
    '; + } + + + + + + BREAK; + + case "wyswietlanie_szczegolow": + + echo 'ID zaldunku do wyswietlenia '; echo $id_zal; + + + $pobierz_szczegol=mysql_query("select a.ID_zal,a.cena,a.zarobiono,a.ID_produktu,a.ile_zast,a.ile_dolo,a.usun,a.ile_zost,a.sprzedano,b.data_zal,c.Nazwa_produktu from szcz_zal a,zaladunek b, typ_produktu c where a.ID_zal=b.ID_zal and a.ID_zal=$id_zal and a.ID_produktu=c.ID_produktu and a.usun='0' order by c.Nazwa_produktu asc"); + + if(mysql_num_rows($pobierz_szczegol)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych szczegółów!!!

    '); + + else + + { + + $color=$color1; + + + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_szczegol)) + + { + + + + $color=zmien_color($color); + + + + + + + + $i=$i+1; + echo '' ; + $sumazarobku=$sumazarobku+$u['zarobiono']; + } + + + echo '
    '; + echo '
    Lp.ProduktCenaIlo¶ć pocz±tkowaIlo¶ć dołożonaIlo¶ć pozostawionaSprzedanoSprzedaż BruttoOpcje
    '.$i.'
    '.$u['Nazwa_produktu'].'
    '.$u['cena'].'
    '.$u['ile_zast'].'
    '.$u['ile_dolo'].'
    '.$u['ile_zost'].'
    '.$u['sprzedano'].'
    '.$u['zarobiono'].'
    '.$sumazarobku.' PLN
    '; + + } + + + + + + + BREAK; + + + + case "zestawienia_miesieczne": + + + + $data1=$_POST['rok'].$_POST['miesiac'].'01'; + $data2=$_POST['rok'].$_POST['miesiac'].'31'; + $id_masz=$_POST['maszyna']; + + + + + $rozliczenia=mysql_query("select * from rozliczenie_m where usun='0' and ID_masz=$id_masz and data_roz>='".$data1."' and data_roz<='".$data2."' order by ID_roz asc"); + + $maszyny=mysql_query("select * from maszyny where usun='0' and status='aktywny' and sprzedany='0' order by Nr_ser_mal asc"); + $zaladunki=mysql_query("select * from zaladunek where usun='0' and ID_masz=$id_masz and data_zal>='".$data1."' and data_zal<='".$data2."' order by ID_zal asc"); + + echo'
    '; + echo'
    '; + echo ''; + + echo' + + + '; + echo'
    '; + + echo'
    '; + if ($id_masz=="") {} else { + while($a=mysql_fetch_array($zaladunki)) { + + $ilosc_zaladunkow= $ilosc_zaladunkow+1; +} + while($b=mysql_fetch_array($rozliczenia)) { + + $ilosc_rozliczen= $ilosc_rozliczen+1; + $i=$i+1; + $suma=$suma+$b['obrot']; + $sumapo=$sumapo+$b['stan_pocz']; + $sumazost=$sumazost+$b['stan_zost']; + $sumazab=$sumazab+$b['stan_zysk']; + + + +} + + + + echo ''; + echo''; + echo''; + echo '
    Ilosc zaladunkow '; echo $ilosc_zaladunkow; echo '
    Ilosc rozliczen '; echo $ilosc_rozliczen; echo '
    '; + + + + + + echo '
    '; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
    Suma obrotu: '; echo $suma; echo ' PLN
    Suma pocz±tkowa: '; echo $sumapo; echo ' PLN
    Suma zostawiona: '; echo $sumazost; echo ' PLN
    Suma zabrana: '; echo $sumazab; echo ' PLN
    '; + + + + + echo '
    '; + + //sprzedaz produktow w zestawieniu + $zaladunki=mysql_query("select * from zaladunek where usun='0' and ID_masz=$id_masz and data_zal>='".$data1."' and data_zal<='".$data2."' order by ID_zal asc"); + + $data1=date("Y-m-d",strtotime("+0 days",time())); + if(mysql_num_rows($zaladunki)==0) + + uwaga('

    W bazie nie ma żadnych wproadzonych załadunków!!!

    '); + + else + + { + + $color=$color1; + + + + + while($u=mysql_fetch_array($zaladunki)) + + { + + + + $color=zmien_color($color); + + + + + + + + $i=$i+1; + + //sumowanie produktow + $idzal=$u['ID_zal']; + + $szczegoly=mysql_query("select * from szcz_zal where usun='0' and ID_zal=$idzal order by ID_szcz asc"); + + while($u=mysql_fetch_array($szczegoly)) + + { $idprod=$u['ID_produktu']; + $typ_produktu=mysql_query("select ID_produktu, stawka_vat from typ_produktu where ID_produktu=$idprod and usun='0' order by ID_produktu asc"); + while($c=mysql_fetch_array($typ_produktu)) {$vat=$c['stawka_vat'];} + + $pobierz_cene=mysql_query("select * from magazyn_ven where usun='0' and ID_produktu=$idprod and usun='0' and cena_zakupu<>0 order by data_zakupu asc"); + while($a=mysql_fetch_array($pobierz_cene)) + + { + + + $cena[$idprod]=$a['cena_zakupu']; + + } + + + + + + + $zaro=$u['zarobiono']; + $sprzed=$u['sprzedano']; + + + $sprzedano[$idprod]=$sprzedano[$idprod]+$sprzed; + $zarobek[$idprod]=$zarobek[$idprod]+$zaro; + $sprzed1=$u['ile_dolo']; + + $vaty[$idprod]=$vat; + $dolozono[$idprod]=$dolozono[$idprod]+$sprzed1; + $zarobek_netto[$idprod]=round($zarobek[$idprod]/(1+($vat/100)), 2); + $zysk[$idprod]=$zysk[$idprod]+(($zaro)-($sprzed*$cena[$idprod])); + + if ($vat==8) {$ile_vat7=$ile_vat7+$zaro;} + if ($vat==23) {$ile_vat22=$ile_vat22+$zaro;} + + + + if ($cena[$idprod]==0) {$zysk[$idprod]=0;} + + + + } + + + + //koniec sumowania + + + } + + + + echo ' '; + echo'

    Sprzedaz produktów (snackomat)
    '; + //wyswietlanie produktow snack + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod, stawka_vat from typ_produktu where grupa_prod='snackomat' and usun='0' order by Nazwa_produktu asc"); + + $color=$color1; + + + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + if ($sprzedano[$s['ID_produktu']] ==0 or $sprzedano[$s['ID_produktu']]=="") {} else { $color=zmien_color($color); + + echo ''; + $suma_brutto=$suma_brutto+$zarobek[$s['ID_produktu']]; + $suma_netto=$suma_netto+$zarobek_netto[$s['ID_produktu']]; + $suma_zysku=$suma_zysku+$zysk[$s['ID_produktu']]; + $idprod= $s['ID_produktu']; + + + + + } + } + + echo ''; + + echo '
    Nazwa produktuStawka VATSprzedanoSprzedaż BruttoSprzedaż NettoZysk brutto
     '.$s['Nazwa_produktu'].' '.$vaty[$s['ID_produktu']].'% '.$sprzedano[$s['ID_produktu']].' szt '.$zarobek[$s['ID_produktu']].' '.$zarobek_netto[$s['ID_produktu']].' zl  '.$zysk[$s['ID_produktu']].'
    '.$suma_brutto.' '.$suma_netto.' '.$suma_zysku.'


    '; + + + + + //koniec wyswietlania produktow + echo '
    Sprzedaz produktów (kawomat)'; + //wyswietlanie produktow kawa + $typ_produktu=mysql_query("select ID_produktu, Nazwa_produktu, grupa_prod from typ_produktu where grupa_prod='kawomat' and usun='0' order by Nazwa_produktu asc"); + + $color=$color1; + + + + echo '
    '; + + while($s=mysql_fetch_array($typ_produktu)) + + { + + $color=zmien_color($color); + + echo ''; + + } + + echo '
    Nazwa produktuSprzedanoZarobekVAT
     '.$s['Nazwa_produktu'].' '.$dolozono[$s['ID_produktu']].'


    '; + + + + + //koniec wyswietlania produktow kawa + +echo '
    '; +$ile_vatn7=round($ile_vat7/(1+(8/100)), 2); +$ile_vatn22=round($ile_vat22/(1+(23/100)), 2); +?> + + + + + + + + + + + + + + + + + +
    Stawka VATWarto¶ć Brutto Warto¶ć Netto
    8%
    23%
    +' ; + + + echo '
    ' ; + + + ?>
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      
    + ' ; echo ''; echo $r['nazwisko']; echo ' '; echo $r['imie'] ; echo ''; + + } + + +?> + + + +
    Produkt: + +
    Data:
    Cena: PLN BRUTTO za szt
    Zakup/Sprzedaż: Szt/Kg
    Akcja: + +
    Uwagi:
    + Musisz podać ilosc zakupionych/sprzedanych produktow!!!'); + + if(strlen(trim($_POST['cena_zakupu']))==0) + + $blad.=('
    Musisz podać cene zakupu!!!
    '); + + + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + + + } + + else + + { + + $idzakupu=$_POST['akcja']; + + $zmiana=mysql_query("select * from typ_zakupu where usun='0' and ID_typu_zakupu=$idzakupu order by Nazwa_typu_zakupu asc"); + + while($b=mysql_fetch_array($zmiana)) { $ilosc= $b['wartosc'].$_POST['ilosc']; } + + + + + + + $dodaj_zakup=mysql_query("insert into magazyn_ven values('','".$_POST['data_zakupu']."','".$_POST['akcja']."','".$id."','".$_POST['produkt']."','".$ilosc."','".$_POST['cena_zakupu']."','".$_POST['uwagi']."','0')"); + + + + + + + if($dodaj_zakup) + + uwaga('

    Wpis został dodany

    '); + + else + + uwaga('


    Nie udalo sie dodać wpisu

    + +'); + + + + }//else + + + + BREAK; + + + case "historia_zakupow": + $data=date("Y-m-d",strtotime("+0 days",time())); + + $akcja=mysql_query("select * from typ_zakupu where usun='0' order by Nazwa_typu_zakupu asc"); + $produkty=mysql_query("select * from typ_produktu where usun='0' order by Nazwa_produktu asc"); + + //sortowanie histori + + echo'

    '; + + echo'
    '; + echo''; + + + echo''; + + + + + + + echo'
    '; ?> + + + + + + + + + +
    Od: Do:
    '; + + echo'
    '; + echo ''; + echo''; + echo ''; + echo'
    '; + echo ' '; + + echo ''; + + //koniec sortowania histori + if ($_POST['produkt']<>0) {$produkt=$_POST['produkt']; $produkt2=$_POST['produkt'];} else {$produkt=1; $produkt2=99999;} + + if ($_POST['akcja']<>0) {$zakup=$_POST['akcja']; $zakup2=$_POST['akcja'];} else {$zakup=1; $zakup2=99999;} + $i=1; + $historia=mysql_query("select a.ID_mag_ven,a.id,a.ID_typu_zakupu,a.data_zakupu,a.ID_produktu,a.ruch,a.cena_zakupu,a.uwagi,a.usun,b.imie,b.nazwisko,c.Nazwa_produktu,c.ID_produktu, d.Nazwa_typu_zakupu, d.ID_typu_zakupu from magazyn_ven a,uzytkownicy b, typ_produktu c, typ_zakupu d where a.id=b.id and a.ID_typu_zakupu=d.ID_typu_zakupu and a.ID_produktu=c.ID_produktu and a.usun='0' and a.data_zakupu >= '".$_POST['data1']."' and a.data_zakupu <= '".$_POST['data2']."' and a.ID_produktu >= $produkt and a.ID_produktu <=$produkt2 and a.ID_typu_zakupu >= $zakup and a.ID_typu_zakupu <=$zakup2 order by a.data_zakupu asc"); + +if(mysql_num_rows($historia)==0) + + echo('

    W bazie nie ma wprowadzonych danych

    '); + +else + + { + + $color=$color1; + + echo '

    Lista zmian w magazynie

    '; + + echo '
    '; + + while($s=mysql_fetch_array($historia)) + + { + + $color=zmien_color($color); + + echo ''; + $i=$i+1; + } + + echo '
    Lp.DataRodzajOsobaProduktZmianyCenaUwagiOpcje
    '.$i.' '.$s['data_zakupu'].' '.$s['Nazwa_typu_zakupu'].' '.$s['nazwisko'].' '.$s['imie'].' '.$s['Nazwa_produktu'].' '.$s['ruch'].' '.$s['cena_zakupu'].' '.$s['uwagi'].'


    '; + } + + BREAK; + + + + + + } //switch + + } //if + + + +?> + diff --git a/wydruk_harmonogram.php b/wydruk_harmonogram.php new file mode 100644 index 0000000..83af444 --- /dev/null +++ b/wydruk_harmonogram.php @@ -0,0 +1,79 @@ + '; +echo ''; +$data1=date("Y-m-d"); + $data2=date("Y-m-d",strtotime("+20 days",time())); + $pobierz_userow=mysql_query("select a.id_ham,a.data_ham,a.nrseryjny,a.typ,c.akcja,d.bank,a.nrzlecenia,a.ulica,a.miasto,a.opcja,a.uwagi,a.godzina,b.nazwisko,b.imie,c.akcja,d.bank from harmonogram a,uzytkownicy b,akcja c,bank d where a.id=b.id and a.id_akc=c.id_akc and a.id_ban=d.id_ban and a.usun='0' and a.id='".$_SESSION['id']."' and data_ham >= '".$data1."' and data_ham <= '".$data2."' order by data_ham asc"); + if(mysql_num_rows($pobierz_userow)==0) + uwaga('

    W bazie nie ma wprowadzonych akcji!!!

    '); + else + { + $color=$color1; + echo ''; + echo ' + + + +

    +ul. Cieślewskich 25A
    +03-017 Warszawa
    +

    tel. 022 - 762 05 16 (wewn. 104)
    + fax 022 - 762 05 17
    + www.malcomm.pl
    +

    +
    '; + + echo '

    '; + echo '

    Zaplanowane akcje od '.$data1.' do '.$data2.'

    '; + echo '
    '; + while($u=mysql_fetch_array($pobierz_userow)) + { + + $color=zmien_color($color); + if($u['opcja']=='0') + $color='#FCA1A1'; + if($u['opcja']=='0') + $opcja='NIE'; + else if($u['opcja']=='1') + $opcja='TAK'; + $opcje1='Generuj raport'; + if($u['godzina']!='00:00:00') + { + $godzina = date('H:i',strtotime($u['godzina'])); + } + else + { + $godzina = '---'; + } + if($u['typ']!='') + { + $typ = $u['typ']; + } + else + { + $typ = '---'; + } + if($u['nrseryjny']!='') + { + $nrseryjny = $u['nrseryjny']; + } + else + { + $nrseryjny = '---'; + } + if($u['nrzlecenia']!='') + { + $nrzlecenia = $u['nrzlecenia']; + } + else + { + $nrzlecenia = '---'; + } echo '' ; + } + echo ''; + echo '
    DataAkcjaBankNr zleceniaGodzinaNr SeryjnyTypUlicaMiasto
    '.$u['data_ham'].'
    '.$u['akcja'].'
    '.$u['bank'].'
    '.$nrzlecenia.'
    '.$godzina.'
    '.$nrseryjny.'
    '.$typ.'
    '.$u['ulica'].'
    '.$u['miasto'].'
    '; +} +?> \ No newline at end of file diff --git a/wyloguj.php b/wyloguj.php new file mode 100644 index 0000000..a32624a --- /dev/null +++ b/wyloguj.php @@ -0,0 +1,9 @@ + diff --git a/zaliczki.php b/zaliczki.php new file mode 100644 index 0000000..7b8f4c5 --- /dev/null +++ b/zaliczki.php @@ -0,0 +1,1410 @@ + + + + + + +0) + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "pokaz": + + form_pokaż_zaliczki($_GET['id_zal']); + + BREAK; + + case "usun": + + if(!is_numeric($_GET['id_pz'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_zal from zaliczki_pliki where id_pz='".$_GET['id_pz']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from zaliczki_pliki where id_pz='".$_GET['id_pz']."'"); + + $zapytanie2=mysql_query("select id_zal from zaliczki_pliki where id_zal='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update zaliczki SET plik='0' where id_zal='".$n[1]."'"); + + } + + if($usun) + + { + + echo('


    Pliki zostały usunięte

    '); + + unlink ($n[0]); + + + + + + } + + else + + echo('


    Nie mozna było usun±ć pliku!

    + +'); + + } + + BREAK; + + case "edytuj": +$pobstare=mysql_fetch_array(mysql_query("select * from zaliczki where id_zal='".$_GET['id_zal']."'")); + if(!is_numeric($_GET['id_zal'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_zaliczki'])) + + form_edytuj_zaliczki($_GET['id_zal']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data_zal']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data_zal'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(($_POST['wydatki'])==0) + + $blad.=('
    Nie wybrano wydatków!!!
    '); + + if(strlen(trim($_POST['naco']))==0) + + $blad.=('
    Nie wypełniono pola na co!!!
    '); + + if (!sprawdz_koszt($_POST['zaliczka'])) + + $blad.=('
    Zła forma pola zaliczka XX.XX!!!
    '); if (!sprawdz_koszt($_POST['wydano'])) + + $blad.=('
    Zła forma pola wydano XX.XX!!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_zaliczki($_GET['id_zal']); +$ile_wydano1=$_GET[ile_wydano]; + } + + else + + { + + $edytuj_tankowania_admin=mysql_query("update zaliczki SET data_zal='".$_POST['data_zal']."',naco='".$_POST['naco']."',zaliczka='".$_POST['zaliczka']."',wydano='".$_POST['wydano']."',id_wyd='".$_POST['wydatki']."' where id_zal='".$_GET['id_zal']."'"); + + + + + + +$pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano from zaliczki a,uzytkownicy b where a.usun='0' and a.id='".$_SESSION['id']."' and a.id=b.id order by data_zal DESC"); + + + while($c=mysql_fetch_array($pobierz_userow)) + + { + + + $kto= $c['nazwisko']; + + + } + +$subject = "Nastapila edycja zaliczek"; +$tresc .= 'Przed zmianami: Dzien: '. $pobstare['data_zal'].' Wydatek '.$pobstare['wydano'].' Zaliczka '.$pobstare['zaliczka'].' PLN. Cel wydatku: '.$pobstare['naco']. "\n"; + +$tresc .= 'Po zmianach: Dzien: '. $_POST[data_zal].' Wydatek '.$_POST[wydano].' Zaliczka '.$_POST[zaliczka].' PLN. Cel wydatku: '.$_POST[naco]. " \n"; +$tresc .= 'Zmienil: '.$kto." "; + +$to2 = ""; + + +if (($kto <>'Chwatow') or ($kto <>'Jeznach')) { + + mail($to2, $subject, $tresc, $headers); + } + +$id2 = $_GET['id_zal']; + + if($edytuj_tankowania_admin) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + + + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="zaliczki/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into zaliczki_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update zaliczki SET plik='1' where id_zal='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + + + uwaga('

    Zmiany zostały wprowadzone

    '); + + } + + else + + + + uwaga('


    Nie mozna było wprowadził zmian!!!

    '); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj": + + + + if(!isset($_POST['dodaj_zaliczka'])) + + form_dodaj_zaliczka(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(false) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (false) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(($_POST['wydatki'])==0) + + $blad.=('
    Nie wybrano wydatków!!!
    '); + + if(strlen(trim($_POST['naco']))==0) + + $blad.=('
    Nie wypełniono pola na co!!!
    '); + + if (!sprawdz_koszt($_POST['zaliczka'])) + + $blad.=('
    Zła forma pola zaliczka XX.XX!!!
    '); if (!sprawdz_koszt($_POST['wydano'])) + + $blad.=('
    Zła forma pola wydano XX.XX!!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_zaliczka(); + + } + + else + + { + $dzisiaj = date('Y-m-d'); + + $dodaj_kilometry=mysql_query("insert into zaliczki values('','".$dzisiaj."','".$_SESSION['id']."','".$_POST['naco']."','".$_POST['zaliczka']."','".$_POST['wydano']."','0','0','".$_POST['wydatki']."')"); + + $id2 = mysql_insert_id(); + + if($dodaj_kilometry) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="zaliczki/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into zaliczki_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update zaliczki SET plik='1' where id_zal='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + uwaga('

    Zaliczka została dodana

    '); + + } + + else + + uwaga('


    Nie można było dodaż zaliczki

    '); + + } + + }//else + + break; + + case "show": + + // pobieranie userów + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano from zaliczki a,uzytkownicy b where a.usun='0' and a.id='".$_SESSION['id']."' and a.id=b.id order by data_zal DESC"); + + + + + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_zaliczki(); + + $zapytanie=mysql_query("select (sum(zaliczka)-sum(wydano)) AS wynik from zaliczki where usun='0' and id='".$_SESSION['id']."'"); + + $z= mysql_fetch_array($zapytanie); + + + + echo '

    '; + + echo "Stan zaliczki : ".$z[wynik]. " PLN

    "; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + //$opcje2='Edytuj'; + + + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + } + + echo '
    DataUżytkownikNa coZaliczkaWydanoPlikiOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + +case "show2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano from zaliczki a,uzytkownicy b where a.usun='0' and a.id='".$_SESSION['id']."' and a.data_zal>='".$data2."' and a.data_zal<='".$data."' and a.id=b.id order by data_zal DESC"); + + + + + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_zaliczki(); + + $zapytanie=mysql_query("select (sum(zaliczka)-sum(wydano)) AS wynik from zaliczki where usun='0' and id='".$_SESSION['id']."'"); + + $z= mysql_fetch_array($zapytanie); + + + + echo '

    '; + + echo "Stan zaliczki : ".$z[wynik]. " PLN

    "; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + //$opcje2='Edytuj'; + + + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + } + + echo '
    DataUżytkownikNa coZaliczkaWydanoPlikiOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_zaliczka": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.naco like '%".$_POST['naco']."%' and b.id='".$_SESSION['id']."' order by data_zal DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.naco like '%".$_POST['naco']."%' and b.id='".$_SESSION['id']."' and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' order by data_zal DESC"); + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + + echo '

    '; + + //echo "Stan zaliczki : ".$z[wynik]. " PLN

    "; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + //$opcje2='Edytuj'; + + + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + } + + echo '
    DataUżytkownikNa coZaliczkaWydanoPlikiOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + } //switch + + } //if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + + else + + { + +echo ' + + + + + + + + + + + +

    '; + +IF(isset($_GET['akcja'])) + + { + + switch($_GET['akcja']) + + { + + case "usun_admin": + + if(!is_numeric($_GET['id_zal'])) + + uwaga('Brak danych!'); + + else + + { + + $usun=mysql_query("update zaliczki SET usun='1' where id_zal='".$_GET['id_zal']."'"); + + if($usun) + + echo('


    Zaliczka została usunięta

    + +'); + + else + + echo('


    Nie mozna było usun±ć + + Zaliczki

    + +'); + + } + + BREAK; + + case "pokaz_admin": + + form_pokaż_zaliczki($_GET['id_zal']); + + BREAK; + + case "usun_plik": + + if(!is_numeric($_GET['id_pz'])) + + uwaga('Brak danych!'); + + else + + { + + $usun_plik=mysql_query("select nazwa,id_zal from zaliczki_pliki where id_pz='".$_GET['id_pz']."'"); + + $n=mysql_fetch_array($usun_plik); + + $usun=mysql_query("delete from zaliczki_pliki where id_pz='".$_GET['id_pz']."'"); + + $zapytanie2=mysql_query("select id_zal from zaliczki_pliki where id_zal='".$n[1]."'"); + + $z=mysql_fetch_array($zapytanie2); + + if ($z[0]==0) + + { + + $zapytanie3=mysql_query("update zaliczki SET plik='0' where id_zal='".$n[1]."'"); + + } + + if($usun) + + { + + echo('


    Plik został usunięty

    + +'); + + unlink ($n[0]); + + + + + + } + + else + + echo('


    Nie mozna było usun±ć pliku

    '); + + } + + BREAK; + + case "edytuj_admin": + + if(!is_numeric($_GET['id_zal'])) + + uwaga(BLAD. ' Brak danych!'); + + else + + { + + if(!isset($_POST['edytuj_zaliczki_admin'])) + + form_edytuj_zaliczki_admin($_GET['id_zal']); + + else + + { + + $blad=''; + + if(strlen(trim($_POST['data_zal']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data_zal'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(($_POST['id'])==0) + + $blad.=('
    Nie wybrano inżyniera!!!
    '); + + if(($_POST['wydatki'])==0) + + $blad.=('
    Nie wybrano wydatków!!!
    '); + + if(strlen(trim($_POST['naco']))==0) + + $blad.=('
    Nie wypełniono pola na co!!!
    '); + + if (!sprawdz_koszt($_POST['zaliczka'])) + + $blad.=('
    Zła forma pola zaliczka XX.XX!!!
    '); if (!sprawdz_koszt($_POST['wydano'])) + + $blad.=('
    Zła forma pola wydano XX.XX!!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_edytuj_zaliczki_admin($_GET['id_zal']); + + } + + else + + { + + $edytuj_tankowania_admin=mysql_query("update zaliczki SET data_zal='".$_POST['data_zal']."',id='".$_POST['id']."',naco='".$_POST['naco']."',zaliczka='".$_POST['zaliczka']."',wydano='".$_POST['wydano']."',id_wyd='".$_POST['wydatki']."' where id_zal='".$_GET['id_zal']."'"); + +$id2 = $_GET['id_zal']; + + if($edytuj_tankowania_admin) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="zaliczki/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into zaliczki_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update zaliczki SET plik='1' where id_zal='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + + + uwaga('

    Zmiany zostały wprowadzone

    + +'); + + } + + else + + + + uwaga('


    Nie mozna było wprowadzić zmian

    + +'); + + } + + }//else + + } //else + + BREAK; + + } //switch + +} //if + + + + + +if(isset($_GET['kto'])) // opcje głowne .. czyli dodawanie userów i wyswietlanie ich zarzadzanai + + { + + switch($_GET['kto']) + + { + + case "dodaj_admin": + + + + if(!isset($_POST['dodaj_zaliczka_admin'])) + + form_dodaj_zaliczka_admin(); // jezeli nie probowano dodac usera to wyswietla formularz + + + + else + + { + + // sprawdzanie formularza + + $blad=''; + + if(strlen(trim($_POST['data']))==0) + + $blad.=('

    Nie podano daty!!!
    '); + + else if (!sprawdz_date($_POST['data'])) + + $blad.=('
    Zła forma daty RRRR-MM-DD !!!
    '); + + if(($_POST['id'])==0) + + $blad.=('
    Nie wybrano inżyniera!!!
    '); + + if(($_POST['wydatki'])==0) + + $blad.=('
    Nie wybrano wydatków!!!
    '); + + if(strlen(trim($_POST['naco']))==0) + + $blad.=('
    Nie wypełniono pola na co!!!
    '); + + if (!sprawdz_koszt($_POST['zaliczka'])) + + $blad.=('
    Zła forma pola zaliczka XX.XX!!!
    '); if (!sprawdz_koszt($_POST['wydano'])) + + $blad.=('
    Zła forma pola wydano XX.XX!!!
    '); + + // koniec sprawdzania danych + + if($blad) + + { + + uwaga($blad); + + form_dodaj_zaliczka_admin(); + + } + + else + + { + + $dodaj_kilometry_admin=mysql_query("insert into zaliczki values('','".$_POST['data']."','".$_POST['id']."','".$_POST['naco']."','".$_POST['zaliczka']."','".$_POST['wydano']."','0','0','".$_POST['wydatki']."')"); + + $id2 = mysql_insert_id(); + + if($dodaj_kilometry_admin) + + { + +$p_pojemnosc=$_FILES['plik1']['size'];//pojemnosc pliku + +$p_typ=$_FILES['plik1']['type']; // typ pliku + +$p_nazwa=$_FILES['plik1']['name']; // nazwa pliku + +$p_smiec=$_FILES['plik1']['tmp_name']; // chwilowa nazwa pliku + + + +$p_roz= array_pop(explode(".", $p_nazwa)); + + + +$max_size=round(($_POST['max_file_size']/1048576),3)."MB"; + + + +$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; + +$losowa = rand(1,100000000); + +$liczba = $losowa + $p_pojemnosc; + +$p_nazwa_zm=(md5($liczba)).".".$p_roz; + +$folder="zaliczki/"; + +if (($_FILES['plik1']['type']=="image/pjpeg") OR ($_FILES['plik1']['type']=="image/jpeg") OR ($_FILES['plik1']['type']=="application/pdf")){ + + if(@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm)) { + + echo "
    Przeslanie pliku powiodło się - ".$k_nieb.$p_nazwa.""." ".$poj_MB."
    "; + + $path_file=$folder.$p_nazwa_zm; + + $zapytanie=mysql_query("insert into zaliczki_pliki values('','.$id2.','$path_file')"); + + $zapytanie2=mysql_query("update zaliczki SET plik='1' where id_zal='".$id2."'"); + +} + +else + +{ + +exit('
    Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub plik jest za duży - max 250 kB
    '); + +} + +} + + uwaga('

    Zaliczka została dodana

    '); + + } + + else + + uwaga('


    Nie można było dodaż zaliczki

    + +'); + + } + + }//else + + break; + + // pobieranie userów + + + + + + + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id order by data_zal DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('


    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_zaliczki_admin() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + } + + echo '
    DataUżytkownikNa coZaliczkaWydanoPlikiOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$plik.'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "show_admin2": + + // pobieranie userów + + $data=date("Y-m-d",strtotime("-0 days",time())); + + $data2=date("Y-m-d",strtotime("-30 days",time())); + + + + + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.data_zal>='".$data2."' and a.data_zal<='".$data."' order by data_zal DESC"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + $color=$color1; + +form_szukaj_zaliczki_admin() ; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + } + + echo '
    DataUżytkownikNa coZaliczkaWydanoOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$opcje1.''.$opcje2.'
    '; + + } + + BREAK; + + case "szukaj_zaliczka_admin": + + // pobieranie userów + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.naco like '%".$_POST['naco']."%' order by data_zal DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.id='".$_POST['id']."' and a.naco like '%".$_POST['naco']."%' order by data_zal DESC"); + + } + + } + + else + + { + + if ($_POST['id']==0) + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.naco like '%".$_POST['naco']."%' order by data_zal DESC"); + + } + + else + + { + + $pobierz_userow=mysql_query("select a.id_zal,a.data_zal,b.nazwisko,b.imie,a.naco,a.plik,a.zaliczka,a.wydano,a.id from zaliczki a,uzytkownicy b where a.usun='0' and a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id='".$_POST['id']."' and a.naco like '%".$_POST['naco']."%' order by data_zal DESC"); + + } + + } + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + + //$_POST['data1']=''; + + //$_POST['data2']=''; + + //$_POST['naco']=''; + + form_szukaj_zaliczki_admin() ; + + } + + $color=$color1; + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + + $zapytanie=mysql_query("select (sum(zaliczka)-sum(wydano)) AS wynik from zaliczki where usun='0' and id='".$_POST['id']."'"); + + } + + else + + { + + $zapytanie=mysql_query("select (sum(zaliczka)-sum(wydano)) AS wynik from zaliczki where usun='0' and id='".$_POST['id']."'"); + + } + + $z= mysql_fetch_array($zapytanie); + + + + + + echo '

    '; + + if ($_POST['id']!=0) + + { + + echo "Stan zaliczki : ".$z[wynik]. " PLN

    "; + + } + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + + $opcje1='Pokaż | '; + + $opcje2='Edytuj | '; + + $opcje2.='Usuń'; + + if(strlen(trim($u['plik'])==1)) + + $plik='JEST'; + + else + + $plik='BRAK'; + + echo '' ; + + + + } + + if (($_POST['data1']==0) or ($_POST['data2']==0)) + + { + $zapytanie=mysql_query("select sum(zaliczka) as zaliczka,sum(wydano) as wydano from zaliczki where usun='0' and id='".$_POST['id']."' and naco like'%".$_POST['naco']."%'"); + + } else { + + +if (($_POST['data1']==0) or ($_POST['data2']==0) and ($_POST['naco']=='')) + +{ + +$zapytanie=mysql_query("select sum(zaliczka) as zaliczka,sum(wydano) as wydano from zaliczki where usun='0' and id='".$_POST['id']."'"); + +} + +else + +{ + if ($_POST['naco']=='') { + $zapytanie=mysql_query("select sum(zaliczka) as zaliczka,sum(wydano) as wydano from zaliczki where usun='0' and id='".$_POST['id']."' and data_zal >= '".$_POST['data1']."' and data_zal <= '".$_POST['data2']."'"); + } + else + { + + + $zapytanie=mysql_query("select sum(zaliczka) as zaliczka,sum(wydano) as wydano from zaliczki where usun='0' and id='".$_POST['id']."' and data_zal >= '".$_POST['data1']."' and data_zal <= '".$_POST['data2']."' and naco like '%".$_POST['naco']."%'"); + + } + } + + } + + $z= mysql_fetch_array($zapytanie); + + if ($_POST['id']!=0) + + { + + echo '
    DataUżytkownikNa coZaliczkaWydanoOpcje
    '.$u['data_zal'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['naco'].'
    '.$u['zaliczka'].'
    '.$u['wydano'].'
    '.$opcje1.''.$opcje2.'
    '; + + echo '
    '; + + echo "Suma zaliczka : ".$z[zaliczka]. " PLN"; + + echo ' '; + + echo "Suma wydano : ".$z[wydano]. " PLN"; + + } + + echo '
    '; + + + + BREAK; + + } //switch + + } //if + +} + + ?> + diff --git a/zaliczki.php.add b/zaliczki.php.add new file mode 100644 index 0000000..60d8bb9 --- /dev/null +++ b/zaliczki.php.add @@ -0,0 +1,12 @@ + +
    '; +form_zestawienie_czasu(); +} +else +{ +if ($_POST['id']==0) +{ +echo '

    Nie wybrano technika - spróbuj ponownie...

    '; +} +else +{ +/* +$sql = mysql_query("TRUNCATE temp_czas"); +$pobierz_userow=mysql_query("SELECT a.data as data , b.id AS id, b.nazwisko AS nazwisko, b.imie AS imie, a.godzroz, a.godzprzy +FROM raporty a, uzytkownicy b +WHERE a.id = b.id +AND a.data >= '2009-05-01' +AND a.data <= '2009-05-30' +AND a.id = '14' +GROUP BY a.data +LIMIT 0 , 30"); + while($u=mysql_fetch_array($pobierz_userow)) + { + $id_user = $u[id]; + $data = $u[data]; + $nazwisko = $u[nazwisko]; + $imie = $u[imie]; + $roznica1= strtotime('01.01.1970 ' . $u['godzprzy']); + //$roznica1 = ($u[godzprzy] - $u[godzroz]); + $temp = mysql_query("INSERT INTO `temp_czas` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6`, `temp7` ) +VALUES ( +'$id_user', '$data','$nazwisko', '$imie', '$roznica1', '0', '0' +)"); +} +$pobierz_userow2=mysql_query("select a.data,a.id,b.id,a.godzroz from raporty a,uzytkownicy b where a.id=b.id and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."' and a.id='{$u['id']}' group by a.data"); + while($z=mysql_fetch_array($pobierz_userow2)) + { + + + + + + $imie = $z[imie]; + /*$temp = mysql_query("INSERT INTO `temp_czas` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` ) +VALUES ( +'$id_user', '$nazwisko', '$imie', '0', '0', '0' +)"); +} +*/ + + +$sql = mysql_query("TRUNCATE temp"); + + + +echo '

    Zestawienie czasu pracy od '.$data1.' do '.$data2.'

    '; + $uzytkownicy = mysql_query("SELECT id,imie,nazwisko FROM uzytkownicy where id='".$_POST['id']."' group by nazwisko"); + $color=$color1; + while ($u = mysql_fetch_array($uzytkownicy)) + { + echo '
    technik: '.$u['nazwisko'].' '.$u['imie'].'
    '; + echo '
    '; + $color=zmien_color($color); + echo '
    '; + $zlecenia = mysql_query("select b.imie,b.nazwisko,a.nrzlecenia,a.godzzak,a.id_rap,a.godzroz,a.data,SUBTIME(godzzak, godzroz) as przy_bankomacie,SUBTIME(godzroz, godzwyj) as poza1,SUBTIME(godzprzy, godzzak) as poza2 from raporty a,uzytkownicy b where a.id=b.id and a.data >= '".$_POST['data1']."' and a.data <= '".$_POST['data2']."'and a.id='{$u['id']}' group by a.id_rap order by a.data"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + + while($x = mysql_fetch_array($zlecenia)) + { + if ($x['przy_bankomacie']=='00:00:00') + { + echo '
    '; + } + else + { + $data = $x['data']; + $imie = $x['imie']; + $nazwisko = $x['nazwisko']; + $czas_dojazdu = $x['poza1']; + $przy_bankomacie = $x['przy_bankomacie']; + $czas_powrotu = $x['poza2']; + + $temp = mysql_query("INSERT INTO `temp` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` ) +VALUES ( +'$data', '$imie', '$nazwisko', '$czas_dojazdu', '$przy_bankomacie', '$czas_powrotu' +)"); + + echo '
    '; + } + } + echo '
    DataNr zleceniaCzas dojazduCzas przy bankomacieCzas powrotu
    '.$x['data'].'
    '.$x['nrzlecenia'].''.($x['poza1']).''.($x['przy_bankomacie']).''.($x['poza2']).'
    '.$x['data'].'
    '.$x['nrzlecenia'].''.($x['poza1']).''.($x['przy_bankomacie']).''.($x['poza2']).'
    '; + echo '
    Eksport do Excel`a
    '; + echo ''; + $przy_bankomacie = 0; + } + } +} +} +?> \ No newline at end of file diff --git a/zestawienie_klometrow.php b/zestawienie_klometrow.php new file mode 100644 index 0000000..18bbc6b --- /dev/null +++ b/zestawienie_klometrow.php @@ -0,0 +1,130 @@ += '".$_POST['data1']."' and a.data_kil <= '".$_POST['data2']."' group by b.temp2"); + while($z=mysql_fetch_array($pobierz_userow2)) + { + $id1 = $z[id]; + $sluzbowe = $z[kilometry]; + $temp = mysql_query("update temp_kilometry SET temp4='".$sluzbowe."' where temp1='".$id1."'"); + $sluzbowe = '0'; +} +$pobierz_userow3=mysql_query("select b.temp1 as id,sum(a.przejechano) as kilometry from kilometry a,temp_kilometry b where a.id=b.temp1 and a.usun='0' and a.wyjazd='1' and a.data_kil >= '".$_POST['data1']."' and a.data_kil <= '".$_POST['data2']."' group by b.temp2"); + while($y=mysql_fetch_array($pobierz_userow3)) + { + $id2 = $y[id]; + $sluzbowe2 = $y[kilometry]; + $temp = mysql_query("update temp_kilometry SET temp5='".$sluzbowe2."' where temp1='".$id2."'"); + $sluzbowe = '0'; +} +$pobierz_userow4=mysql_query("select b.temp1 as id,sum(a.przejechano) as kilometry from kilometry a,temp_kilometry b where a.id=b.temp1 and a.usun='0' and a.data_kil >= '".$_POST['data1']."' and a.data_kil <= '".$_POST['data2']."' group by b.temp2"); + while($x=mysql_fetch_array($pobierz_userow4)) + { + $id3 = $x[id]; + $sluzbowe3 = $x[kilometry]; + $temp = mysql_query("update temp_kilometry SET temp6='".$sluzbowe3."' where temp1='".$id3."'"); + $sluzbowe = '0'; +} + + +$pobierz_userow5=mysql_query("select * from temp_kilometry group by temp2"); +$data1 = $_POST['data1']; +$data2 = $_POST['data2']; +if(mysql_num_rows($pobierz_userow)==0) +{ + uwaga('

    Nie okre¶lono zakresu dat - spróbuj ponownie...

    '); +form_zestawienie_km(); +} + else + { + $color=$color1; + echo '

    Zestawienie kilometrow od '.$data1.' do '.$data2.'

    '; + echo '
    '; + while($a=mysql_fetch_array($pobierz_userow5)) + { + $roznica = ($z['kilometry'] - $u['kilometry']); + + $color=zmien_color($color); + echo '' ; + $nazwisko = $a[temp2]; + $imie = $a[temp3]; + $sluzbowe = $a[temp4]; + $prywatne = $a[temp5]; + $suma = $a[temp6]; + $sql2 = mysql_query("INSERT INTO `temp` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` , `trmp7` , `tmp8` ) +VALUES ( +'$nazwisko', '$imie', '$sluzbowe', '$prywatne', '$suma', '', '', '' +)"); + } + echo '
    Imie NazwiskoSłużobowePrywatneSuma
    '.$a['temp2'].' '.$a['temp3'].'
    '.$a['temp4'].' km
    '.$a['temp5'].' km
    '.$a['temp6'].' km
    '; + echo '
    Eksport do Excel`a
    '; + + } + +} +else +{ +$pobierz_userow3=mysql_query("select b.id,b.imie,b.nazwisko,sum(a.przejechano) as kilometry from kilometry a,uzytkownicy b where a.id=b.id and a.usun='0' and a.wyjazd='0' and a.data_kil >= '".$_POST['data1']."' and a.data_kil <= '".$_POST['data2']."' and b.id='".$_POST['id']."'"); +$pobierz_userow4=mysql_query("select b.id,b.imie,b.nazwisko,sum(a.przejechano) as kilometry from kilometry a,uzytkownicy b where a.id=b.id and a.usun='0' and a.data_kil >= '".$_POST['data1']."' and a.data_kil <= '".$_POST['data2']."' and b.id='".$_POST['id']."'"); +$data1 = $_POST['data1']; +$data2 = $_POST['data2']; +if(mysql_num_rows($pobierz_userow3)==0) +{ + uwaga('

    Nie okre¶lono zakresu dat - spróbuj ponownie...

    '); +form_zestawienie_km(); +} + else + { + $sql = mysql_query("TRUNCATE temp"); + $color=$color1; + echo '

    Zestawienie kilometrow od '.$data1.' do '.$data2.'

    '; + echo '
    '; + while($x=mysql_fetch_array($pobierz_userow3) and $y=mysql_fetch_array($pobierz_userow4)) + { + $roznica = ($y['kilometry'] - $x['kilometry']); + $s1 = $x['kilometry']; + if ($s1=='') + $s2 = "0"; + else + $s2 = $s1; + + $s3 = $y['kilometry']; + if ($s3=='') + $s4 = "0"; + else + $s4 = $s3; + $color=zmien_color($color); + echo '' ; + $nazwisko = $x[nazwisko]; + $imie = $x[imie]; + + if ($x['kilometry']=='') + $sluzbowe = '0'; + else + $sluzbowe = $x['kilometry']; + + $prywatne = $roznica; + $suma = $y['kilometry']; + $sql2 = mysql_query("INSERT INTO `temp` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` , `trmp7` , `tmp8` ) +VALUES ( +'$nazwisko', '$imie', '$sluzbowe', '$prywatne', '$suma', '', '', '' +)"); + } + echo '
    Imie NazwiskoSłużobowePrywatneSuma
    '.$x['nazwisko'].' '.$x['imie'].'
    '.$s2.' km
    '.$roznica.' km
    '.$s4.' km
    '; + echo '
    Eksport do Excel`a
    '; + + } +} +?> \ No newline at end of file diff --git a/zestawienie_klometry_raport.php b/zestawienie_klometry_raport.php new file mode 100644 index 0000000..5efa652 --- /dev/null +++ b/zestawienie_klometry_raport.php @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/zestawienie_klometry_raport2.php b/zestawienie_klometry_raport2.php new file mode 100644 index 0000000..3ca29ee --- /dev/null +++ b/zestawienie_klometry_raport2.php @@ -0,0 +1,46 @@ + \ No newline at end of file diff --git a/zestawienie_paliwo.php b/zestawienie_paliwo.php new file mode 100644 index 0000000..7e845ed --- /dev/null +++ b/zestawienie_paliwo.php @@ -0,0 +1,68 @@ + = '".$_POST['data1']."' and a.data_tan<= '".$_POST['data2']."' order by data_tan desc"); + + if(mysql_num_rows($pobierz_userow)==0) + + uwaga('

    W bazie nie ma wprowadzonych żadnych danych!!!

    '); + + else + + { + +form_szukaj_tankowania(); + + + + $color=$color1; + + echo '

    '; + + while($u=mysql_fetch_array($pobierz_userow)) + + { + + if($u['wyjazd']=='0') $trasa='Służbowy'; else { $trasa= 'Prywatny';} + + $color=zmien_color($color); + + if($u['blok']=='TAK') + + $color='red'; + $li=$li+1; + $opcje1='Pokaż | '; + + $opcje2='Edytuj'; + + echo '' ; + + $pierwszy[$li]=$u['stankm']; + $ostatni[$li]=$u['stankm']; + $sumapaliwa=$sumapaliwa+$u['litry']; + + } + + echo '
    DataUżytkownikAutoStanKmLitryWyjazdOpcje
    '.$u['data_tan'].'
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$u['auto'].'
    '.$u['stankm'].'
    '.$u['litry'].'
    '.$trasa.'
    '.$opcje1.''.$opcje2.'
    '; + + } $sumakilometrow=$pierwszy[1]-$ostatni[$li]; + echo '
    '; + echo 'Suma zatankowanego paliwa: ' .$sumapaliwa; + echo '
    '; + echo 'Ilosc przejechanych kilometrow: ' .$sumakilometrow; + + $sredniespalanie=($sumapaliwa*100)/$sumakilometrow; + + echo '
    '; + echo 'Srednie spalanie: ' .round($sredniespalanie, 2); + + + + + + + ?> diff --git a/zestawienie_zaliczek.php b/zestawienie_zaliczek.php new file mode 100644 index 0000000..5759eb0 --- /dev/null +++ b/zestawienie_zaliczek.php @@ -0,0 +1,162 @@ +

    Nie okre¶lono zakresu dat - spróbuj ponownie...

    '; +form_zestawienie_zaliczek(); +} +else +{ +if ($_POST['id']==0) +{ +//wiele +$sql = mysql_query("TRUNCATE temp"); +echo '

    Zestawienie wydatków od '.$data1.' do '.$data2.'

    '; + $uzytkownicy = mysql_query("SELECT id,imie,nazwisko FROM uzytkownicy where id_sta='3' and blok='NIE' group by nazwisko"); + $color=$color1; + echo '
    Imie NazwiskoPaliwoNoclegiInneSuma
    '; + + while ($u = mysql_fetch_array($uzytkownicy)) + { + $color=zmien_color($color); + + echo '
    '; + $zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '1' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($x = mysql_fetch_array($zlecenia)) + { + $suma1 = $x['wydatki']; + echo ''; + } + } + else + { + $suma1 = '0'; + echo ''; + } +$zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '2' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($y = mysql_fetch_array($zlecenia)) + { + $suma2 = $y['wydatki']; + echo ''; + } + } + else + { + $suma2 = '0'; + echo ''; + } +$zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '3' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($z = mysql_fetch_array($zlecenia)) + { + $suma3 = $z['wydatki']; + echo ''; + } + } + else + { + $suma3 = '0'; + echo ''; + } + $suma = $suma1 + $suma2 + $suma3; + $s = sprintf("%.2f", $suma); + echo ''; + $nazwisko = $u['nazwisko']; + $imie = $u['imie']; + $sql2 = mysql_query("INSERT INTO `temp` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` , `trmp7` , `tmp8` ) +VALUES ( +'$nazwisko', '$imie', '$suma1', '$suma2', '$suma3', '$s', '', '' +)"); + $suma1 = 0; + $suma2 = 0; + $suma3 = 0; +} + echo '
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$x['wydatki'].' PLN
    '.$suma1.' PLN
    '.$y['wydatki'].' PLN
    '.$suma2.' PLN
    '.$z['wydatki'].' PLN
    '.$suma3.' PLN
    '.$s.' PLN
    '; + echo '
    Eksport do Excel`a
    '; +} +// +else +{ +//jeden +$sql = mysql_query("TRUNCATE temp"); +echo '

    Zestawienie wydatków od '.$data1.' do '.$data2.'

    '; + $uzytkownicy = mysql_query("SELECT id,imie,nazwisko FROM uzytkownicy where id='".$_POST['id']."' group by nazwisko"); + $color=$color1; + echo '
    Imie NazwiskoPaliwoNoclegiInneSuma
    '; + +while ($u = mysql_fetch_array($uzytkownicy)) + { + $color=zmien_color($color); + + echo '
    '; + $zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '1' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($x = mysql_fetch_array($zlecenia)) + { + $suma1 = $x['wydatki']; + echo ''; + } + } + else + { + $suma1 = '0'; + echo ''; + } +$zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '2' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($y = mysql_fetch_array($zlecenia)) + { + $suma2 = $y['wydatki']; + echo ''; + } + } + else + { + $suma2 = '0'; + echo ''; + } +$zlecenia = mysql_query("select b.imie,b.nazwisko,sum(a.wydano) as wydatki from zaliczki a,uzytkownicy b where a.id=b.id and a.data_zal >= '".$_POST['data1']."' and a.data_zal <= '".$_POST['data2']."' and a.id_wyd = '3' and a.usun='0' and a.id='{$u['id']}' group by b.nazwisko"); + $ile = mysql_num_rows($zlecenia); + if ($ile) + { + while($z = mysql_fetch_array($zlecenia)) + { + $suma3 = $z['wydatki']; + echo ''; + } + } + else + { + $suma3 = '0'; + echo ''; + } + $suma = $suma1 + $suma2 + $suma3; + $s = sprintf("%.2f", $suma); + echo ''; + $nazwisko = $u['nazwisko']; + $imie = $u['imie']; + $sql2 = mysql_query("INSERT INTO `temp` ( `temp1` , `temp2` , `temp3` , `temp4` , `temp5` , `temp6` , `trmp7` , `tmp8` ) +VALUES ( +'$nazwisko', '$imie', '$suma1', '$suma2', '$suma3', '$s', '', '' +)"); + $suma1 = 0; + $suma2 = 0; + $suma3 = 0; + echo '
    '.$u['nazwisko'].' '.$u['imie'].'
    '.$x['wydatki'].' PLN
    '.$suma1.' PLM
    '.$y['wydatki'].' PLN
    '.$suma2.' PLN
    '.$z['wydatki'].' PLN
    '.$suma3.' PLN
    '.$s.' PLN
    '; + } + echo '
    Eksport do Excel`a
    '; +} +} +// +?> \ No newline at end of file diff --git a/zestawienie_zaliczek_raport.php b/zestawienie_zaliczek_raport.php new file mode 100644 index 0000000..53cebeb --- /dev/null +++ b/zestawienie_zaliczek_raport.php @@ -0,0 +1,47 @@ + \ No newline at end of file