a:9:{s:7:"version";s:3:"0.7";s:6:"author";s:13:"Johan Nilsson";s:10:"author_uri";s:25:"http://johan.galaxen.net/";s:11:"description";s:48:"Helps you control how to display a image element";s:4:"type";i:0;s:4:"name";s:9:"glx_image";s:4:"help";s:2320:"
	<h2>glx_image</h2>

	<p>This plugins helps you control how to display a image element based on a article i read at <a href="http://www.1976design.com/blog/archive/2004/07/29/redesign-tag-transform">Dunstans Blog</a></p>

	<h3>Parameters</h3>

	<p>All parameters are optional, except <code>id</code></p>

	<p><strong>id</strong><br />
Image to display<br />
<strong>src</strong><br />
Image to display, if src is used dont use id.<br />
<strong>link</strong><br />
Url (with http://)or just enter <code>large</code> in that case the plugin chose the thumbnail for the given id and place a link to the large version of that image.<br />
Use <code>pop</code> to have images open in a popup instead (requires <a href="http://forum.textpattern.com/viewtopic.php?id=1228">dca_pop</a> plugin)<br />
<strong>linktitle</strong><br />
A title that will be added to the link, when link=&#8221;large&#8221; is used glx_image will automagically add &#8220;Link to a larger version of this image&#8221;<br />
<strong>caption</strong><br />
Caption to display under the image, enter <code>standard</code> to use the one that is stored in the database<br />
<strong>alt</strong><br />
alt text for the image, if no alt is given i uses the one that is stored in the database.<br />
<strong>class</strong><br />
Class to control how to display the image element <code>left</code>, <code>right</code>, <code>center</code> or <code>standalone</code></p>

	<p>Note! When src is used, the link=&#8221;large&#8221; and link=&#8221;pop&#8221; will not work.</p>

	<h3>Example tags</h3>

<code><br />
&lt;txp:glx_image id="1" /&gt;<br />
&lt;txp:glx_image id="1" link="large" caption="standard" class="center" /&gt;<br />
&lt;txp:glx_image src="http://olof.galaxen.net/bilder/fuldans.gif" link="http://olof.galaxen.net/" linktitle="Goto Olofs webpage" caption="A friend of mine is doing the fuldans" class="center" /&gt;<br />
</code>

	<h3>CSS example</h3>

<pre>
<code>
div.image-element div.caption {
padding: 0;
text-align: left;
font-size: x-small;
border-style: none;
text-align: center;
margin: 0 0 20px 0;
}
.right {float: right; position: relative; margin: 0.2em 0.5em 0.5em 1.5em}
.left {float: left; position: relative; margin: 0.5em 1.5em 0.5em 0.5em}
.standalone { width: auto; }
.center { text-align: center;}
</code>
</pre>



 ";s:4:"code";s:2001:"/* 
glx_image v.0.7
By Johan Nilsson <http://johan.galaxen.net/>
Last edited 2005-05-16 09.22
*/ 


function glx_image($atts) {
	global $pfr, $img_dir;
	if (is_array($atts))
		extract($atts);

	$image_id = (!empty ($id)) ? $id : "";
	$src = (!empty ($src)) ? $src : "";
	$link = (!empty ($link)) ? $link : "";
	$linktitle = (!empty ($linktitle)) ? $linktitle : "";
	$my_caption = (!empty ($caption)) ? $caption : "";
	$alt = (!empty ($alt)) ? $alt : "";
	$class = (!empty ($class)) ? ' '.$class : "";
	$debug = (!empty ($debug)) ? $debug : 0;

	$caption_tag = "";
	$link_end = "";
	$link_start = "";

	$rs = safe_row("*", "txp_image", "id='$image_id' limit 1", $debug);
	if ($rs) {
		extract($rs);

		$src = $pfr.$img_dir.'/'.$id.$ext;

		if (!empty ($link)) {
			$linktitle = (!empty ($linktitle)) ? ' title="'.$linktitle.'"' : ' title="Link to a larger version of this image"';
			if ($link == "large") {
				$link = $pfr.$img_dir.'/'.$id.$ext;
				$src = $pfr.$img_dir.'/'.$id.'t'.$ext;
			}
			if ($link == "pop") {
				$src = $pfr.$img_dir.'/'.$id.'t'.$ext;
				$link_start = "<txp:dca_pop id=\"".$id."\">";
				$link_end = "</txp:dca_pop>";
			} else {
				$link_start = "<a href=\"".$link."\"".$linktitle.">";
				$link_end = "</a>";
			}
		}

		if (!empty ($my_caption)) {
			if ($my_caption == "standard") {
				$my_caption = $caption;
			} else {
				$my_caption = $my_caption;
			}
			$caption_tag = '<div class="caption">'.$my_caption.'</div>';
		}
	}

	// For external images
	if (!empty ($my_caption)) {
		$caption_tag = '<div class="caption">'.$my_caption.'</div>';
	}

	if (!empty ($link) && substr($link, 0, 7) == "http://") {
		$linktitle = (!empty ($linktitle)) ? $linktitle : "";
		$link_start = "<a href=\"".$link."\"".$linktitle.">";
		$link_end = "</a>";
	}

	$out = '<div class="image-element'.$class.'">'.n;
	$out .= $link_start.n;
	$out .= '<img src="'.$src.'" alt="'.$alt.'" />'.n;
	$out .= $link_end.n;
	$out .= $caption_tag.n;
	$out .= '</div>'.n;

	return parse($out);
}
";s:3:"md5";s:32:"c5041613ef9fba7876cd140ab4b31614";}