r53 - in trunk/www.openmoko.com: . images images/navigation inc js textpattern textpattern/lib uploaded_images

roh at sita.openmoko.org roh at sita.openmoko.org
Tue Jun 12 06:42:43 CEST 2007


Author: roh
Date: 2007-06-12 06:42:26 +0200 (Tue, 12 Jun 2007)
New Revision: 53

Added:
   trunk/www.openmoko.com/images/loader.gif
   trunk/www.openmoko.com/images/middleblock_tabs_left_alt.png
   trunk/www.openmoko.com/images/middleblock_tabs_right_alt.png
   trunk/www.openmoko.com/images/product_pictures_background.png
   trunk/www.openmoko.com/images/shadow.png
   trunk/www.openmoko.com/inc/product_neo-advanced.html
   trunk/www.openmoko.com/inc/product_neo-basic.html
   trunk/www.openmoko.com/inc/ptemplate-hardware.html
   trunk/www.openmoko.com/inc/ptemplate-pictures.html
   trunk/www.openmoko.com/inc/ptemplate-software.html
   trunk/www.openmoko.com/js/overlay.js
   trunk/www.openmoko.com/js/prototype.js
   trunk/www.openmoko.com/textpattern/additional_functions.php
   trunk/www.openmoko.com/uploaded_images/34.png
   trunk/www.openmoko.com/uploaded_images/34t.png
   trunk/www.openmoko.com/uploaded_images/39.png
   trunk/www.openmoko.com/uploaded_images/39t.png
   trunk/www.openmoko.com/uploaded_images/40.png
   trunk/www.openmoko.com/uploaded_images/40t.png
   trunk/www.openmoko.com/uploaded_images/41.png
   trunk/www.openmoko.com/uploaded_images/41t.png
   trunk/www.openmoko.com/uploaded_images/42.png
   trunk/www.openmoko.com/uploaded_images/42t.png
   trunk/www.openmoko.com/uploaded_images/43.png
   trunk/www.openmoko.com/uploaded_images/43t.png
   trunk/www.openmoko.com/uploaded_images/44.png
   trunk/www.openmoko.com/uploaded_images/44t.png
   trunk/www.openmoko.com/uploaded_images/45.png
   trunk/www.openmoko.com/uploaded_images/45t.png
   trunk/www.openmoko.com/uploaded_images/46.png
   trunk/www.openmoko.com/uploaded_images/46t.png
   trunk/www.openmoko.com/uploaded_images/47.png
   trunk/www.openmoko.com/uploaded_images/47t.png
   trunk/www.openmoko.com/uploaded_images/48.png
   trunk/www.openmoko.com/uploaded_images/48t.png
   trunk/www.openmoko.com/uploaded_images/49.png
   trunk/www.openmoko.com/uploaded_images/49t.png
   trunk/www.openmoko.com/uploaded_images/50.png
   trunk/www.openmoko.com/uploaded_images/50t.png
   trunk/www.openmoko.com/uploaded_images/51.png
   trunk/www.openmoko.com/uploaded_images/51t.png
   trunk/www.openmoko.com/uploaded_images/52.png
   trunk/www.openmoko.com/uploaded_images/52t.png
   trunk/www.openmoko.com/uploaded_images/53.png
   trunk/www.openmoko.com/uploaded_images/53t.png
   trunk/www.openmoko.com/uploaded_images/54.png
   trunk/www.openmoko.com/uploaded_images/54t.png
   trunk/www.openmoko.com/uploaded_images/55.png
   trunk/www.openmoko.com/uploaded_images/55t.png
   trunk/www.openmoko.com/uploaded_images/56.png
   trunk/www.openmoko.com/uploaded_images/56t.png
   trunk/www.openmoko.com/uploaded_images/57.png
   trunk/www.openmoko.com/uploaded_images/57t.png
   trunk/www.openmoko.com/uploaded_images/58.png
   trunk/www.openmoko.com/uploaded_images/58t.png
   trunk/www.openmoko.com/uploaded_images/59.png
   trunk/www.openmoko.com/uploaded_images/59t.png
   trunk/www.openmoko.com/uploaded_images/60.png
   trunk/www.openmoko.com/uploaded_images/60t.png
Removed:
   trunk/www.openmoko.com/errors.txt
   trunk/www.openmoko.com/inc/product_neo1973.html
   trunk/www.openmoko.com/inc/product_neo1973.html.bak
Modified:
   trunk/www.openmoko.com/images/navigation/about.png
   trunk/www.openmoko.com/images/navigation/careers.png
   trunk/www.openmoko.com/images/navigation/contact.png
   trunk/www.openmoko.com/images/navigation/home.png
   trunk/www.openmoko.com/images/navigation/press.png
   trunk/www.openmoko.com/images/navigation/products.png
   trunk/www.openmoko.com/images/navigation/shop.png
   trunk/www.openmoko.com/images/thumb_background.png
   trunk/www.openmoko.com/inc/about.html
   trunk/www.openmoko.com/inc/careers.html
   trunk/www.openmoko.com/inc/contact.html
   trunk/www.openmoko.com/inc/default.html
   trunk/www.openmoko.com/inc/developers.html
   trunk/www.openmoko.com/inc/press.html
   trunk/www.openmoko.com/inc/products.html
   trunk/www.openmoko.com/inc/ptemplate-screenshots.html
   trunk/www.openmoko.com/inc/ptemplate-standard_kit.html
   trunk/www.openmoko.com/js/screenshots.js
   trunk/www.openmoko.com/style.css
   trunk/www.openmoko.com/textpattern/lib/class.thumb.php
   trunk/www.openmoko.com/uploaded_images/21.png
   trunk/www.openmoko.com/uploaded_images/21t.png
Log:
update html/php to last update from 38one.



Deleted: trunk/www.openmoko.com/errors.txt
===================================================================

Added: trunk/www.openmoko.com/images/loader.gif
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/images/loader.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/images/middleblock_tabs_left_alt.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/images/middleblock_tabs_left_alt.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/images/middleblock_tabs_right_alt.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/images/middleblock_tabs_right_alt.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/www.openmoko.com/images/navigation/about.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/careers.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/contact.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/home.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/press.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/products.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/images/navigation/shop.png
===================================================================
(Binary files differ)

Added: trunk/www.openmoko.com/images/product_pictures_background.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/images/product_pictures_background.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/images/shadow.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/images/shadow.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/www.openmoko.com/images/thumb_background.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/inc/about.html
===================================================================
--- trunk/www.openmoko.com/inc/about.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/about.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 
@@ -3,5 +4,5 @@
 <head>
 <txp:output_form form="moko_html_header" />
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+</head>
 
 <body>
@@ -29,7 +30,7 @@
 	<div class="right_container">
 
 			<txp:php>
-				$default_document = 25;
+				$default_document = 37;
 				
 				global $current_article_id;		
 				$current_article_id = $GLOBALS['thisarticle']['thisid'];
@@ -44,7 +45,7 @@
 				<txp:if_individual_article>
 					<txp:article form="simple_article" />
 				<txp:else />
-					<txp:article form="simple_article" id="25"/>
+					<txp:article form="simple_article" id="37"/>
 				</txp:if_individual_article>
 				<a href="#" class="top_link"><span>top</span></a>
 			</div>	

Modified: trunk/www.openmoko.com/inc/careers.html
===================================================================
--- trunk/www.openmoko.com/inc/careers.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/careers.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 

Modified: trunk/www.openmoko.com/inc/contact.html
===================================================================
--- trunk/www.openmoko.com/inc/contact.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/contact.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 

Modified: trunk/www.openmoko.com/inc/default.html
===================================================================
--- trunk/www.openmoko.com/inc/default.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/default.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 

Modified: trunk/www.openmoko.com/inc/developers.html
===================================================================
--- trunk/www.openmoko.com/inc/developers.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/developers.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 

Modified: trunk/www.openmoko.com/inc/press.html
===================================================================
--- trunk/www.openmoko.com/inc/press.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/press.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 

