```/* <![CDATA[ */
2/*
3
4 magazinelayout.class.php
5
6 Introduction
7 ============
8 A class for creating magazine-like layouts for images. A Magazine-like layout arranges the images at
9 different sizes so that all images fit within a defined "square box". This can be an attractive way
10 of arranging images when you are dealing with user-uploaded images, or don't have a graphic designer
11 handy to arrange and resize them in photoshop.
12
13 Purpose
14 =======
15 The obvious use for this script is anywhere where more than one user submitted image needs to be presented
16 in a HTML page. I'm thinking product databases, forum image uploads, random image rotations, etc etc.
17 Once you have 10 or so images, you are better off using an AJAX based image gallery, but this script will
18 fill the gap nicely up till that point.
19
20 Layouts
21 =======
22 The layouts that are used depend on the number of landscape and portrait images. For example, if we are
23 given a portrait and 2 landscapes, the layout will appear as follows (different numbers represent different
24 images)...
25
26 11113333
27 11113333
28 22223333
29 22223333
30
31 With 3 landscapes, the layout may appear as such...
32
33 11112222
34 11112222
35 33333333
36 33333333
37
38 With 2 portraits, 1 landscape we use
39
40 11122222222333  or  111222
41 11122222222333      111222
42 11122222222333      333333
43                     333333
44
45 With 3 portraits, we could use either
46
47 111222333  or   11333
48 111222333       11333
49 111222333       22333
50                 22333
51
52 If you have 4 images to display, this class will use any of the following...
53
54 111222   112233   111444
55 111222   112233   222444
56 333444   444444   333444
57 333444   444444
58
59 Logic
60 =====
61 The logic behind these calculations are based on algebra - yes, x + y = z (but a little more complicated).
62 I have attempted to clearly document all calculations, however you will find the tools at http://www.quickmath.com/
63 very useful if you aren't a mathematics expert (I'm certainly not one).
64
65 Requirements
66 ============
67 -A PHP 4.3.x server with GD2.x extension enabled - most PHP shared hosting is suitable
68 -An image resizing script - I have included a very simple one with this bundle
69
70 Usage
71 =====
72
73 //include the class file
74 require_once('magazinelayout.class.php');
75
76 //Define the width for the output area (pixels)
77 \$width = 600;
78
79 //Define padding around each image - this *must* be included in your stylesheet (pixels)
81
82 //Define your template for outputting images
83 \$template = "<img src=\"image.php?size=[size]&amp;file=[image]\" alt=\"\" />"; //Don't forget to escape the &
84
85 //create a new instance of the class
87
88 //Add the images in any order
92
93 //display the output
94 echo \$mag->getHtml();
95
96 Template
97 ========
98 A different <img> tag will be required for different installations, depending mainly on the image script used.
99 Variables:
100 [size] = The size of the image, either 500, h500 or w500
101 [file] = The filename of the image, eg images/image1.jpg
102
103 The default is...
104 <img src="image.php?size=[size]&file=[image]" alt="" />
105
106 Using Apache's mod_rewrite, a better format might be...
107 <image src="images/[size]/[file]" alt="" />
108 Note your script and server must be configured for this, details of this are out of the scope of this script
109
110 A static looking image URL is better because Google will usually ignore dynamic looking images (they look
111 like PHP scripts, not images)
112
113
114 CSS
115 ===
116 The following CSS is required for padding to work correctly...
117
118 .magazine-image {
119	background: #fff;
120	border: 1px #eee solid;
121 }
122 .magazine-image img {
124	background: #fff;
125	margin: 2px;
126	border: 1px #eee solid;
127 }
128
130 =======
131 Including padding between images was the most complicated part of this script. On the more complex layouts,
132 the equations double in complexity once padding is added. Padding is implemented as x pixels gap between the
133 images - x is defined when the class is created.
134 The padding you specify *must* be reflected in the stylesheet you use, or the layout will not look right.
136 3 is specified in the PHP class, then the CSS class for ".magazine-image img" should reflect a margin of 3px
137 or a margin o 2px + border of 1px. Do not specify padding on the image unless you are prepared to hack the PHP
138 code.
139
140 Rounding
141 ========
142 Almost all of the calculations are done using floating point numbers. Because HTML required whole numbers, the
143 numbers need to be rounded (down) before outputting. On some examples, this makes no difference. On others, the
144 1 or 2 pixels worth of rounding is noticeable. Would welcome any suggestions on this issue for those who want
145 pixel perfect layouts.
146
147 Restrictions
148 ============
149 -There is a current limit of 8 images. This can easily be extended.
150 -Images must be a reasonable quality. Images that are too small are stretched which doesn't look good.
151 -The included image resizing script is very basic. I recommend using a script which caches output. The
152  image resizing script that is right for you will depend on your server configuration and is out of
153  the scope of this class.
154
155 To Do
156 =====
157 There are several obvious improvements that can be made to this script. These include...
158 -Adding code for more than 8 images
159 -Configuring so that low-res images are always shown in the small spots
160 -Allow positioning of images (though this does defeat the purpose)
161 -Include an all-purpose image resizing script with static looking URLs and Image caching
162 -Full testing for version 1 release
163 -Rounding issue explained above
164
166 =========
167 This file may be used and distributed subject to the LGPL available from http://www.fsf.org/copyleft/lgpl.html
168 If you find this script useful, I would appreciate a link back to http://www.ragepank.com or simply an email
169 to let me know you like it :)
170 You are free (and encouraged) to modify or enhance this class - if you do so, I would appreciate a copy
171 of the changes if it's not too much trouble. Please keep this copyright statement intact, and give fair
172 credit on any derivative work.
173
175 ================
176 Harvey Kane is a PHP Web developer living and working in Auckland New Zealand. He is interested in developing
177 "best practice" websites, and especially interested in using PHP to automate this process as much as
178 possible. Harvey works as a freelance developer doing CMS websites and SEO under the umbrella of www.harveykane.com,
179 and publishes SEO Articles and tools at www.ragepank.com
180
181 Ragepank.com
182 ============
183 www.ragepank.com is a source of original SEO Articles and tools - PHP based techniques for improving
184 search engine positions, and good practice for web development.
185
186 Support
187 =======
188 I am happy to help with support and installation, so long as all documentation and forum threads are read
189 first. You can contact me at info@ragepank.com
190
191 Thanks
192 ======
193 Thanks to Alexander Burkhardt (www.alex3d.de) for the use of the demo images. The images were taken on
194 the lovely Hokianga Harbour in Northland New Zealand.
195
196 @version 0.9
198 @author Harvey Kane info@ragepank.com
199
200 */
201
202
203class magazinelayout
204{
205	var \$images = array();
206	var \$_numimages = 0;
207	var \$_fullwidth;
208	var \$_imagetemplate = "<img src=\"/lib/plugins/gallery/inc/image.php?size=[size]&amp;file=[image]\" alt=\"\" />";
210	var \$Img = true;
211
213	{
214		\$this->_fullwidth = \$maxwidth;
216		if (\$imagetemplate != '') \$this->_imagetemplate = \$imagetemplate;
217	}
218
219
220
221	/* Gets the file extension for a given filename */
222	function _getFileExt(\$file)
223	{
224		\$ext = explode(".", \$file);
225		if (count(\$ext) == 0) return '';
226		return \$ext[count(\$ext)-1];
227	}
228
229
230
231	/* Converts the format of a 2D array from \$arr[a][b] to \$arr[b][a] - used for sorting the array*/
232	function _transpose(\$arr)
233	{
234		foreach(\$arr as \$keyx => \$valx) {
235			foreach(\$valx as \$keyy => \$valy) {
236				\$newarr[\$keyy][\$keyx] = \$valy;
237			}
238		}
239		return \$newarr;
240	}
241
242
243
245	{
246		\$filename = \$img['meta']->_fileName;
247		if (\$url == '') \$url = \$filename;
248		/* Ensure the file is an image */
249		if (
250			(strtolower(\$this->_getFileExt(\$filename)) != "jpg") &&
251			(strtolower(\$this->_getFileExt(\$filename)) != "jpeg") &&
252			(strtolower(\$this->_getFileExt(\$filename)) != "gif") &&
253			(strtolower(\$this->_getFileExt(\$filename)) != "png")
254			 ) {
255			return false;
256		}
257
258		/* Read the dimensions of the image */
259		\$imagesize = getimagesize(\$filename);
260		\$w = \$imagesize[0];
261		\$h = \$imagesize[1];
262
263		/* don't include zero sized images */
264		if ((\$h == 0) || (\$w == 0)) return false;
265
266		/* Find the ration of width:height */
267		\$ratio = \$w / \$h;
268
269		/* Set format based on the dimensions */
270		\$format = (\$w > \$h) ? 'landscape' : 'portrait';
271
272		/* Keep a count on the total number of images */
273		\$this->_numimages++;
274
275
276		/* Save all image details to an array */
277//		\$i = \$this->_numimages - 1;
278		\$opts = array();
279
280		\$opts['filename'] = \$filename;
281		\$opts['url'] = \$url;
282		\$opts['format'] = \$format;
283		\$opts['ratio'] = \$ratio;
284		\$opts['w'] = \$w; //Not currently used
285		\$opts['h'] = \$h; //Not currently used
286		\$opts['img'] = \$img;
287
288		\$this->images[] = \$opts;
289		return true;
290	}
291
292
293	/* Replaces variables into the supplied image template */
294	function insertImage(\$size,\$name)
295	{
296		return str_replace('[image]',\$name,str_replace('[size]',\$size,\$this->_imagetemplate));
297	}
298
299
300	/* New Function for Dokuwiki */
301	function insertImg(\$size,\$img)
302	{
303		global \$ID;
304
305		\$img = \$img['img'];
306		list(\$width, \$height) = getimagesize(\$img['meta']->_fileName);
307		\$ratio = \$width / \$height;
308
309		/* Decide how we should resize image - fixed width or fixed height */
310		if (substr(\$size, 0, 1) == 'h') {
311			\$type = 'fixedheight';
312		} elseif (substr(\$size, 0, 1) == 'w') {
313			\$type = 'fixedwidth';
314		} elseif (\$height > \$width) {
315			\$type = 'fixedheight';
316		} else {
317			\$type = 'fixedwidth';
318		}
319
320		/* Calculate new dimensions */
321		if (\$type == 'fixedheight') {
322			\$new_width = floor(str_replace('h','',\$size) * \$ratio);
323			\$new_height = str_replace('h','',\$size);
324		} else {
325			\$new_width = str_replace('w','',\$size);
326			\$new_height = floor(str_replace('w','',\$size) / \$ratio);
327		}
328
329		\$dim = array('w'=>\$new_width,'h'=>\$new_height);
330
331	        //prepare img attributes
332	        \$i           = array();
333	        \$i['width']  = \$new_width;
334	        \$i['height'] = \$new_height;
335	        \$i['border'] = 0;
336	        \$i['class']  = "magazineImage";
337	        \$i['alt']    = \$img['meta']->getField('Simple.Title');
339	        \$iatt = buildAttributes(\$i);
340	        \$src  = ml(\$img['id'],\$dim);
341
342	        // prepare lightbox dimensions
343	        \$w_lightbox = \$img['meta']->getField('File.Width');
344	        \$h_lightbox = \$img['meta']->getField('File.Height');
345	        \$dim_lightbox = array();
346	        if(\$w_lightbox > \$img['w_lightbox'] || \$h_lightbox > \$img['h_lightbox']){
347	            \$ratio = \$img['meta']->getResizeRatio(\$img['w_lightbox'],\$img['h_lightbox']);
348	            \$w_lightbox = floor(\$w_lightbox * \$ratio);
349	            \$h_lightbox = floor(\$h_lightbox * \$ratio);
350	            \$dim_lightbox = array('w'=>\$w_lightbox,'h'=>\$h_lightbox);
351	        }
352
354	        \$a           = array();
355	        \$a['title']  = \$img['meta']->getField('Simple.Title');
356	        if(\$img['lightbox']){
357	            \$href   = ml(\$img['id'],\$dim_lightbox);
358	            \$a['class'] = "lightbox JSnocheck";
359	            \$a['rel']   = "lightbox";
360	        }else{
361	            \$href   = ml(\$img['id'],array('id'=>\$ID),\$img['direct']);
362	        }
363	        \$aatt = buildAttributes(\$a);
364
365	        // prepare output
366	        \$ret  = '';
367	        \$ret .= '<a href="'.\$href.'" '.\$aatt.'>';
368	        \$ret .= '<img src="'.\$src.'" '.\$iatt.' />';
369	        \$ret .= '</a>';
370	        return \$ret;
371	}
372
373
374	/*
375	IMAGE LAYOUTS
376	=============
377	These layouts are coded based on the number of images.
378	Some fairly heavy mathematics is used to calculate the image sizes and the excellent calculators at
379	http://www.quickmath.com/ were very useful.
380	Each of these layouts outputs a small piece of HTML code with the images and a containing div
381	around each.
382	*/
383
384
385	function get1a(\$i1) {
386		/*
387		111 or 1
388		       1
389		*/
390
391		\$s = floor(\$this->_fullwidth - (\$this->_padding * 2));
392		\$html = '';
393
394		if ( !\$this->Img )
395			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImage(''.\$s,\$this->images[\$i1]['url'])."</div>\n";
396		else
397			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImg(''.\$s,\$this->images[\$i1])."</div>\n";
398
399		return \$html;
400	}
401
402	function get2a(\$i1,\$i2) {
403		/*
404		1122
405
406		Equation: t = 4p + ha + hb Variable: h
407
408		*/
409
410		\$a = \$this->images[\$i1]['ratio'];
411		\$b = \$this->images[\$i2]['ratio'];
412		\$t = \$this->_fullwidth;
414
415		\$h1 = floor( (4*\$p - \$t) / (-\$a - \$b) );
416
417		\$html = '';
418
419		if ( !\$this->Img ) {
420			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i1]['url'])."</div>\n";
421			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i2]['url'])."</div>\n";
422		} else {
423			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i1])."</div>\n";
424			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i2])."</div>\n";
425		}
426		return \$html;
427	}
428
429
430
431
432	function get3a(\$i1,\$i2,\$i3) {
433		/*
434		1223
435		*/
436
437		/* To save space in the equation */
438		\$a = \$this->images[\$i3]['ratio'];
439		\$b = \$this->images[\$i1]['ratio'];
440		\$c = \$this->images[\$i2]['ratio'];
441		\$t = \$this->_fullwidth;
443
444		/*
446		EQUATIONS
447		t = 6p + ah + bh + ch
448		VARIABLES
449		h
450		*/
451
452		\$h1 = floor((6 * \$p - \$t) / (-\$a -\$b -\$c) );
453
454		\$html = '';
455		if ( !\$this->Img )
456		{
457			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i1]['url'])."</div>\n";
458			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i3]['url'])."</div>\n";
459			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i2]['url'])."</div>\n";
460		} else {
461			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i1])."</div>\n";
462			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i3])."</div>\n";
463			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i2])."</div>\n";
464		}
465		return \$html;
466	}
467
468
469	function get3b(\$i1,\$i2,\$i3) {
470		/*
471		1133
472		2233
473		*/
474
475		/* To save space in the equation */
476		\$a = \$this->images[\$i3]['ratio'];
477		\$b = \$this->images[\$i1]['ratio'];
478		\$c = \$this->images[\$i2]['ratio'];
479		\$t = \$this->_fullwidth;
481
482		/*
484		EQUATIONS
485		x/a = w/b + w/c + 2p
486		w+x+4p = t
487		VARIABLES
488		w
489		x
490		*/
491
492		/* width of left column with 2 small images */
493		\$w1 = floor(
494		-(
495		(2 * \$a * \$b * \$c * \$p + 4 * \$b * \$c * \$p - \$b * \$c * \$t)
496		/
497		(\$a * \$b + \$c * \$b + \$a * \$c)
498		)
499		);
500
501		/* width of right column with 1 large image */
502		\$w2 = floor(
503		(\$a * (-4 * \$b * \$p + 2 * \$b * \$c * \$p - 4 * \$c * \$p + \$b * \$t + \$c * \$t))
504		/
505		(\$a * \$b + \$c * \$b + \$a * \$c)
506		);
507
508		\$html = '';
509		if ( !\$this->Img )
510		{
511			\$html .= "<div style=\"float: right; clear: both;\">".\$this->insertImage('w'.\$w2,\$this->images[\$i3]['url'])."</div>\n";
512			\$html .= "<div style=\"float: left;\">".\$this->insertImage('w'.\$w1,\$this->images[\$i1]['url'])."</div>\n";
513			\$html .= "<div style=\"float: left;\">".\$this->insertImage('w'.\$w1,\$this->images[\$i2]['url'])."</div>\n";
514		} else {
515			\$html .= "<div style=\"float: right; clear: both;\">".\$this->insertImg('w'.\$w2,\$this->images[\$i3])."</div>\n";
516			\$html .= "<div style=\"float: left;\">".\$this->insertImg('w'.\$w1,\$this->images[\$i1])."</div>\n";
517			\$html .= "<div style=\"float: left;\">".\$this->insertImg('w'.\$w1,\$this->images[\$i2])."</div>\n";
518		}
519		return \$html;
520	}
521
522
523
524	function get4a(\$i1,\$i2,\$i3,\$i4) {
525		/*
526		1234
527		*/
528
529		/* To save space in the equation */
530		\$a = \$this->images[\$i1]['ratio'];
531		\$b = \$this->images[\$i2]['ratio'];
532		\$c = \$this->images[\$i3]['ratio'];
533		\$d = \$this->images[\$i4]['ratio'];
534		\$t = \$this->_fullwidth;
536
537		/*
539		EQUATIONS
540		t = 6p + ah + bh + ch + dh
541		VARIABLES
542		h
543		*/
544
545		\$h1 = floor(
546		(8 * \$p - \$t)
547		/
548		(-\$a -\$b -\$c -\$d)
549		);
550
551		//\$h1 = floor(\$this->_fullwidth / (\$this->images[\$p1]['ratio'] + \$this->images[\$p2]['ratio'] + \$this->images[\$p3]['ratio'] + \$this->images[\$p4]['ratio']));
552		\$html = '';
553
554		if ( !\$this->Img )
555		{
556			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i1]['url'])."</div>\n";
557			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i2]['url'])."</div>\n";
558			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i3]['url'])."</div>\n";
559			\$html .= "<div style=\"float: left;\">".\$this->insertImage('h'.\$h1,\$this->images[\$i4]['url'])."</div>\n";
560		} else {
561			\$html .= "<div style=\"float: left; clear: both;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i1]['url'])."</div>\n";
562			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i2])."</div>\n";
563			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i3])."</div>\n";
564			\$html .= "<div style=\"float: left;\">".\$this->insertImg('h'.\$h1,\$this->images[\$i4])."</div>\n";
565		}
566		return \$html;
567	}
568
569
570
571	function get4b(\$i1,\$i2,\$i3,\$i4) {
572		/*
573		11444
574		22444
575		33444
576		*/
577
578		/* To save space in the equation */
579		\$a = \$this->images[\$i4]['ratio'];
580		\$b = \$this->images[\$i1]['ratio'];
581		\$c = \$this->images[\$i2]['ratio'];
582		\$d = \$this->images[\$i3]['ratio'];
583		\$t = \$this->_fullwidth;
585
586		/*
588		EQUATIONS
589		x/a = w/b + w/c + 2p
590		w+x+4p = t
591		VARIABLES
592		w
593		x
594		*/
595
596		/* width of left column with 2 small images */
597		\$w1 = floor(
598		-(
599		(4 * \$a * \$b * \$c * \$d * \$p + 4 * \$b * \$c * \$d * \$p - \$b * \$c * \$d * \$t)
600		/
601		(\$a * \$b * \$c + \$a * \$d * \$c + \$b * \$d * \$c + \$a * \$b * \$d)
602		)
603		);
604
605		/* width of right column with 1 large image */
606		\$w2 = floor(
607		-(
608		(-4 * \$p - (-(1/\$c) -(1/\$d) -(1/\$b)) * (4 * \$p - \$t) )
609		/
610		( (1/\$b) + (1/\$c) + (1/\$d) + (1/\$a) )
611		)
612		);
613
614		\$html = '';
615		if ( !\$this->Img )
616		{
617			\$html .= "<div style=\"float: right; clear: both;\">".\$this->insertImage('w'.\$w2,\$this->images[\$i4]['url'])."</div>\n";
618			\$html .= "<div style=\"float: left;\">".\$this->insertImage('w'.\$w1,\$this->images[\$i1]['url'])."</div>\n";
619			\$html .= "<div style=\"float: left;\">".\$this->insertImage('w'.\$w1,\$this->images[\$i2]['url'])."</div>\n";
620			\$html .= "<div style=\"float: left;\">".\$this->insertImage('w'.\$w1,\$this->images[\$i3]['url'])."</div>\n";
621		} else {
622			\$html .= "<div style=\"float: right; clear: both;\">".\$this->insertImg('w'.\$w2,\$this->images[\$i4])."</div>\n";
623			\$html .= "<div style=\"float: left;\">".\$this->insertImg('w'.\$w1,\$this->images[\$i1])."</div>\n";
624			\$html .= "<div style=\"float: left;\">".\$this->insertImg('w'.\$w1,\$this->images[\$i2])."</div>\n";
625			\$html .= "<div style=\"float: left;\">".\$this->insertImg('w'.\$w1,\$this->images[\$i3])."</div>\n";
626		}
627		return \$html;
628	}
629
630
631	function getHtml() {
632
633		/* Sort the images array landscape first, then portrait */
634		\$this->images = \$this->_transpose(\$this->images);
635		array_multisort(\$this->images['format'], SORT_STRING, SORT_ASC, \$this->images['img'], \$this->images['filename'], \$this->images['url'], \$this->images['ratio']);
636		\$this->images = \$this->_transpose(\$this->images);
637
638		/* Profile explains the makeup of the images (landscape vs portrait) so we can use the best layout eg. LPPP or LLLP */
639		\$profile = '';
640		foreach (\$this->images as \$i) {
641			\$profile .= \$i['format'] == 'landscape' ? 'L' : 'P';
642		}
643
644		/* Open the containing DIV */
645		\$html = '';
646		\$html .= "<div class=\"magazine-image\" style=\"width: ".\$this->_fullwidth."px;" . (!empty(\$this->images[\$this->_numimages-1]['img']['float']) ? ' float:'.\$this->images[\$this->_numimages-1]['img']['float'].'; margin: 10px;' : '') . "\">\n";
647
648		//print_r(\$this->images);
649
650		/* 1 Images */
651		if (\$this->_numimages == 1) {
652			\$html .= \$this->get1a(0);
653		}
654
655		/* 2 Images */
656		if (\$this->_numimages == 2) {
657			\$html .= \$this->get2a(0,1);
658		}
659
660		/* 3 Images */
661		if (\$this->_numimages == 3) {
662			if (\$profile == 'LLL') {
663			  \$html .= \$this->get3b(0,1,2);
664				//\$html .= \$this->get2a(1,2);
665				//\$html .= \$this->get1a(0);
666			} else {
667				\$html .= \$this->get3b(0,1,2);
668			}
669		}
670
671		/* 4 Images */
672		if (\$this->_numimages == 4) {
673
674			if (\$profile == 'LLLP') {
675				\$html .= \$this->get4b(0,1,2,3);
676			} elseif (\$profile == 'LPPP') {
677				\$html .= \$this->get3a(1,2,3);
678				\$html .= \$this->get1a(0);
679			} else { // LLLL LLPP PPPP
680				\$html .= \$this->get2a(2,0);
681				\$html .= \$this->get2a(1,3);
682			}
683		}
684
685		/* 5 Images */
686		if (\$this->_numimages == 5) {
687			if (\$profile == 'LLLLL') {
688				\$html .= \$this->get3a(0,1,2);
689				\$html .= \$this->get2a(3,4);
690			} elseif (\$profile == 'LLLLP') {
691				\$html .= \$this->get3b(0,1,4);
692				\$html .= \$this->get2a(2,3);
693			} elseif (\$profile == 'LLLPP') {
694				\$html .= \$this->get3b(0,1,4);
695				\$html .= \$this->get2a(2,3);
696			} elseif (\$profile == 'LLPPP') {
697				\$html .= \$this->get3b(2,3,4);
698				\$html .= \$this->get2a(0,1);
699			} elseif (\$profile == 'LPPPP') {
700				\$html .= \$this->get3b(2,3,4);
701				\$html .= \$this->get2a(0,1);
702			} elseif (\$profile == 'PPPPP') {
703				\$html .= \$this->get2a(4,0);
704				\$html .= \$this->get3a(1,2,3);
705			}
706		}
707
708		/* 6 Images */
709		if (\$this->_numimages == 6) {
710			if (\$profile == 'LLLLLL') {
711				\$html .= \$this->get2a(0,1);
712				\$html .= \$this->get2a(2,3);
713				\$html .= \$this->get2a(4,5);
714			} elseif (\$profile == 'LLLLLP') {
715				\$html .= \$this->get4b(0,1,2,5);
716				\$html .= \$this->get2a(3,4);
717			} elseif (\$profile == 'LLLLPP') {
718				\$html .= \$this->get3b(0,1,4);
719				\$html .= \$this->get3b(2,3,5);
720			} elseif (\$profile == 'LLLPPP') {
721				\$html .= \$this->get3b(0,1,5);
722				\$html .= \$this->get3b(2,3,4);
723			} elseif (\$profile == 'LLPPPP') {
724				\$html .= \$this->get3b(0,2,4);
725				\$html .= \$this->get3b(1,3,5);
726			} elseif (\$profile == 'LPPPPP') {
727				\$html .= \$this->get3b(0,1,5);
728				\$html .= \$this->get3a(2,3,4);
729			} elseif (\$profile == 'PPPPPP') {
730				\$html .= \$this->get3a(3,4,5);
731				\$html .= \$this->get3a(0,1,2);
732			}
733		}
734
735		/* 7 Images */
736		if (\$this->_numimages == 7) {
737			if (\$profile == 'LLLLLLL') {
738				\$html .= \$this->get3a(0,1,2);
739				\$html .= \$this->get2a(3,4);
740				\$html .= \$this->get2a(5,6);
741			} elseif (\$profile == 'LLLLLLP') {
742				\$html .= \$this->get4b(0,1,2,6);
743				\$html .= \$this->get3a(3,4,5);
744			} elseif (\$profile == 'LLLLLPP') {
745				\$html .= \$this->get4b(0,1,2,5);
746				\$html .= \$this->get3b(3,4,6);
747			} elseif (\$profile == 'LLLLPPP') {
748				\$html .= \$this->get3b(0,1,5);
749				\$html .= \$this->get4b(2,3,4,6);
750			} elseif (\$profile == 'LLLPPPP') {
751				\$html .= \$this->get3b(0,1,5);
752				\$html .= \$this->get4b(2,3,4,6);
753			} elseif (\$profile == 'LLPPPPP') {
754				\$html .= \$this->get3a(4,5,6);
755				\$html .= \$this->get2a(0,1);
756				\$html .= \$this->get2a(2,3);
757			} elseif (\$profile == 'LPPPPPP') {
758				\$html .= \$this->get3a(0,1,2);
759				\$html .= \$this->get4b(3,4,5,6);
760			} elseif (\$profile == 'PPPPPPP') {
761				\$html .= \$this->get4a(0,1,2,3);
762				\$html .= \$this->get3b(4,5,6);
763			}
764		}
765
766		/* 8 Images */
767		if (\$this->_numimages >= 8) {
768			/*
769			Note this code is applied for 8 or more images - any images over 8 are ignored. Adding support
770			for more than 8 images would be easy, but the layouts do start losing their effect as more images
772			*/
773			if (\$profile == 'LLLLLLLL') {
774				\$html .= \$this->get3a(0,1,2);
775				\$html .= \$this->get2a(3,4);
776				\$html .= \$this->get3a(5,6,7);
777			} elseif (\$profile == 'LLLLLLLP') {
778				\$html .= \$this->get4b(0,1,2,7);
779				\$html .= \$this->get2a(3,4);
780				\$html .= \$this->get2a(5,6);
781			} elseif (\$profile == 'LLLLLLPP') {
782				\$html .= \$this->get4b(0,1,2,6);
783				\$html .= \$this->get4b(3,4,5,7);
784			} elseif (\$profile == 'LLLLLPPP') {
785				\$html .= \$this->get4b(0,1,2,6);
786				\$html .= \$this->get4b(3,4,5,7);
787			} elseif (\$profile == 'LLLLPPPP') {
788				\$html .= \$this->get4b(0,1,2,6);
789				\$html .= \$this->get4b(3,4,5,7);
790			} elseif (\$profile == 'LLLPPPPP') {
791				\$html .= \$this->get3a(4,5,6);
792				\$html .= \$this->get2a(0,1);
793				\$html .= \$this->get3a(2,3,7);
794			} elseif (\$profile == 'LLPPPPPP') {
795				\$html .= \$this->get3b(5,6,7);
796				\$html .= \$this->get2a(0,1);
797				\$html .= \$this->get3b(2,3,4);
798			} elseif (\$profile == 'LPPPPPPP') {
799				\$html .= \$this->get3b(5,6,7);
800				\$html .= \$this->get2a(0,1);
801				\$html .= \$this->get3b(2,3,4);
802			} elseif (\$profile == 'PPPPPPP') {
803				\$html .= \$this->get4a(0,1,2,3);
804				\$html .= \$this->get4a(4,5,6,7);
805			} else {
806				\$html .= \$this->get3b(5,4,7);
807				\$html .= \$this->get2a(1,0);
808				\$html .= \$this->get3b(2,3,6);
809			}
810		}
811
812		/* Close the containing DIV */
813		\$html .= "<div style=\"clear: both;\"></div>\n</div>\n";
814
815		return \$html;
816	}
817}
818/* End of Class */
819```