Added: trunk/www.openmoko.com/inc/product_neo-advanced.html
===================================================================
--- trunk/www.openmoko.com/inc/product_neo-advanced.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/product_neo-advanced.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,86 @@
+<?php require('textpattern/additional_functions.php') ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<txp:output_form form="moko_html_header" />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+
+<body id="product_neo1973">
+
+<div id="wrapper">
+	<txp:php>global $logo_sufix; $logo_sufix = "_2";</txp:php>
+	
+	<txp:php>
+		global $url_title; $url_title=$GLOBALS['thisarticle']['url_title'];
+		global $thisproductpage; $thisproductpage = link_to_home(array()).'products/'.$url_title.'/';
+		global $current_category; $current_category = isset($_GET['current_page']) ? $GLOBALS['url_title'].'-'.$_GET['current_page'] : $GLOBALS['url_title'].'-standard_kit';		
+		global $logo_sufix; $logo_sufix = "_2";
+		global $alt_nav; $alt_nav = array('pictures','hardware');
+	</txp:php>
+	
+	<txp:output_form form="moko_header" />
+	
+	<div id="site_content"></div>
+	<div id="middleblock"><div id="middleblock_inner"><div id="middleblock_inner2">
+	
+		<div id="middleblock_container" class="neo-advanced">
+	
+			<txp:php>
+				// Product heading
+				include txpath.'/lib/classTextile.php';
+					
+				global $hcp;
+				global $images;
+                global $prefs;
+                $imgdir = link_to_home(array()).$prefs['img_dir'].'/';
+                			
+				$hcp = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['url_title']."-home' limit 1");
+                
+                if ($hcp["Image"] > 0) {
+                    $big_image = safe_row('*', 'txp_image', "id = ".$hcp["Image"]);
+                    
+					print_png_image($imgdir.$hcp["Image"].$big_image['ext'],$big_image['w'],$big_image['h'],array("alt"=>$screenshot['alt'],"class"=>"neoadvanced_image"));
+                }
+                
+			</txp:php>
+		
+            
+			<div class="banner_content">		
+				<h1><span><txp:php>echo $GLOBALS['hcp']['Title'];</txp:php></span></h1>
+				<txp:php>echo $GLOBALS['hcp']['Body_html'];</txp:php>
+						<a href="#" class="button_buy_it_now img_button"><span>Buy It Now</span></a>				
+			</div>
+		</div>
+	
+		<ul id="middleblock_tabs" <txp:php>if (in_array($_GET['current_page'],$GLOBALS['alt_nav'])) {echo ' class="middleblock_tabs_alt"';}</txp:php>>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=standard_kit" 
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-standard_kit')) echo ' class="selected"';</txp:php>><span>Standard Kit</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=pictures" 
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-pictures')) echo ' class="selected"';</txp:php>><span>Pictures</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=screenshots"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-screenshots')) echo ' class="selected"';</txp:php>><span>Screenshots</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=hardware"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-hardware')) echo ' class="selected"';</txp:php>><span>Hardware</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=software"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-software')) echo ' class="selected"';</txp:php>><span>Software</span></a></li>
+		</ul>
+		
+		<div class="clear"></div>
+	</div></div></div>
+
+	<txp:php>
+		$page_template = isset($_GET['current_page']) ? $_GET['current_page'] : 'standard_kit';
+		$page_template = 'ptemplate-'.$page_template;
+		
+		include('inc/'.$page_template.'.html');
+	</txp:php>
+	
+	<txp:output_form form="moko_footer" />
+	
+</div>
+
+<txp:output_form form="moko_overlay" />
+
+</body>
+</html>
\ No newline at end of file

Added: trunk/www.openmoko.com/inc/product_neo-basic.html
===================================================================
--- trunk/www.openmoko.com/inc/product_neo-basic.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/product_neo-basic.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,156 @@
+<?php require('textpattern/additional_functions.php') ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<txp:output_form form="moko_html_header" />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+
+<body id="product_neo1973">
+
+<div id="wrapper">
+	<txp:php>global $logo_sufix; $logo_sufix = "_2";</txp:php>
+	
+	<txp:php>
+		global $url_title; $url_title=$GLOBALS['thisarticle']['url_title'];
+		global $thisproductpage; $thisproductpage = link_to_home(array()).'products/'.$url_title.'/';
+		global $current_category; $current_category = isset($_GET['current_page']) ? $GLOBALS['url_title'].'-'.$_GET['current_page'] : $GLOBALS['url_title'].'-standard_kit';
+		global $alt_nav; $alt_nav = array('pictures','hardware');
+		global $logo_sufix; $logo_sufix = "_2";
+	</txp:php>
+	
+	<txp:output_form form="moko_header" />
+	
+	<div id="site_content"></div>
+	<div id="middleblock"><div id="middleblock_inner"><div id="middleblock_inner2">
+	
+		<div id="middleblock_container">
+	
+			<txp:php>
+				// Product heading
+				include txpath.'/lib/classTextile.php';
+					
+				global $hcp;
+				global $big_images;
+				global $small_images;
+				
+				$hcp = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['url_title']."-home' limit 1");
+				
+				$images = $hcp['Image'];
+				$images = explode(',',$images);
+				
+				if (count($images)>0) {
+					for ($x=0;$x<count($images);$x++) {
+						if ($x%2 == 0) {
+							$big_images[]=$images[$x];
+						} else {
+							$small_images[]=$images[$x];
+						}
+					}
+				}
+				
+				//dmp($big_images);
+				//dmp($small_images);
+				//dmp($hcp);
+			</txp:php>
+		
+			<div class="banner_images">
+				<txp:php>
+					global $big_images;
+					if (count($big_images)>0) {
+						for ($x = 0; $x<count($big_images);$x++) {
+						
+							echo '<div id="tab_big_image_article_'.$x.'" class="tab_item" style="">';
+							echo '	<a href="#" class="button_enlarge"><span>enlarge</span></a>';
+							
+							if ((strpos($_SERVER['HTTP_USER_AGENT'],"MSIE")) and (strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 7")===false)) {
+								$rs = safe_row('*', 'txp_image', "id = ".$big_images[$x]." limit 1");						
+								
+								if (strtolower($rs['ext']) == '.png') {
+									global $prefs;
+		
+									$siteroot = link_to_home(array());								
+									$filepath = $siteroot.$prefs['img_dir'].'/';
+		
+									$filename=$big_images[$x].$rs['ext']; $width = $rs['w']; $height = $rs['h'];
+									$alt = isset($rs['alt']) ? $rs['alt'] : $rs['name'];
+									
+									echo "<img src='".$siteroot."images/blank.gif' width='$width' height='$height'  alt='$alt' style=\"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='".$filepath.$filename."', sizingMethod='scale')\" />";
+								} else {
+									$image = image(array("id"=>$big_images[$x]));
+									echo $image;
+								}
+							} else {				
+								$image = image(array("id"=>$big_images[$x]));
+								echo $image;
+							}					
+		
+							echo "</div>";									
+						}
+					}
+				</txp:php>
+				
+				<div class="shadow">&nbsp;</div>
+			</div>
+					
+			<script type="text/javascript">
+				_pageTabs['big_image']=2;
+				showTab('big_image',0);
+			</script>
+			
+			<div class="banner_content">		
+				<h1><span><txp:php>echo $GLOBALS['hcp']['Title'];</txp:php></span></h1>
+				<txp:php>echo $GLOBALS['hcp']['Body_html'];</txp:php>
+				
+				<div class="banner_details">
+					<div class="banner_left">
+						<h2>Colours available</h2>
+						<ul class="banner_product_thumbs">
+							<txp:php>
+								global $small_images;
+								if (count($small_images)>0) {
+									for ($x = 0; $x<count($small_images);$x++) {
+										//"return showTab('big_image',".$x.")
+										echo "<li><a href='#' onclick=\"return showTab('big_image',".$x.")\">".image(array("id"=>$small_images[$x]))."</a></li>";
+									}
+								}
+							</txp:php>
+						</ul>
+						<div class="clear"></div>
+						<a href="#" class="button_buy_it_now img_button"><span>Buy It Now</span></a>
+					</div>					
+				</div>
+			</div>
+		</div>
+	
+		<ul id="middleblock_tabs" <txp:php>if (in_array($_GET['current_page'],$GLOBALS['alt_nav'])) {echo ' class="middleblock_tabs_alt"';}</txp:php>>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=standard_kit" 
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-standard_kit')) echo ' class="selected"';</txp:php>><span>Standard Kit</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=pictures" 
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-pictures')) echo ' class="selected"';</txp:php>><span>Pictures</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=screenshots"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-screenshots')) echo ' class="selected"';</txp:php>><span>Screenshots</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=hardware"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-hardware')) echo ' class="selected"';</txp:php>><span>Hardware</span></a></li>
+			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=software"
+			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-software')) echo ' class="selected"';</txp:php>><span>Software</span></a></li>
+		</ul>
+		
+		<div class="clear"></div>
+	</div></div></div>
+
+	<txp:php>
+		$page_template = isset($_GET['current_page']) ? $_GET['current_page'] : 'standard_kit';
+		$page_template = 'ptemplate-'.$page_template;
+		
+		include('inc/'.$page_template.'.html');
+	</txp:php>
+	
+	<txp:output_form form="moko_footer" />
+	
+</div>
+
+<txp:output_form form="moko_overlay" />
+
+</body>
+</html>
\ No newline at end of file

Deleted: trunk/www.openmoko.com/inc/product_neo1973.html
===================================================================
--- trunk/www.openmoko.com/inc/product_neo1973.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/product_neo1973.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,152 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-<head>
-<txp:output_form form="moko_html_header" />
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-
-<body id="product_neo1973">
-
-<div id="wrapper">
-	<txp:php>global $logo_sufix; $logo_sufix = "_2";</txp:php>
-	
-	<txp:php>
-		global $url_title; $url_title=$GLOBALS['thisarticle']['url_title'];
-		global $thisproductpage; $thisproductpage = link_to_home(array()).'products/'.$url_title.'/';
-		global $current_category; $current_category = isset($_GET['current_page']) ? $GLOBALS['url_title'].'-'.$_GET['current_page'] : $GLOBALS['url_title'].'-standard_kit';		
-		global $logo_sufix; $logo_sufix = "_2";
-	</txp:php>
-	
-	<txp:output_form form="moko_header" />
-	
-	<div id="site_content"></div>
-	<div id="middleblock"><div id="middleblock_inner"><div id="middleblock_inner2">
-	
-		<div id="middleblock_container">
-	
-			<txp:php>
-				// Product heading
-				include txpath.'/lib/classTextile.php';
-					
-				global $hcp;
-				global $big_images;
-				global $small_images;
-				
-				$hcp = safe_row('*', 'textpattern', "url_title = 'product_".$GLOBALS['url_title']."' limit 1");
-				
-				$images = $hcp['Image'];
-				$images = explode(',',$images);
-				
-				if (count($images)>0) {
-					for ($x=0;$x<count($images);$x++) {
-						if ($x%2 == 0) {
-							$big_images[]=$images[$x];
-						} else {
-							$small_images[]=$images[$x];
-						}
-					}
-				}
-				
-				//dmp($big_images);
-				//dmp($small_images);
-				//dmp($hcp);
-			</txp:php>
-		
-			<div class="banner_images">
-				<txp:php>
-					global $big_images;
-					if (count($big_images)>0) {
-						for ($x = 0; $x<count($big_images);$x++) {
-						
-							echo '<div id="tab_big_image_article_'.$x.'" class="tab_item" style="">';
-							echo '	<a href="#" class="button_enlarge"><span>enlarge</span></a>';
-							
-							if ((strpos($_SERVER['HTTP_USER_AGENT'],"MSIE")) and (strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 7")===false)) {
-								$rs = safe_row('*', 'txp_image', "id = ".$big_images[$x]." limit 1");						
-								
-								if (strtolower($rs['ext']) == '.png') {
-									global $prefs;
-		
-									$siteroot = link_to_home(array());								
-									$filepath = $siteroot.$prefs['img_dir'].'/';
-		
-									$filename=$big_images[$x].$rs['ext']; $width = $rs['w']; $height = $rs['h'];
-									$alt = isset($rs['alt']) ? $rs['alt'] : $rs['name'];
-									
-									echo "<img src='".$siteroot."images/blank.gif' width='$width' height='$height'  alt='$alt' style=\"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='".$filepath.$filename."', sizingMethod='scale')\" />";
-								} else {
-									$image = image(array("id"=>$big_images[$x]));
-									echo $image;
-								}
-							} else {				
-								$image = image(array("id"=>$big_images[$x]));
-								echo $image;
-							}					
-		
-							echo "</div>";									
-						}
-					}
-				</txp:php>
-				
-				<div class="shadow">&nbsp;</div>
-			</div>
-					
-			<script type="text/javascript">
-				_pageTabs['big_image']=2;
-				showTab('big_image',0);
-			</script>
-			
-			<div class="banner_content">		
-				<h1><span><txp:php>echo $GLOBALS['hcp']['Title'];</txp:php></span></h1>
-				<txp:php>echo $GLOBALS['hcp']['Body_html'];</txp:php>
-				
-				<div class="banner_details">
-					<div class="banner_left">
-						<h2>Colours available</h2>
-						<ul class="banner_product_thumbs">
-							<txp:php>
-								global $small_images;
-								if (count($small_images)>0) {
-									for ($x = 0; $x<count($small_images);$x++) {
-										//"return showTab('big_image',".$x.")
-										echo "<li><a href='#' onclick=\"return showTab('big_image',".$x.")\">".image(array("id"=>$small_images[$x]))."</a></li>";
-									}
-								}
-							</txp:php>
-						</ul>
-						<div class="clear"></div>
-						<a href="#" class="button_buy_it_now img_button"><span>Buy It Now</span></a>
-					</div>					
-				</div>
-			</div>
-		</div>
-	
-		<ul id="middleblock_tabs">
-			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=standard_kit" 
-			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-standard_kit')) echo ' class="selected"';</txp:php>><span>Standard Kit</span></a></li>
-			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=pictures" 
-			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-pictures')) echo ' class="selected"';</txp:php>><span>Pictures</span></a></li>
-			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=screenshots"
-			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-screenshots')) echo ' class="selected"';</txp:php>><span>Screenshots</span></a></li>
-			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=hardware"
-			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-hardware')) echo ' class="selected"';</txp:php>><span>Hardware</span></a></li>
-			<li><a href="<txp:php>echo $GLOBALS['thisproductpage'];</txp:php>?current_page=software"
-			<txp:php> if ($GLOBALS['current_category'] == ($GLOBALS['url_title'].'-software')) echo ' class="selected"';</txp:php>><span>Software</span></a></li>
-		</ul>
-		
-		<div class="clear"></div>
-	</div></div></div>
-
-	<txp:php>
-		$page_template = isset($_GET['current_page']) ? $_GET['current_page'] : 'standard_kit';
-		$page_template = 'ptemplate-'.$page_template;
-		
-		include('inc/'.$page_template.'.html');
-	</txp:php>
-	
-	<txp:output_form form="moko_footer" />
-	
-</div>
-
-</body>
-</html>
\ No newline at end of file

Deleted: trunk/www.openmoko.com/inc/product_neo1973.html.bak
===================================================================
--- trunk/www.openmoko.com/inc/product_neo1973.html.bak	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/product_neo1973.html.bak	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,344 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-<head>
-<txp:output_form form="moko_html_header" />
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-
-<body id="product_neo1973">
-
-<div id="wrapper">
-	<txp:php>global $logo_sufix; $logo_sufix = "_2";</txp:php>
-	
-	<txp:php>
-		global $logo_sufix; $logo_sufix = "_2";
-		global $url_title; $url_title=$GLOBALS['thisarticle']['url_title'];
-	</txp:php>
-	
-	<txp:output_form form="moko_header" />
-	
-	<div id="site_content"></div>
-	<div id="middleblock"><div id="middleblock_inner"><div id="middleblock_inner2">
-	
-		<div id="middleblock_container">
-	
-			<txp:php>
-				// Product heading
-				include txpath.'/lib/classTextile.php';
-					
-				global $hcp;
-				global $big_images;
-				global $small_images;
-				
-				$hcp = safe_row('*', 'textpattern', "url_title = 'product_".$GLOBALS['url_title']."' limit 1");
-				
-				$images = $hcp['Image'];
-				$images = explode(',',$images);
-				
-				if (count($images)>0) {
-					for ($x=0;$x<count($images);$x++) {
-						if ($x%2 == 0) {
-							$big_images[]=$images[$x];
-						} else {
-							$small_images[]=$images[$x];
-						}
-					}
-				}
-				
-				//dmp($big_images);
-				//dmp($small_images);
-				//dmp($hcp);
-			</txp:php>
-		
-			<div class="banner_images">
-				<txp:php>
-					global $big_images;
-					if (count($big_images)>0) {
-						for ($x = 0; $x<count($big_images);$x++) {
-						
-							echo '<div id="tab_big_image_article_'.$x.'" class="tab_item" style="">';
-							echo '	<a href="#" class="button_enlarge"><span>enlarge</span></a>';
-							
-							if ((strpos($_SERVER['HTTP_USER_AGENT'],"MSIE")) and (strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 7")===false)) {
-								$rs = safe_row('*', 'txp_image', "id = ".$big_images[$x]." limit 1");						
-								
-								if (strtolower($rs['ext']) == '.png') {
-									global $prefs;
-		
-									$siteroot = link_to_home(array());								
-									$filepath = $siteroot.$prefs['img_dir'].'/';
-		
-									$filename=$big_images[$x].$rs['ext']; $width = $rs['w']; $height = $rs['h'];
-									$alt = isset($rs['alt']) ? $rs['alt'] : $rs['name'];
-									
-									echo "<img src='".$siteroot."images/blank.gif' width='$width' height='$height'  alt='$alt' style=\"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='".$filepath.$filename."', sizingMethod='scale')\" />";
-								} else {
-									$image = image(array("id"=>$big_images[$x]));
-									echo $image;
-								}
-							} else {				
-								$image = image(array("id"=>$big_images[$x]));
-								echo $image;
-							}					
-		
-							echo "</div>";									
-						}
-					}
-				</txp:php>
-				
-				<div class="shadow">&nbsp;</div>
-			</div>
-					
-			<script type="text/javascript">
-				_pageTabs['big_image']=2;
-				showTab('big_image',0);
-			</script>
-			
-			<div class="banner_content">		
-				<h1><span><txp:php>echo $GLOBALS['hcp']['Title'];</txp:php></span></h1>
-				<txp:php>echo $GLOBALS['hcp']['Body_html'];</txp:php>
-				
-				<div class="banner_details">
-					<div class="banner_left">
-						<h2>Colours available</h2>
-						<ul class="banner_product_thumbs">
-							<txp:php>
-								global $small_images;
-								if (count($small_images)>0) {
-									for ($x = 0; $x<count($small_images);$x++) {
-										//"return showTab('big_image',".$x.")
-										echo "<li><a href='#' onclick=\"return showTab('big_image',".$x.")\">".image(array("id"=>$small_images[$x]))."</a></li>";
-									}
-								}
-							</txp:php>
-						</ul>
-						<div class="clear"></div>
-						<a href="#" class="button_buy_it_now img_button"><span>Buy It Now</span></a>
-					</div>					
-				</div>
-			</div>
-		</div>
-	
-		<ul id="middleblock_tabs">
-			<li><a href="#tab_main_article_0" onclick="return showTab('main',0)" id="tab_main_article_0_link"><span>Standard Kit</span></a></li>
-			<li><a href="#tab_main_article_1" onclick="return showTab('main',1)" id="tab_main_article_1_link"><span>Pictures</span></a></li>
-			<li><a href="#tab_main_article_2" onclick="return showTab('main',2)" id="tab_main_article_2_link"><span>Screenshots</span></a></li>
-			<li><a href="#tab_main_article_3" onclick="return showTab('main',3)" id="tab_main_article_3_link"><span>Hardware</span></a></li>
-			<li><a href="#tab_main_article_4" onclick="return showTab('main',4)" id="tab_main_article_4_link"><span>Software</span></a></li>
-		</ul>
-		
-		<div class="clear"></div>
-	</div></div></div>
-
-<txp:php>
-$GLOBALS['pretext']['tab_counter']="standard_kit";
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-	<div class="main_container tab_item" id="tab_main_article_0">
-		<div class="left_column">
-			<h3>What's Included:</h3>
-			<ul>
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article_link",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-standard_kit'
-					));
-				</txp:php>
-			</ul>
-		</div>
-		
-		<div class="right_column">
-<txp:php>
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-standard_kit'
-					));
-				</txp:php>
-				
-<script type="text/javascript">
-_pageTabs['<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>']=<txp:php>echo $GLOBALS['pretext']['article_counter'];</txp:php>;
-showTab('<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>',0);
-</script>
-		</div>
-		
-		<div class="clear"></div>
-	</div>
-
-<script type="text/javascript">
-_pageTabs['main']=5;
-showTab('main',0);
-</script>
-
-<txp:php>
-$GLOBALS['pretext']['tab_counter']="pictures";
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-	<div class="main_container tab_item" id="tab_main_article_1">
-		<div class="left_column">
-			<h3>Some Title:</h3>
-			<ul>
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article_link",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-pictures'
-					));
-				</txp:php>
-			</ul>
-		</div>
-		
-		<div class="right_column">
-<txp:php>
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-pictures'
-					));
-				</txp:php>
-<script type="text/javascript">
-_pageTabs['<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>']=<txp:php>echo $GLOBALS['pretext']['article_counter'];</txp:php>;
-showTab('<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>',0);
-</script>
-		</div>
-		
-		<div class="clear"></div>
-	</div>
-	
-<txp:php>
-$GLOBALS['pretext']['tab_counter']="screenshots";
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-	<div class="main_container tab_item" id="tab_main_article_2">
-		<div class="left_column">
-			<h3>Some Title:</h3>
-			<ul>
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article_link",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-screenshots'
-					));
-				</txp:php>
-			</ul>
-		</div>
-		
-		<div class="right_column">
-<txp:php>
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-screenshots'
-					));
-				</txp:php>
-<script type="text/javascript">
-_pageTabs['<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>']=<txp:php>echo $GLOBALS['pretext']['article_counter'];</txp:php>;
-showTab('<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>',0);
-</script>
-		</div>
-		
-		<div class="clear"></div>
-	</div>
-	
-<txp:php>
-$GLOBALS['pretext']['tab_counter']="hardware";
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-	<div class="main_container tab_item" id="tab_main_article_3">
-		<div class="left_column">
-			<h3>Some Title:</h3>
-			<ul>
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article_link",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-hardware'
-					));
-				</txp:php>
-			</ul>
-		</div>
-		
-		<div class="right_column">
-<txp:php>
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-hardware'
-					));
-				</txp:php>
-<script type="text/javascript">
-_pageTabs['<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>']=<txp:php>echo $GLOBALS['pretext']['article_counter'];</txp:php>;
-showTab('<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>',0);
-</script>
-		</div>
-		
-		<div class="clear"></div>
-	</div>
-	
-<txp:php>
-$GLOBALS['pretext']['tab_counter']="software";
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-	<div class="main_container tab_item" id="tab_main_article_4">
-		<div class="left_column">
-			<h3>Some Title:</h3>
-			<ul>
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article_link",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-software'
-					));
-				</txp:php>
-			</ul>
-		</div>
-		
-		<div class="right_column">
-<txp:php>
-$GLOBALS['pretext']['article_counter']=0;
-</txp:php>
-
-				<txp:php>
-					echo article_custom(array(
-						"form"=>"moko_product_article",
-						"section"=>"products",
-						"category"=>$GLOBALS['url_title'].'-software'
-					));
-				</txp:php>
-<script type="text/javascript">
-_pageTabs['<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>']=<txp:php>echo $GLOBALS['pretext']['article_counter'];</txp:php>;
-showTab('<txp:php>echo $GLOBALS['pretext']['tab_counter'];</txp:php>',0);
-</script>
-		</div>
-		
-		<div class="clear"></div>
-	</div>
-	
-	<txp:output_form form="moko_footer" />
-	
-</div>
-
-</body>
-</html>
\ No newline at end of file

Modified: trunk/www.openmoko.com/inc/products.html
===================================================================
--- trunk/www.openmoko.com/inc/products.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/products.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,3 +1,4 @@
+<?php require('textpattern/additional_functions.php') ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 
@@ -49,7 +50,7 @@
 			<div class="article_description">
 			<txp:php>
 				global $rs;
-				echo "<h2><a href='".link_to_home(array())."products/neo1973'>".$rs['title']."</a></h2>";
+				echo "<h2><a href='".link_to_home(array())."products/neo-basic'>".$rs['title']."</a></h2>";
 				echo "<div class='description'>".$rs['body']."</div>";
 			</txp:php>
 			</div>
@@ -93,7 +94,7 @@
 			<div class="article_description">
 			<txp:php>
 				global $rs;
-				echo "<h2><a href='".link_to_home(array())."products/hackers-lunch-box'>".$rs['title']."</a></h2>";
+				echo "<h2><a href='".link_to_home(array())."products/neo-advanced'>".$rs['title']."</a></h2>";
 				echo "<div class='description'>".$rs['body']."</div>";
 			</txp:php>
 			</div>

Added: trunk/www.openmoko.com/inc/ptemplate-hardware.html
===================================================================
--- trunk/www.openmoko.com/inc/ptemplate-hardware.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/ptemplate-hardware.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,36 @@
+<?php
+
+	$scrimages = safe_rows('*', 'txp_image', "category = '".$GLOBALS['current_category']."'");
+	global $prefs;
+	$imgdir = link_to_home(array()).$prefs['img_dir'].'/';
+?>
+
+	<div class="main_container software_block hardware_block" id="tab_main_article_0">               
+		<div class="left_column">
+            <?php		
+                if ($current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'")){
+                    echo "<h3>".$current_article['Title']."</h3>";
+                }
+            ?>
+		</div>
+		
+		<div class="right_column">
+        	<?php
+                if ($current_article['custom_1'] && $current_article['custom_2']) {
+                    printEnlargeableImage($current_article['custom_1'],$current_article['custom_2']);
+                } else if ($current_article['custom_1'] && !$current_article['custom_2']) {
+                    echo image(array("id"=>$current_article['custom_1']));
+                }
+            ?>
+		</div>
+		
+		<div class="clear"></div>
+        
+        <div class="collumn_view">
+                <?php		
+                    if ($current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'")){
+                        echo $current_article['Body_html'];
+                    }
+                ?>
+        </div>
+	</div>
\ No newline at end of file

Added: trunk/www.openmoko.com/inc/ptemplate-pictures.html
===================================================================
--- trunk/www.openmoko.com/inc/ptemplate-pictures.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/ptemplate-pictures.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,102 @@
+<?php
+	$current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'");
+	
+    $small_images	= explode(',',$current_article['custom_1']);
+    $big_images		= explode(',',$current_article['custom_2']);
+    $large_images	= explode(',',$current_article['Image']);
+    
+	global $imgdir;
+      
+	echo "<script>";
+	echo "var images_gallery = true;";
+      
+    $big_images_array = safe_rows('*', 'txp_image', "`id` IN (".$current_article['custom_2'].")");
+    $large_images_array = safe_rows('*', 'txp_image', "`id` IN (".$current_article['Image'].")");
+    
+    $new_big_images_array = array();
+    $new_large_images_array = array();
+    
+    for ($x=0; $x<count($big_images);$x++) {
+        foreach ($big_images_array as $single_big_image) {
+        	if ($single_big_image['id'] == $big_images[$x]) {
+	            $new_big_images_array[] = $single_big_image;
+            	break;
+            }
+        }
+
+        echo 'screenshots_data['.$x.'] = {"description": " ","title":" ","filename":"'.$single_big_image['id'].$single_big_image['ext'].'","width":"'.$single_big_image['w'].'","height":"'.$single_big_image['h'].'"};'."\n";
+    }
+    
+    for ($x=0; $x<count($large_images);$x++) {
+        foreach ($large_images_array as $single_large_image) {
+        	if ($single_large_image['id'] == $large_images[$x]) {
+	            $new_large_images_array[] = $single_large_image;
+            	break;
+            }
+        }
+        
+        echo 'screenshots_large_data['.$x.'] = {"description": " ","title":" ","filename":"'.$single_large_image['id'].$single_large_image['ext'].'","width":"'.$single_large_image['w'].'","height":"'.$single_large_image['h'].'"};'."\n";
+    }
+    
+	echo "</script>";    
+   
+?>
+
+	<div class="main_container pictures_block" id="tab_main_article_0">   
+            <ul class="picture_list">
+                <?php		
+                    $x=0;
+                    for ($x = 0; $x < count($small_images); $x++) {
+                    	$small_image = safe_row('*', 'txp_image', "id = '".$small_images[$x]."'");
+                        echo '<li>';
+                        print_png_image($imgdir.$small_image['id'].$small_image['ext'],null,null,array("alt"=>$small_image['alt'],"onclick"=>"setScreenshot('$x'); return false;","class"=>"action_image"));
+						echo '<img src="'.link_to_home(array()).'images/shadow.png" alt="shadow" class="button_shadow"/>';
+                        echo '</li>';
+                    }
+                
+                ?>
+            </ul>
+            
+		<div class="left_column">
+        	<div id="screenshot_caption">		
+                <?php		
+				if ($current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'")){
+                    echo "<h3>".$current_article['Title']."</h3>";
+                    echo $current_article['Body_html'];
+				}
+                ?>
+			</div>
+
+		</div>
+		
+		<div class="screenshot_image">
+		<?php
+			print_png_image($imgdir.$new_big_images_array[0]['id'].$new_big_images_array[0]['ext'],null,null,array("alt"=>$new_big_images_array[0]['alt'],"id"=>"screenshot_image", "onclick"=>"showLargePicture()"));
+		?>
+		</div>
+		
+		<div class="clear"></div>
+	</div>
+    
+    
+    <!--[if lte IE 6]>
+	<script type="text/javascript" charset="utf-8">
+        var ziki_elements = Element.getElementsByClassName('document','action_image');
+              
+        for (x = 0; x<ziki_elements.length; x++) {
+            ziki_elements[x].observe(
+                'mouseover',
+                function (event) {
+                    var single_ziki = $(Event.element(event)).addClassName('action_image_hover');
+                }
+            );
+            
+            ziki_elements[x].observe(
+                'mouseout',
+                function (event) {
+                    var single_ziki = $(Event.element(event)).removeClassName('action_image_hover');
+                }
+            );
+        }
+    </script>
+<![endif]-->
\ No newline at end of file

Modified: trunk/www.openmoko.com/inc/ptemplate-screenshots.html
===================================================================
--- trunk/www.openmoko.com/inc/ptemplate-screenshots.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/ptemplate-screenshots.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -6,9 +6,21 @@
     
       
 	echo "<script>";
+	echo "var images_gallery = false;";
+    
+    if (((strpos($_SERVER['HTTP_USER_AGENT'],"MSIE")) and (strpos($_SERVER['HTTP_USER_AGENT'],"MSIE 7")===false))) {
+	    echo "var png_fix = true;\n";
+    } else {
+	    echo "var png_fix = false;\n";
+    }
+
     echo "var images_dir = '".$imgdir."';";
     for ($x=0; $x<count($scrimages);$x++) {
-		echo "screenshots_data[".$x."] = {'description':'".$scrimages[$x]['caption']."','title':'".$scrimages[$x]['alt']."','filename':'".$scrimages[$x]['id'].$scrimages[$x]['ext']."','width':'".$scrimages[$x]['w']."','height':'".$scrimages[$x]['h']."'};";
+    	$description = nl2br(var_export($scrimages[$x]['caption'],true));
+        $description = str_replace("\r","",$description);
+        $description = str_replace("\n","",$description);
+        
+		echo "screenshots_data[".$x."] = {'description':".$description.",'title':'".$scrimages[$x]['alt']."','filename':'".$scrimages[$x]['id'].$scrimages[$x]['ext']."','width':'".$scrimages[$x]['w']."','height':'".$scrimages[$x]['h']."'};";
     }
 	echo "</script>";    
 	
@@ -29,7 +41,7 @@
 	<div class="screenshots_right">
 		<div class="screenshot_image">
 		<?php
-			echo '<img src="'.$imgdir.$scrimages[0]['id'].$scrimages[0]['ext'].'" alt="'.$scrimages[0]['alt'].'" id="screenshot_image"/>';;
+                print_png_image($imgdir.$scrimages[0]['id'].$scrimages[0]['ext'],null,null,array("alt"=>$scrimages[0]['alt'],"id"=>"screenshot_image"));
 		?>
 		</div>
 		
@@ -53,4 +65,26 @@
 	</div>
 	
 	<div class="clear" style="height: 10px;"></div>
-</div>
\ No newline at end of file
+</div>
+
+<!--[if lte IE 6]>
+	<script type="text/javascript" charset="utf-8">
+        var ziki_elements = Element.getElementsByClassName('document','screenshot_thumb');
+              
+        for (x = 0; x<ziki_elements.length; x++) {
+            ziki_elements[x].observe(
+                'mouseover',
+                function (event) {
+                    var single_ziki = $(Event.element(event)).up('.screenshot_thumb').addClassName('screenshot_thumb_hover');
+                }
+            );
+            
+            ziki_elements[x].observe(
+                'mouseout',
+                function (event) {
+                    var single_ziki = $(Event.element(event)).up('.screenshot_thumb').removeClassName('screenshot_thumb_hover');
+                }
+            );
+        }
+    </script>
+<![endif]-->
\ No newline at end of file

Added: trunk/www.openmoko.com/inc/ptemplate-software.html
===================================================================
--- trunk/www.openmoko.com/inc/ptemplate-software.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/ptemplate-software.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,32 @@
+<?php
+
+	$scrimages = safe_rows('*', 'txp_image', "category = '".$GLOBALS['current_category']."'");
+	global $prefs;
+	$imgdir = link_to_home(array()).$prefs['img_dir'].'/';
+?>
+
+	<div class="main_container software_block" id="tab_main_article_0">               
+		<div class="left_column">
+            <?php		
+                if ($current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'")){
+                    echo "<h3>".$current_article['Title']."</h3>";
+                                        
+                    if ($current_article['custom_1'] && $current_article['custom_2']) {
+                    	printEnlargeableImage($current_article['custom_1'],$current_article['custom_2']);
+                    } else if ($current_article['custom_1'] && !$current_article['custom_2']) {
+                        echo image(array("id"=>$current_article['custom_1']));
+                    }
+                }
+            ?>
+		</div>
+		
+		<div class="right_column">
+                <?php		
+                    if ($current_article = safe_row('*', 'textpattern', "url_title = '".$GLOBALS['current_category']."'")){
+                        echo $current_article['Body_html'];
+                    }
+                ?>
+		</div>
+		
+		<div class="clear"></div>
+	</div>
\ No newline at end of file

Modified: trunk/www.openmoko.com/inc/ptemplate-standard_kit.html
===================================================================
--- trunk/www.openmoko.com/inc/ptemplate-standard_kit.html	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/inc/ptemplate-standard_kit.html	2007-06-12 04:42:26 UTC (rev 53)
@@ -35,4 +35,10 @@
 		</div>
 		
 		<div class="clear"></div>
+		<div class="standard_kit_top">
+			<a class="top_link" href="#"><span>top</span></a>
+		</div>
+		
+		
+		<div class="clear"></div>
 	</div>
\ No newline at end of file

Added: trunk/www.openmoko.com/js/overlay.js
===================================================================
--- trunk/www.openmoko.com/js/overlay.js	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/js/overlay.js	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,43 @@
+var showLargeImage = function (image,width,height) {
+	overlay_obj = $('overlay');
+	wrapper_obj = $('wrapper');
+	popup_image_obj = $('popup_image');
+	
+	ovheight = (window.opera) ? (document.body.clientHeight || document.documentElement.clientHeight || window.innerHeight) : (document.documentElement.clientHeight || window.innerHeight || document.body.clientHeight);
+	ovheight = (ovheight > wrapper_obj.getHeight()) ? ovheight-10 : wrapper_obj.getHeight();
+
+	overlay_obj.style.height = ovheight+ 10 + 'px';
+	overlay_obj.style.display="block";
+	
+	popup_image_obj.style.width = width+'px';
+	popup_image_obj.style.height = height+'px';
+	popup_image_obj.style.marginLeft = (0-(width/2))+'px';
+	
+	if (png_fix == true) {
+		popup_image_obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+image+", sizingMethod='scale')";
+
+	} else {
+		popup_image_obj.style.backgroundImage = "url("+images_dir+"../images/loader.gif)";
+		popup_image_obj.src = image;
+	}
+	
+	popup_image_obj.style.display = "inline";
+}
+
+var hideLargeImage = function () {
+	overlay_obj = $('overlay');
+	popup_image_obj = $('popup_image');
+	
+	overlay_obj.style.display = "none";
+	popup_image_obj.style.display = "none";
+	if (png_fix == false) {
+		popup_image_obj.src=null;
+	} else {
+		popup_image_obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+null+", sizingMethod='scale')";
+	}
+}
+
+var hideProgressLoader = function () {
+	popup_image_obj = $('popup_image');
+	popup_image_obj.style.backgroundImage = "none";
+}
\ No newline at end of file

Added: trunk/www.openmoko.com/js/prototype.js
===================================================================
--- trunk/www.openmoko.com/js/prototype.js	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/js/prototype.js	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,2515 @@
+/*  Prototype JavaScript framework, version 1.5.0
+ *  (c) 2005-2007 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.5.0',
+  BrowserFeatures: {
+    XPath: !!document.evaluate
+  },
+
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+  emptyFunction: function() {},
+  K: function(x) { return x }
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+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 === undefined) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : object.toString();
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  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);
+  }
+});
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function(event) {
+    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+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;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  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);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback(this);
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+String.interpret = function(value){
+  return value == null ? '' : String(value);
+}
+
+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 = count === undefined ? 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 this;
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = truncation === undefined ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : 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 div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('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 name = decodeURIComponent(pair[0]);
+        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
+
+        if (hash[name] !== undefined) {
+          if (hash[name].constructor != Array)
+            hash[name] = [hash[name]];
+          if (value) hash[name].push(value);
+        }
+        else hash[name] = 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);
+  },
+
+  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.replace(/\\/g, '\\\\');
+    if (useDoubleQuotes)
+      return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    else
+      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (typeof replacement == 'function') return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern  = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    return this.template.gsub(this.pattern, function(match) {
+      var before = match[1];
+      if (before == '\\') return match[2];
+      return before + String.interpret(object[match[3]]);
+    });
+  }
+}
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator) {
+    var index = -number, slices = [], array = this.toArray();
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.map(iterator);
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push((iterator || Prototype.K)(value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = fillWith === undefined ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator) {
+    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) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    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 (typeof args.last() == 'function')
+      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 '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0, length = iterable.length; i < length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+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(value && value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0, length = this.length; i < length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function() {
+    return this.inject([], function(array, value) {
+      return array.include(value) ? array : array.concat([value]);
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string){
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if(window.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(arguments[i].constructor == Array) {
+        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  }
+}
+var Hash = function(obj) {
+  Object.extend(this, obj || {});
+};
+
+Object.extend(Hash, {
+  toQueryString: function(obj) {
+    var parts = [];
+
+	  this.prototype._each.call(obj, function(pair) {
+      if (!pair.key) return;
+
+      if (pair.value && pair.value.constructor == Array) {
+        var values = pair.value.compact();
+        if (values.length < 2) pair.value = values.reduce();
+        else {
+        	key = encodeURIComponent(pair.key);
+          values.each(function(value) {
+            value = value != undefined ? encodeURIComponent(value) : '';
+            parts.push(key + '=' + encodeURIComponent(value));
+          });
+          return;
+        }
+      }
+      if (pair.value == undefined) pair[1] = '';
+      parts.push(pair.map(encodeURIComponent).join('='));
+	  });
+
+    return parts.join('&');
+  }
+});
+
+Object.extend(Hash.prototype, Enumerable);
+Object.extend(Hash.prototype, {
+  _each: function(iterator) {
+    for (var key in this) {
+      var value = this[key];
+      if (value && value == Hash.prototype[key]) continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject(this, function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  remove: function() {
+    var result;
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      var value = this[arguments[i]];
+      if (value !== undefined){
+        if (result === undefined) result = value;
+        else {
+          if (result.constructor != Array) result = [result];
+          result.push(value)
+        }
+      }
+      delete this[arguments[i]];
+    }
+    return result;
+  },
+
+  toQueryString: function() {
+    return Hash.toQueryString(this);
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+});
+
+function $H(object) {
+  if (object && object.constructor == Hash) return object;
+  return new Hash(object);
+};
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  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 (typeof responder[callback] == 'function') {
+        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 = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+
+    this.options.method = this.options.method.toLowerCase();
+    if (typeof this.options.parameters == 'string')
+      this.options.parameters = this.options.parameters.toQueryParams();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  _complete: false,
+
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = this.options.parameters;
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    params = Hash.toQueryString(params);
+    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+
+    // when GET, append parameters to URL
+    if (this.method == 'get' && params)
+      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+
+    try {
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous)
+        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      var body = this.method == 'post' ? (this.options.postBody || params) : null;
+
+      this.transport.send(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 (typeof extras.push == 'function')
+        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() {
+    return !this.transport.status
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.getHeader('Content-type') || 'text/javascript').strip().
+        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
+          this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + state, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) { return null }
+  },
+
+  evalJSON: function() {
+    try {
+      var json = this.getHeader('X-JSON');
+      return json ? eval('(' + json + ')') : null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, param) {
+      this.updateContent();
+      onComplete(transport, param);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.container[this.success() ? 'success' : 'failure'];
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts) response = response.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (this.options.insertion)
+        new this.options.insertion(receiver, response);
+      else
+        receiver.update(response);
+    }
+
+    if (this.success()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(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(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  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 (typeof element == 'string')
+    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(query.snapshotItem(i));
+    return results;
+  };
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+  if (Prototype.BrowserFeatures.XPath) {
+    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
+    return document._getElementsByXPath(q, parentElement);
+  } else {
+    var children = ($(parentElement) || document.body).getElementsByTagName('*');
+    var elements = [], child;
+    for (var i = 0, length = children.length; i < length; i++) {
+      child = children[i];
+      if (Element.hasClassName(child, className))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+  var Element = new Object();
+
+Element.extend = function(element) {
+  if (!element || _nativeExtensions || element.nodeType == 3) return element;
+
+  if (!element._extended && element.tagName && element != window) {
+    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
+
+    if (element.tagName == 'FORM')
+      Object.extend(methods, Form.Methods);
+    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
+      Object.extend(methods, Form.Element.Methods);
+
+    Object.extend(methods, Element.Methods.Simulated);
+
+    for (var property in methods) {
+      var value = methods[property];
+      if (typeof value == 'function' && !(property in element))
+        element[property] = cache.findOrStore(value);
+    }
+  }
+
+  element._extended = true;
+  return element;
+};
+
+Element.extend.cache = {
+  findOrStore: function(value) {
+    return this[value] = this[value] || function() {
+      return value.apply(null, [this].concat($A(arguments)));
+    }
+  }
+};
+
+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, html) {
+    html = typeof html == 'undefined' ? '' : html.toString();
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  replace: function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    if (element.outerHTML) {
+      element.outerHTML = html.stripScripts();
+    } else {
+      var range = element.ownerDocument.createRange();
+      range.selectNodeContents(element);
+      element.parentNode.replaceChild(
+        range.createContextualFragment(html.stripScripts()), element);
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  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 $A($(element).getElementsByTagName('*'));
+  },
+
+  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 (typeof selector == 'string')
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    return Selector.findElement($(element).ancestors(), expression, index);
+  },
+
+  down: function(element, expression, index) {
+    return Selector.findElement($(element).descendants(), expression, index);
+  },
+
+  previous: function(element, expression, index) {
+    return Selector.findElement($(element).previousSiblings(), expression, index);
+  },
+
+  next: function(element, expression, index) {
+    return Selector.findElement($(element).nextSiblings(), expression, index);
+  },
+
+  getElementsBySelector: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  getElementsByClassName: function(element, className) {
+    return document.getElementsByClassName(className, element);
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (document.all && !window.opera) {
+      var t = Element._attributeTranslations;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name])  name = t.names[name];
+      var attribute = element.attributes[name];
+      if(attribute) return attribute.nodeValue;
+    }
+    return element.getAttribute(name);
+  },
+
+  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;
+    if (elementClassName.length == 0) return false;
+    if (elementClassName == className ||
+        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      return true;
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).add(className);
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).remove(className);
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
+    return element;
+  },
+
+  observe: function() {
+    Event.observe.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  stopObserving: function() {
+    Event.stopObserving.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  // 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.match(/^\s*$/);
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = Position.cumulativeOffset(element);
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    if (['float','cssFloat'].include(style))
+      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
+    style = style.camelize();
+    var value = element.style[style];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css[style] : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style];
+      }
+    }
+
+    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
+      value = element['offset'+style.capitalize()] + 'px';
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+    if(style == 'opacity') {
+      if(value) return parseFloat(value);
+      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if(value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (var name in style) {
+      var value = style[name];
+      if(name == 'opacity') {
+        if (value == 1) {
+          value = (/Gecko/.test(navigator.userAgent) &&
+            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else if(value == '') {
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else {
+          if(value < 0.00001) value = 0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
+              'alpha(opacity='+value*100+')';
+        }
+      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
+      element.style[name.camelize()] = 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.style.overflow || 'auto';
+    if ((Element.getStyle(element, 'overflow') || 'visible') != '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;
+  }
+};
+
+Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
+
+Element._attributeTranslations = {};
+
+Element._attributeTranslations.names = {
+  colspan:   "colSpan",
+  rowspan:   "rowSpan",
+  valign:    "vAlign",
+  datetime:  "dateTime",
+  accesskey: "accessKey",
+  tabindex:  "tabIndex",
+  enctype:   "encType",
+  maxlength: "maxLength",
+  readonly:  "readOnly",
+  longdesc:  "longDesc"
+};
+
+Element._attributeTranslations.values = {
+  _getAttr: function(element, attribute) {
+    return element.getAttribute(attribute, 2);
+  },
+
+  _flag: function(element, attribute) {
+    return $(element).hasAttribute(attribute) ? attribute : null;
+  },
+
+  style: function(element) {
+    return element.style.cssText.toLowerCase();
+  },
+
+  title: function(element) {
+    var node = element.getAttributeNode('title');
+    return node.specified ? node.nodeValue : null;
+  }
+};
+
+Object.extend(Element._attributeTranslations.values, {
+  href: Element._attributeTranslations.values._getAttr,
+  src:  Element._attributeTranslations.values._getAttr,
+  disabled: Element._attributeTranslations.values._flag,
+  checked:  Element._attributeTranslations.values._flag,
+  readonly: Element._attributeTranslations.values._flag,
+  multiple: Element._attributeTranslations.values._flag
+});
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    var t = Element._attributeTranslations;
+    attribute = t.names[attribute] || attribute;
+    return $(element).getAttributeNode(attribute).specified;
+  }
+};
+
+// IE is missing .innerHTML support for TABLE-related elements
+if (document.all && !window.opera){
+  Element.Methods.update = function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    var tagName = element.tagName.toUpperCase();
+    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
+      var div = document.createElement('div');
+      switch (tagName) {
+        case 'THEAD':
+        case 'TBODY':
+          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
+          depth = 2;
+          break;
+        case 'TR':
+          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
+          depth = 3;
+          break;
+        case 'TD':
+          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
+          depth = 4;
+      }
+      $A(element.childNodes).each(function(node){
+        element.removeChild(node)
+      });
+      depth.times(function(){ div = div.firstChild });
+
+      $A(div.childNodes).each(
+        function(node){ element.appendChild(node) });
+    } else {
+      element.innerHTML = html.stripScripts();
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  }
+};
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
+    var className = 'HTML' + tag + 'Element';
+    if(window[className]) return;
+    var klass = window[className] = {};
+    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
+  });
+
+Element.addMethods = function(methods) {
+  Object.extend(Element.Methods, methods || {});
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    var cache = Element.extend.cache;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = cache.findOrStore(value);
+    }
+  }
+
+  if (typeof HTMLElement != 'undefined') {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+    copy(Form.Methods, HTMLFormElement.prototype);
+    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
+      copy(Form.Element.Methods, klass.prototype);
+    });
+    _nativeExtensions = true;
+  }
+}
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        var tagName = this.element.tagName.toUpperCase();
+        if (['TBODY', 'TR'].include(tagName)) {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+  initialize: function(expression) {
+    this.params = {classNames: []};
+    this.expression = expression.toString().strip();
+    this.parseExpression();
+    this.compileMatcher();
+  },
+
+  parseExpression: function() {
+    function abort(message) { throw 'Parse error in selector: ' + message; }
+
+    if (this.expression == '')  abort('empty expression');
+
+    var params = this.params, expr = this.expression, match, modifier, clause, rest;
+    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+      params.attributes = params.attributes || [];
+      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+      expr = match[1];
+    }
+
+    if (expr == '*') return this.params.wildcard = true;
+
+    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+      modifier = match[1], clause = match[2], rest = match[3];
+      switch (modifier) {
+        case '#':       params.id = clause; break;
+        case '.':       params.classNames.push(clause); break;
+        case '':
+        case undefined: params.tagName = clause.toUpperCase(); break;
+        default:        abort(expr.inspect());
+      }
+      expr = rest;
+    }
+
+    if (expr.length > 0) abort(expr.inspect());
+  },
+
+  buildMatchExpression: function() {
+    var params = this.params, conditions = [], clause;
+
+    if (params.wildcard)
+      conditions.push('true');
+    if (clause = params.id)
+      conditions.push('element.readAttribute("id") == ' + clause.inspect());
+    if (clause = params.tagName)
+      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+    if ((clause = params.classNames).length > 0)
+      for (var i = 0, length = clause.length; i < length; i++)
+        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
+    if (clause = params.attributes) {
+      clause.each(function(attribute) {
+        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
+        var splitValueBy = function(delimiter) {
+          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+        }
+
+        switch (attribute.operator) {
+          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
+          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+          case '|=':      conditions.push(
+                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+                          ); break;
+          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
+          case '':
+          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
+          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+        }
+      });
+    }
+
+    return conditions.join(' && ');
+  },
+
+  compileMatcher: function() {
+    this.match = new Function('element', 'if (!element.tagName) return false; \
+      element = $(element); \
+      return ' + this.buildMatchExpression());
+  },
+
+  findElements: function(scope) {
+    var element;
+
+    if (element = $(this.params.id))
+      if (this.match(element))
+        if (!scope || Element.childOf(element, scope))
+          return [element];
+
+    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+    var results = [];
+    for (var i = 0, length = scope.length; i < length; i++)
+      if (this.match(element = scope[i]))
+        results.push(Element.extend(element));
+
+    return results;
+  },
+
+  toString: function() {
+    return this.expression;
+  }
+}
+
+Object.extend(Selector, {
+  matchElements: function(elements, expression) {
+    var selector = new Selector(expression);
+    return elements.select(selector.match.bind(selector)).map(Element.extend);
+  },
+
+  findElement: function(elements, expression, index) {
+    if (typeof expression == 'number') index = expression, expression = false;
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    return expressions.map(function(expression) {
+      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
+        var selector = new Selector(expr);
+        return results.inject([], function(elements, result) {
+          return elements.concat(selector.findElements(result || element));
+        });
+      });
+    }).flatten();
+  }
+});
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, getHash) {
+    var data = elements.inject({}, function(result, element) {
+      if (!element.disabled && element.name) {
+        var key = element.name, value = $(element).getValue();
+        if (value != undefined) {
+          if (result[key]) {
+            if (result[key].constructor != Array) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return getHash ? data : Hash.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, getHash) {
+    return Form.serializeElements(Form.getElements(form), getHash);
+  },
+
+  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().each(function(element) {
+      element.blur();
+      element.disabled = 'true';
+    });
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.disabled = '';
+    });
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    return $(form).getElements().find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  }
+}
+
+Object.extend(Form, Form.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+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 Hash.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
+      !['button', 'reset', 'submit'].include(element.type) ) )
+      element.select();
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = false;
+    return element;
+  }
+}
+
+Object.extend(Form.Element, Form.Element.Methods);
+var Field = Form.Element;
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+      default:
+        return Form.Element.Serializers.textarea(element);
+    }
+  },
+
+  inputSelector: function(element) {
+    return element.checked ? element.value : null;
+  },
+
+  textarea: function(element) {
+    return element.value;
+  },
+
+  select: function(element) {
+    return this[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  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 = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
+      ? this.lastValue != value : String(this.lastValue) != String(value));
+    if (changed) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  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.bind(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();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+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,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0, length = Event.observers.length; i < length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    Event._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      try {
+        element.detachEvent('on' + name, observer);
+      } catch (e) {}
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+  Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [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 == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: 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;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  page: 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)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!window.opera || element.tagName=='BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    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 = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    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(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // 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)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    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';
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    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;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.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 [valueL, valueT];
+  }
+}
+
+Element.addMethods();
\ No newline at end of file

Modified: trunk/www.openmoko.com/js/screenshots.js
===================================================================
--- trunk/www.openmoko.com/js/screenshots.js	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/js/screenshots.js	2007-06-12 04:42:26 UTC (rev 53)
@@ -1,12 +1,27 @@
 var screenshots_data = new Array();
+var screenshots_large_data = new Array();
+var current_image = 0;
 
 function setScreenshot(screen_id) {
+	current_image = screen_id;
 	
 	description_block = document.getElementById('screenshot_caption');
 	screenshot = document.getElementById('screenshot_image');
 	
+	if (!images_gallery) {
 	description_block.innerHTML = '<h3>'+screenshots_data[screen_id]['title']+'</h3>'+screenshots_data[screen_id]['description'];
+	}
 	screenshot.style.width = screenshots_data[screen_id]['width'] +"px";
 	screenshot.style.height = screenshots_data[screen_id]['height'] +"px";
+	
+	if (png_fix == true) {
+		screenshot.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+images_dir+screenshots_data[screen_id]['filename']+", sizingMethod='scale')";
+
+	} else {
 	screenshot.src = images_dir+screenshots_data[screen_id]['filename'];
+	}
+}
+
+function showLargePicture() {
+	showLargeImage (images_dir+screenshots_large_data[current_image]['filename'],screenshots_large_data[current_image]['width'],screenshots_large_data[current_image]['height']);
 }
\ No newline at end of file

Modified: trunk/www.openmoko.com/style.css
===================================================================
--- trunk/www.openmoko.com/style.css	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/style.css	2007-06-12 04:42:26 UTC (rev 53)
@@ -2,6 +2,7 @@
 	margin: 0px;
 	padding: 0px;
 	background: #FFF;
+	background-attachment: fixed;
 }
 
 body {
@@ -217,10 +218,19 @@
 	background:#FFF url(images/middleblock_tabs_left.png) no-repeat 0% 0%;
 }
 
+.middleblock_tabs_alt li a:hover {
+	background-image:url(images/middleblock_tabs_left_alt.png)!important;
+}
+
 #middleblock_tabs li a:hover span {
 	background:url(images/middleblock_tabs_right.png) no-repeat 100% 0%;
 }
 
+.middleblock_tabs_alt li a:hover span {
+	background-image:url(images/middleblock_tabs_right_alt.png)!important;
+}
+
+
 #middleblock_tabs li .selected {
 	color: #FF6600;
 	background:#FFF url(images/middleblock_tabs_left.png) no-repeat 0% 0%;
@@ -230,6 +240,14 @@
 	background:url(images/middleblock_tabs_right.png) no-repeat 100% 0%;
 }
 
+.middleblock_tabs_alt li a.selected {
+	background-image:url(images/middleblock_tabs_left_alt.png)!important;
+}
+
+.middleblock_tabs_alt li a.selected span {
+	background-image:url(images/middleblock_tabs_right_alt.png)!important;
+}
+
 .main_container {
 	padding-top: 40px;
 	padding-bottom: 40px;
@@ -244,6 +262,7 @@
 	width: 303px;
 	padding-left: 45px;
 	float: left;
+	line-height: 140%;
 }
 
 .left_column h3 {
@@ -741,7 +760,7 @@
 .banner_content h1 {
 	display: block;
 	margin: 0px 0px 0px 0px;
-	padding: 0px 0px 10px 0x;
+	padding: 0px 0px 10px 0px;
 	font-size: 23px;
 	color: #FF6600;
 }
@@ -1606,6 +1625,11 @@
 }
 
 .header_default { background-image: url(images/navigation_default.jpg) !important;}
+.header_products { background-image: url(images/navigation_products.jpg) !important;}
+.header_accessories { background-image: url(images/navigation_accessories.jpg) !important;}
+#product_neo1973 #header { background-image: url(images/navigation_neo.png) !important; background: #1F1F1F !important;}
+
+/*.header_default { background-image: url(images/navigation_default.jpg) !important;}
 .header_default .nav_home { background-image:url(images/navigation/default/home.png) !important; }
 .header_default .nav_about { background-image:url(images/navigation/default/about.png) !important; }
 .header_default .nav_products { background-image:url(images/navigation/default/products.png) !important; }
@@ -1646,7 +1670,7 @@
 #product_neo1973 .nav_contact { background-image:url(images/navigation/phone/contact.png) !important; }
 #product_neo1973 .nav_shop { background-image:url(images/navigation/phone/shop.png) !important;}
 #product_neo1973 .toptab { background: #424242 url(images/phone_toptab_left.png) no-repeat 0 100%;}
-#product_neo1973 .toptab .inner { background:url(images/phone_toptab_right.png) no-repeat 100% 100%; padding: 2px 15px; position: relative; }
+#product_neo1973 .toptab .inner { background:url(images/phone_toptab_right.png) no-repeat 100% 100%; padding: 2px 15px; position: relative; }*/
 
 .home_quote {
 	width: 248px;
@@ -1777,14 +1801,23 @@
 .screenshot_thumb {
 	width: 56px;
 	height: 80px;
-	background:url(images/thumb_background.png);
+	background:url(images/thumb_background.png) left top;
 	float: left;
 	text-align: center;
 	padding-top: 8px;
 	margin: 0px 12px 20px;
 	cursor: pointer;
+	overflow: hidden;
 }
 
+.screenshot_thumb:hover {
+	background-position: left bottom;
+}
+
+.screenshot_thumb_hover {
+	background-position: left bottom;
+}
+
 #screenshot_caption {
 	width: 315px;
 	float: left;
@@ -1809,9 +1842,223 @@
 	width: 325px;
 	overflow: hidden;
 	float: left;
+	cursor: pointer;
 }
 
 .screenshot_thumbs {
 	float: left;
 	width: 255px;
+}
+
+.pictures_block {
+	background: #040404 url(images/product_pictures_background.png) repeat-x left bottom;
+	color: #FFF;
+	position: relative;
+}
+
+.pictures_block .left_column {
+	width: 393px;
+	position: relative;
+	padding-bottom: 100px;
+}
+
+.pictures_block .right_column {
+	margin-left: 440px;
+	position: relative;
+}
+
+.picture_list {
+	margin: 0px 0px 0px 0px;
+	padding: 0px 0px 0px 0px;
+	list-style: none;
+	display: block;
+	
+	position: absolute;
+	bottom: 60px;
+	left: 50px;
+	z-index: 1000;
+}
+
+* html .pictures_block {
+	height: 10px;
+}
+
+.picture_list li {
+	margin: 0px;
+	padding: 0px 25px 0px 0px;
+	background: 0px;
+	display: inline;
+	position: relative;
+}
+
+.picture_list li .button_shadow {
+	position: absolute;
+	left:0px;
+	width: 90%;
+	height: 25px;
+	bottom: 0px;
+	display: none;
+}
+
+.picture_list li:hover .button_shadow {
+	display: inline;
+}
+
+.picture_list li img.action_image {
+	position: relative;
+	top: 0px;
+	cursor: pointer;
+	margin-bottom: 1px;
+}
+
+.picture_list li img.action_image:hover {
+	position: relative;
+	top: -15px !important;
+}
+
+.picture_list li img.action_image_hover {
+	position: relative;
+	top: -15px !important;
+}
+
+.pictures_block .screenshot_image {
+	float: none;
+	width: auto;
+	overflow: auto;
+	text-align: center;
+	position: absolute;
+	bottom: 35px;
+	right: 10px;
+	width: 480px;
+}
+
+
+.neo-advanced .banner_content {
+	width: 320px !important;
+	margin-top: 100px;
+	margin-left: 40px;
+	border-right: 1px solid #666666;
+	padding: 30px 30px 30px 0px;
+}
+
+.neoadvanced_image {
+	float: right;
+	margin-right: 25px;
+	margin-bottom: 15px;
+}
+
+.neo-advanced {
+	padding-top: 1px;
+}
+
+.standard_kit_top {
+	border-top:1px solid #CCCCCC;
+	margin-left: 350px;
+}
+
+* html .standard_kit_top {
+	padding-top: 20px;
+}
+
+#screenshot_caption p {
+	font-size: 1.03em;
+}
+
+.pictures_block #screenshot_caption {
+	min-height: 265px;
+}
+
+* html .pictures_block #screenshot_caption {
+	height: 225px;
+}
+
+.software_block {
+
+}
+
+.software_block .left_column {
+	width: 410px;
+	padding: 0px 20px 0px 40px;
+}
+
+.software_block .right_column {
+	padding: 0px 40px 0px 20px;
+	margin-left: 480px;
+	color: #333;
+	line-height: 1.5em;
+}
+
+.software_block .left_column h3 {
+	font-size: 16px;
+	color: #FF6600;
+	line-height: 130%;
+	margin-bottom: 70px;
+}
+
+.software_block .right_column blockquote {
+	color: #888;
+	margin-left: 0px;
+	margin-right: 0px;
+}
+
+
+div.collumn_view {
+	-moz-column-gap:3em;
+	-moz-column-width:400px;
+	-webkit-column-width: 13em;
+	-webkit-column-gap: 1em;
+
+	padding: 0px 40px;
+	color: #FFF;
+	
+	line-height: 1.5em;
+}
+
+div.collumn_view h4 {
+	margin-top: 9px;
+	margin-bottom: -7px;
+	padding-bottom: 0px;
+	font-weight: bold;
+}
+
+.hardware_block {
+	background:#050505;
+}
+
+.hardware_block .right_column {
+	padding-bottom: 15px;
+}
+
+#overlay {
+	background: #000;
+	opacity: 0.7;
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	width: 100%;
+	
+	height: 100px;
+	display: none;
+	z-index: 11999;
+	cursor: pointer;
+}
+
+* html #overlay {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);
+}
+
+#popup_image {
+	position: fixed;
+	top: 20px;
+	left: 50%;
+	z-index: 20000;
+	background:url(images/loader.gif) no-repeat center center;
+/*	border: 8px solid #3B3B3B;*/
+	display: none;
+	cursor: pointer;
+}
+
+* html #popup_image {
+	position: absolute;
+	top:expression((documentElement.scrollTop ? documentElement.scrollTop : body.scrollTop) + 20 + "px");
 }
\ No newline at end of file

Added: trunk/www.openmoko.com/textpattern/additional_functions.php
===================================================================
--- trunk/www.openmoko.com/textpattern/additional_functions.php	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/textpattern/additional_functions.php	2007-06-12 04:42:26 UTC (rev 53)
@@ -0,0 +1,19 @@
+<?php
+
+	function printEnlargeableImage($small_image,$big_image) {
+		
+		global $prefs;
+		$imgdir = link_to_home(array()).$prefs['img_dir'].'/';
+		
+		$big_image_obj = safe_row('*', 'txp_image', "id = '".$big_image."'");
+		$filename = $imgdir.$big_image.$big_image_obj['ext'];
+		$width = $big_image_obj['w'];
+		$height = $big_image_obj['h'];
+		
+		echo '<a href="'.$filename.'" onclick="showLargeImage(\''.$filename.'\','.$width.','.$height.'); return false;">';
+		echo image(array("id"=>$small_image));
+		echo '</a>';
+	
+	}
+	
+?>
\ No newline at end of file

Modified: trunk/www.openmoko.com/textpattern/lib/class.thumb.php
===================================================================
--- trunk/www.openmoko.com/textpattern/lib/class.thumb.php	2007-06-12 03:16:22 UTC (rev 52)
+++ trunk/www.openmoko.com/textpattern/lib/class.thumb.php	2007-06-12 04:42:26 UTC (rev 53)
@@ -207,8 +207,22 @@
 	    }		
 	}
 
+	if ($this->_DST['type'] == 3) {
+		$this->_DST['image'] = imageResizeAlpha($this->_SRC['image'],$this->_DST['width'],$this->_DST['height']);
+		
+		imagealphablending($this->_DST['image'], false);
+		imagesavealpha($this->_DST['image'], true);
+		imagepng($this->_DST['image'], $this->_DST['file']);
+		
+		imagedestroy($this->_DST['image']);
+		imagedestroy($this->_SRC['image']);
+		
+		return true;
+		
+	} else {
 	// DST erstellen
 	$this->_DST['image'] = imagecreatetruecolor($this->_DST['width'], $this->_DST['height']);
+	
 	imagecopyresampled($this->_DST['image'], $this->_SRC['image'], 0, 0, $off_w, $off_h, $this->_DST['width'], $this->_DST['height'], $this->_SRC['width'], $this->_SRC['height']);
 	if ($this->sharpen === true) {
 	    $this->_DST['image'] = UnsharpMask($this->_DST['image'],80,.5,3);
@@ -257,6 +271,7 @@
 	imagedestroy($this->_SRC['image']);
 	return true;
     }
+    }
     
     /**
      * return a reference to the the thumbnailimage as a HTML <a> or <img> tag
@@ -410,7 +425,30 @@
     return $img;
 }
 
+/* ADDITIONAL FUNCTIONS FOR ALPHA TRANSPARENT RESIZEING */
 
+/**
+ * Resize a PNG file with transparency to given dimensions
+ * and still retain the alpha channel information
+ * Author:  Alex Le - http://www.alexle.net
+ */
+function imageResizeAlpha(&$src, $w, $h)
+{
+		/* create a new image with the new width and height */
+		$temp = imagecreatetruecolor($w, $h);
+ 
+		/* making the new image transparent */
+//		$background = imagecolorallocate($temp, 0, 0, 0);
+//		ImageColorTransparent($temp, $background); // make the new temp image all transparent
+		imagealphablending($temp, false); // turn off the alpha blending to keep the alpha channel
+ 
+		/* Resize the PNG file */
+		/* use imagecopyresized to gain some performance but loose some quality */
+		imagecopyresized($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
+		/* use imagecopyresampled if you concern more about the quality */
+		//imagecopyresampled($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
+		return $temp;
+}
 
 
 

Modified: trunk/www.openmoko.com/uploaded_images/21.png
===================================================================
(Binary files differ)

Modified: trunk/www.openmoko.com/uploaded_images/21t.png
===================================================================
(Binary files differ)

Added: trunk/www.openmoko.com/uploaded_images/34.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/34.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/34t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/34t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/39.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/39.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/39t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/39t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/40.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/40.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/40t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/40t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/41.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/41.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/41t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/41t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/42.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/42.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/42t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/42t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/43.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/43.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/43t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/43t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/44.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/44.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/44t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/44t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/45.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/45.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/45t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/45t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/46.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/46.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/46t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/46t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/47.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/47.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/47t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/47t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/48.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/48t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/48t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/49.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/49.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/49t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/49t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/50.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/50.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/50t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/50t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/51.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/51.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/51t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/51t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/52.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/52.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/52t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/52t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/53.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/53.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/53t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/53t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/54.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/54.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/54t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/54t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/55.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/55.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/55t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/55t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/56.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/56.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/56t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/56t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/57.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/57.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/57t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/57t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/58.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/58.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/58t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/58t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/59.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/59.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/59t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/59t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/60.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/60.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/www.openmoko.com/uploaded_images/60t.png
===================================================================
(Binary files differ)


Property changes on: trunk/www.openmoko.com/uploaded_images/60t.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream





More information about the webdesign-commitlog mailing list