incubator-deltacloud-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lut...@apache.org
Subject svn commit: r1027303 [2/14] - in /incubator/deltacloud/trunk/site: ./ bin/ deltacloud.org/ deltacloud.org/content/ deltacloud.org/content/Scripts/ deltacloud.org/content/css/ deltacloud.org/content/css/blueprint/ deltacloud.org/content/css/blueprint/pl...
Date Mon, 25 Oct 2010 23:27:05 GMT
Added: incubator/deltacloud/trunk/site/bin/Markdown.pl
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/bin/Markdown.pl?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/bin/Markdown.pl (added)
+++ incubator/deltacloud/trunk/site/bin/Markdown.pl Mon Oct 25 23:26:58 2010
@@ -0,0 +1,1450 @@
+#!/usr/bin/perl
+
+#
+# Markdown -- A text-to-HTML conversion tool for web writers
+#
+# Copyright (c) 2004 John Gruber
+# <http://daringfireball.net/projects/markdown/>
+#
+
+
+package Markdown;
+require 5.006_000;
+use strict;
+use warnings;
+
+use Digest::MD5 qw(md5_hex);
+use vars qw($VERSION);
+$VERSION = '1.0.1';
+# Tue 14 Dec 2004
+
+## Disabled; causes problems under Perl 5.6.1:
+# use utf8;
+# binmode( STDOUT, ":utf8" );  # c.f.: http://acis.openlib.org/dev/perl-unicode-struggle.html
+
+
+#
+# Global default settings:
+#
+my $g_empty_element_suffix = " />";     # Change to ">" for HTML output
+my $g_tab_width = 4;
+
+
+#
+# Globals:
+#
+
+# Regex to match balanced [brackets]. See Friedl's
+# "Mastering Regular Expressions", 2nd Ed., pp. 328-331.
+my $g_nested_brackets;
+$g_nested_brackets = qr{
+	(?> 								# Atomic matching
+	   [^\[\]]+							# Anything other than brackets
+	 | 
+	   \[
+		 (??{ $g_nested_brackets })		# Recursive set of nested brackets
+	   \]
+	)*
+}x;
+
+
+# Table of hash values for escaped characters:
+my %g_escape_table;
+foreach my $char (split //, '\\`*_{}[]()>#+-.!') {
+	$g_escape_table{$char} = md5_hex($char);
+}
+
+
+# Global hashes, used by various utility routines
+my %g_urls;
+my %g_titles;
+my %g_html_blocks;
+
+# Used to track when we're inside an ordered or unordered list
+# (see _ProcessListItems() for details):
+my $g_list_level = 0;
+
+
+#### Blosxom plug-in interface ##########################################
+
+# Set $g_blosxom_use_meta to 1 to use Blosxom's meta plug-in to determine
+# which posts Markdown should process, using a "meta-markup: markdown"
+# header. If it's set to 0 (the default), Markdown will process all
+# entries.
+my $g_blosxom_use_meta = 0;
+
+sub start { 1; }
+sub story {
+	my($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;
+
+	if ( (! $g_blosxom_use_meta) or
+	     (defined($meta::markup) and ($meta::markup =~ /^\s*markdown\s*$/i))
+	     ){
+			$$body_ref  = Markdown($$body_ref);
+     }
+     1;
+}
+
+
+#### Movable Type plug-in interface #####################################
+eval {require MT};  # Test to see if we're running in MT.
+unless ($@) {
+    require MT;
+    import  MT;
+    require MT::Template::Context;
+    import  MT::Template::Context;
+
+	eval {require MT::Plugin};  # Test to see if we're running >= MT 3.0.
+	unless ($@) {
+		require MT::Plugin;
+		import  MT::Plugin;
+		my $plugin = new MT::Plugin({
+			name => "Markdown",
+			description => "A plain-text-to-HTML formatting plugin. (Version: $VERSION)",
+			doc_link => 'http://daringfireball.net/projects/markdown/'
+		});
+		MT->add_plugin( $plugin );
+	}
+
+	MT::Template::Context->add_container_tag(MarkdownOptions => sub {
+		my $ctx	 = shift;
+		my $args = shift;
+		my $builder = $ctx->stash('builder');
+		my $tokens = $ctx->stash('tokens');
+
+		if (defined ($args->{'output'}) ) {
+			$ctx->stash('markdown_output', lc $args->{'output'});
+		}
+
+		defined (my $str = $builder->build($ctx, $tokens) )
+			or return $ctx->error($builder->errstr);
+		$str;		# return value
+	});
+
+	MT->add_text_filter('markdown' => {
+		label     => 'Markdown',
+		docs      => 'http://daringfireball.net/projects/markdown/',
+		on_format => sub {
+			my $text = shift;
+			my $ctx  = shift;
+			my $raw  = 0;
+		    if (defined $ctx) {
+		    	my $output = $ctx->stash('markdown_output'); 
+				if (defined $output  &&  $output =~ m/^html/i) {
+					$g_empty_element_suffix = ">";
+					$ctx->stash('markdown_output', '');
+				}
+				elsif (defined $output  &&  $output eq 'raw') {
+					$raw = 1;
+					$ctx->stash('markdown_output', '');
+				}
+				else {
+					$raw = 0;
+					$g_empty_element_suffix = " />";
+				}
+			}
+			$text = $raw ? $text : Markdown($text);
+			$text;
+		},
+	});
+
+	# If SmartyPants is loaded, add a combo Markdown/SmartyPants text filter:
+	my $smartypants;
+
+	{
+		no warnings "once";
+		$smartypants = $MT::Template::Context::Global_filters{'smarty_pants'};
+	}
+
+	if ($smartypants) {
+		MT->add_text_filter('markdown_with_smartypants' => {
+			label     => 'Markdown With SmartyPants',
+			docs      => 'http://daringfireball.net/projects/markdown/',
+			on_format => sub {
+				my $text = shift;
+				my $ctx  = shift;
+				if (defined $ctx) {
+					my $output = $ctx->stash('markdown_output'); 
+					if (defined $output  &&  $output eq 'html') {
+						$g_empty_element_suffix = ">";
+					}
+					else {
+						$g_empty_element_suffix = " />";
+					}
+				}
+				$text = Markdown($text);
+				$text = $smartypants->($text, '1');
+			},
+		});
+	}
+}
+else {
+#### BBEdit/command-line text filter interface ##########################
+# Needs to be hidden from MT (and Blosxom when running in static mode).
+
+    # We're only using $blosxom::version once; tell Perl not to warn us:
+	no warnings 'once';
+    unless ( defined($blosxom::version) ) {
+		use warnings;
+
+		#### Check for command-line switches: #################
+		my %cli_opts;
+		use Getopt::Long;
+		Getopt::Long::Configure('pass_through');
+		GetOptions(\%cli_opts,
+			'version',
+			'shortversion',
+			'html4tags',
+		);
+		if ($cli_opts{'version'}) {		# Version info
+			print "\nThis is Markdown, version $VERSION.\n";
+			print "Copyright 2004 John Gruber\n";
+			print "http://daringfireball.net/projects/markdown/\n\n";
+			exit 0;
+		}
+		if ($cli_opts{'shortversion'}) {		# Just the version number string.
+			print $VERSION;
+			exit 0;
+		}
+		if ($cli_opts{'html4tags'}) {			# Use HTML tag style instead of XHTML
+			$g_empty_element_suffix = ">";
+		}
+
+
+		#### Process incoming text: ###########################
+		my $text;
+		{
+			local $/;               # Slurp the whole file
+			$text = <>;
+		}
+        print Markdown($text);
+    }
+}
+
+
+
+sub Markdown {
+#
+# Main function. The order in which other subs are called here is
+# essential. Link and image substitutions need to happen before
+# _EscapeSpecialChars(), so that any *'s or _'s in the <a>
+# and <img> tags get encoded.
+#
+	my $text = shift;
+
+	# Clear the global hashes. If we don't clear these, you get conflicts
+	# from other articles when generating a page which contains more than
+	# one article (e.g. an index page that shows the N most recent
+	# articles):
+	%g_urls = ();
+	%g_titles = ();
+	%g_html_blocks = ();
+
+
+	# Standardize line endings:
+	$text =~ s{\r\n}{\n}g; 	# DOS to Unix
+	$text =~ s{\r}{\n}g; 	# Mac to Unix
+
+	# Make sure $text ends with a couple of newlines:
+	$text .= "\n\n";
+
+	# Convert all tabs to spaces.
+	$text = _Detab($text);
+
+	# Strip any lines consisting only of spaces and tabs.
+	# This makes subsequent regexen easier to write, because we can
+	# match consecutive blank lines with /\n+/ instead of something
+	# contorted like /[ \t]*\n+/ .
+	$text =~ s/^[ \t]+$//mg;
+
+	# Turn block-level HTML blocks into hash entries
+	$text = _HashHTMLBlocks($text);
+
+	# Strip link definitions, store in hashes.
+	$text = _StripLinkDefinitions($text);
+
+	$text = _RunBlockGamut($text);
+
+	$text = _UnescapeSpecialChars($text);
+
+	return $text . "\n";
+}
+
+
+sub _StripLinkDefinitions {
+#
+# Strips link definitions from text, stores the URLs and titles in
+# hash references.
+#
+	my $text = shift;
+	my $less_than_tab = $g_tab_width - 1;
+
+	# Link defs are in the form: ^[id]: url "optional title"
+	while ($text =~ s{
+						^[ ]{0,$less_than_tab}\[(.+)\]:	# id = $1
+						  [ \t]*
+						  \n?				# maybe *one* newline
+						  [ \t]*
+						<?(\S+?)>?			# url = $2
+						  [ \t]*
+						  \n?				# maybe one newline
+						  [ \t]*
+						(?:
+							(?<=\s)			# lookbehind for whitespace
+							["(]
+							(.+?)			# title = $3
+							[")]
+							[ \t]*
+						)?	# title is optional
+						(?:\n+|\Z)
+					}
+					{}mx) {
+		$g_urls{lc $1} = _EncodeAmpsAndAngles( $2 );	# Link IDs are case-insensitive
+		if ($3) {
+			$g_titles{lc $1} = $3;
+			$g_titles{lc $1} =~ s/"/&quot;/g;
+		}
+	}
+
+	return $text;
+}
+
+
+sub _HashHTMLBlocks {
+	my $text = shift;
+	my $less_than_tab = $g_tab_width - 1;
+
+	# Hashify HTML blocks:
+	# We only want to do this for block-level HTML tags, such as headers,
+	# lists, and tables. That's because we still want to wrap <p>s around
+	# "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+	# phrase emphasis, and spans. The list of tags we're looking for is
+	# hard-coded:
+	my $block_tags_a = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del/;
+	my $block_tags_b = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math/;
+
+	# First, look for nested blocks, e.g.:
+	# 	<div>
+	# 		<div>
+	# 		tags for inner block must be indented.
+	# 		</div>
+	# 	</div>
+	#
+	# The outermost tags must start at the left margin for this to match, and
+	# the inner nested divs must be indented.
+	# We need to do this before the next, more liberal match, because the next
+	# match will start at the first `<div>` and stop at the first `</div>`.
+	$text =~ s{
+				(						# save in $1
+					^					# start of line  (with /m)
+					<($block_tags_a)	# start tag = $2
+					\b					# word break
+					(.*\n)*?			# any number of lines, minimally matching
+					</\2>				# the matching end tag
+					[ \t]*				# trailing spaces/tabs
+					(?=\n+|\Z)	# followed by a newline or end of document
+				)
+			}{
+				my $key = md5_hex($1);
+				$g_html_blocks{$key} = $1;
+				"\n\n" . $key . "\n\n";
+			}egmx;
+
+
+	#
+	# Now match more liberally, simply from `\n<tag>` to `</tag>\n`
+	#
+	$text =~ s{
+				(						# save in $1
+					^					# start of line  (with /m)
+					<($block_tags_b)	# start tag = $2
+					\b					# word break
+					(.*\n)*?			# any number of lines, minimally matching
+					.*</\2>				# the matching end tag
+					[ \t]*				# trailing spaces/tabs
+					(?=\n+|\Z)	# followed by a newline or end of document
+				)
+			}{
+				my $key = md5_hex($1);
+				$g_html_blocks{$key} = $1;
+				"\n\n" . $key . "\n\n";
+			}egmx;
+	# Special case just for <hr />. It was easier to make a special case than
+	# to make the other regex more complicated.	
+	$text =~ s{
+				(?:
+					(?<=\n\n)		# Starting after a blank line
+					|				# or
+					\A\n?			# the beginning of the doc
+				)
+				(						# save in $1
+					[ ]{0,$less_than_tab}
+					<(hr)				# start tag = $2
+					\b					# word break
+					([^<>])*?			# 
+					/?>					# the matching end tag
+					[ \t]*
+					(?=\n{2,}|\Z)		# followed by a blank line or end of document
+				)
+			}{
+				my $key = md5_hex($1);
+				$g_html_blocks{$key} = $1;
+				"\n\n" . $key . "\n\n";
+			}egx;
+
+	# Special case for standalone HTML comments:
+	$text =~ s{
+				(?:
+					(?<=\n\n)		# Starting after a blank line
+					|				# or
+					\A\n?			# the beginning of the doc
+				)
+				(						# save in $1
+					[ ]{0,$less_than_tab}
+					(?s:
+						<!
+						(--.*?--\s*)+
+						>
+					)
+					[ \t]*
+					(?=\n{2,}|\Z)		# followed by a blank line or end of document
+				)
+			}{
+				my $key = md5_hex($1);
+				$g_html_blocks{$key} = $1;
+				"\n\n" . $key . "\n\n";
+			}egx;
+
+
+	return $text;
+}
+
+
+sub _RunBlockGamut {
+#
+# These are all the transformations that form block-level
+# tags like paragraphs, headers, and list items.
+#
+	my $text = shift;
+
+	$text = _DoHeaders($text);
+
+	# Do Horizontal Rules:
+	$text =~ s{^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$}{\n<hr$g_empty_element_suffix\n}gmx;
+	$text =~ s{^[ ]{0,2}([ ]? -[ ]?){3,}[ \t]*$}{\n<hr$g_empty_element_suffix\n}gmx;
+	$text =~ s{^[ ]{0,2}([ ]? _[ ]?){3,}[ \t]*$}{\n<hr$g_empty_element_suffix\n}gmx;
+
+	$text = _DoLists($text);
+
+	$text = _DoCodeBlocks($text);
+
+	$text = _DoBlockQuotes($text);
+
+	# We already ran _HashHTMLBlocks() before, in Markdown(), but that
+	# was to escape raw HTML in the original Markdown source. This time,
+	# we're escaping the markup we've just created, so that we don't wrap
+	# <p> tags around block-level tags.
+	$text = _HashHTMLBlocks($text);
+
+	$text = _FormParagraphs($text);
+
+	return $text;
+}
+
+
+sub _RunSpanGamut {
+#
+# These are all the transformations that occur *within* block-level
+# tags like paragraphs, headers, and list items.
+#
+	my $text = shift;
+
+	$text = _DoCodeSpans($text);
+
+	$text = _EscapeSpecialChars($text);
+
+	# Process anchor and image tags. Images must come first,
+	# because ![foo][f] looks like an anchor.
+	$text = _DoImages($text);
+	$text = _DoAnchors($text);
+
+	# Make links out of things like `<http://example.com/>`
+	# Must come after _DoAnchors(), because you can use < and >
+	# delimiters in inline links like [this](<url>).
+	$text = _DoAutoLinks($text);
+
+	$text = _EncodeAmpsAndAngles($text);
+
+	$text = _DoItalicsAndBold($text);
+
+	# Do hard breaks:
+	$text =~ s/ {2,}\n/ <br$g_empty_element_suffix\n/g;
+
+	return $text;
+}
+
+
+sub _EscapeSpecialChars {
+	my $text = shift;
+	my $tokens ||= _TokenizeHTML($text);
+
+	$text = '';   # rebuild $text from the tokens
+# 	my $in_pre = 0;	 # Keep track of when we're inside <pre> or <code> tags.
+# 	my $tags_to_skip = qr!<(/?)(?:pre|code|kbd|script|math)[\s>]!;
+
+	foreach my $cur_token (@$tokens) {
+		if ($cur_token->[0] eq "tag") {
+			# Within tags, encode * and _ so they don't conflict
+			# with their use in Markdown for italics and strong.
+			# We're replacing each such character with its
+			# corresponding MD5 checksum value; this is likely
+			# overkill, but it should prevent us from colliding
+			# with the escape values by accident.
+			$cur_token->[1] =~  s! \* !$g_escape_table{'*'}!gx;
+			$cur_token->[1] =~  s! _  !$g_escape_table{'_'}!gx;
+			$text .= $cur_token->[1];
+		} else {
+			my $t = $cur_token->[1];
+			$t = _EncodeBackslashEscapes($t);
+			$text .= $t;
+		}
+	}
+	return $text;
+}
+
+
+sub _DoAnchors {
+#
+# Turn Markdown link shortcuts into XHTML <a> tags.
+#
+	my $text = shift;
+
+	#
+	# First, handle reference-style links: [link text] [id]
+	#
+	$text =~ s{
+		(					# wrap whole match in $1
+		  \[
+		    ($g_nested_brackets)	# link text = $2
+		  \]
+
+		  [ ]?				# one optional space
+		  (?:\n[ ]*)?		# one optional newline followed by spaces
+
+		  \[
+		    (.*?)		# id = $3
+		  \]
+		)
+	}{
+		my $result;
+		my $whole_match = $1;
+		my $link_text   = $2;
+		my $link_id     = lc $3;
+
+		if ($link_id eq "") {
+			$link_id = lc $link_text;     # for shortcut links like [this][].
+		}
+
+		if (defined $g_urls{$link_id}) {
+			my $url = $g_urls{$link_id};
+			$url =~ s! \* !$g_escape_table{'*'}!gx;		# We've got to encode these to avoid
+			$url =~ s!  _ !$g_escape_table{'_'}!gx;		# conflicting with italics/bold.
+			$result = "<a href=\"$url\"";
+			if ( defined $g_titles{$link_id} ) {
+				my $title = $g_titles{$link_id};
+				$title =~ s! \* !$g_escape_table{'*'}!gx;
+				$title =~ s!  _ !$g_escape_table{'_'}!gx;
+				$result .=  " title=\"$title\"";
+			}
+			$result .= ">$link_text</a>";
+		}
+		else {
+			$result = $whole_match;
+		}
+		$result;
+	}xsge;
+
+	#
+	# Next, inline-style links: [link text](url "optional title")
+	#
+	$text =~ s{
+		(				# wrap whole match in $1
+		  \[
+		    ($g_nested_brackets)	# link text = $2
+		  \]
+		  \(			# literal paren
+		  	[ \t]*
+			<?(.*?)>?	# href = $3
+		  	[ \t]*
+			(			# $4
+			  (['"])	# quote char = $5
+			  (.*?)		# Title = $6
+			  \5		# matching quote
+			)?			# title is optional
+		  \)
+		)
+	}{
+		my $result;
+		my $whole_match = $1;
+		my $link_text   = $2;
+		my $url	  		= $3;
+		my $title		= $6;
+
+		$url =~ s! \* !$g_escape_table{'*'}!gx;		# We've got to encode these to avoid
+		$url =~ s!  _ !$g_escape_table{'_'}!gx;		# conflicting with italics/bold.
+		$result = "<a href=\"$url\"";
+
+		if (defined $title) {
+			$title =~ s/"/&quot;/g;
+			$title =~ s! \* !$g_escape_table{'*'}!gx;
+			$title =~ s!  _ !$g_escape_table{'_'}!gx;
+			$result .=  " title=\"$title\"";
+		}
+
+		$result .= ">$link_text</a>";
+
+		$result;
+	}xsge;
+
+	return $text;
+}
+
+
+sub _DoImages {
+#
+# Turn Markdown image shortcuts into <img> tags.
+#
+	my $text = shift;
+
+	#
+	# First, handle reference-style labeled images: ![alt text][id]
+	#
+	$text =~ s{
+		(				# wrap whole match in $1
+		  !\[
+		    (.*?)		# alt text = $2
+		  \]
+
+		  [ ]?				# one optional space
+		  (?:\n[ ]*)?		# one optional newline followed by spaces
+
+		  \[
+		    (.*?)		# id = $3
+		  \]
+
+		)
+	}{
+		my $result;
+		my $whole_match = $1;
+		my $alt_text    = $2;
+		my $link_id     = lc $3;
+
+		if ($link_id eq "") {
+			$link_id = lc $alt_text;     # for shortcut links like ![this][].
+		}
+
+		$alt_text =~ s/"/&quot;/g;
+		if (defined $g_urls{$link_id}) {
+			my $url = $g_urls{$link_id};
+			$url =~ s! \* !$g_escape_table{'*'}!gx;		# We've got to encode these to avoid
+			$url =~ s!  _ !$g_escape_table{'_'}!gx;		# conflicting with italics/bold.
+			$result = "<img src=\"$url\" alt=\"$alt_text\"";
+			if (defined $g_titles{$link_id}) {
+				my $title = $g_titles{$link_id};
+				$title =~ s! \* !$g_escape_table{'*'}!gx;
+				$title =~ s!  _ !$g_escape_table{'_'}!gx;
+				$result .=  " title=\"$title\"";
+			}
+			$result .= $g_empty_element_suffix;
+		}
+		else {
+			# If there's no such link ID, leave intact:
+			$result = $whole_match;
+		}
+
+		$result;
+	}xsge;
+
+	#
+	# Next, handle inline images:  ![alt text](url "optional title")
+	# Don't forget: encode * and _
+
+	$text =~ s{
+		(				# wrap whole match in $1
+		  !\[
+		    (.*?)		# alt text = $2
+		  \]
+		  \(			# literal paren
+		  	[ \t]*
+			<?(\S+?)>?	# src url = $3
+		  	[ \t]*
+			(			# $4
+			  (['"])	# quote char = $5
+			  (.*?)		# title = $6
+			  \5		# matching quote
+			  [ \t]*
+			)?			# title is optional
+		  \)
+		)
+	}{
+		my $result;
+		my $whole_match = $1;
+		my $alt_text    = $2;
+		my $url	  		= $3;
+		my $title		= '';
+		if (defined($6)) {
+			$title		= $6;
+		}
+
+		$alt_text =~ s/"/&quot;/g;
+		$title    =~ s/"/&quot;/g;
+		$url =~ s! \* !$g_escape_table{'*'}!gx;		# We've got to encode these to avoid
+		$url =~ s!  _ !$g_escape_table{'_'}!gx;		# conflicting with italics/bold.
+		$result = "<img src=\"$url\" alt=\"$alt_text\"";
+		if (defined $title) {
+			$title =~ s! \* !$g_escape_table{'*'}!gx;
+			$title =~ s!  _ !$g_escape_table{'_'}!gx;
+			$result .=  " title=\"$title\"";
+		}
+		$result .= $g_empty_element_suffix;
+
+		$result;
+	}xsge;
+
+	return $text;
+}
+
+
+sub _DoHeaders {
+	my $text = shift;
+
+	# Setext-style headers:
+	#	  Header 1
+	#	  ========
+	#  
+	#	  Header 2
+	#	  --------
+	#
+	$text =~ s{ ^(.+)[ \t]*\n=+[ \t]*\n+ }{
+		"<h1>"  .  _RunSpanGamut($1)  .  "</h1>\n\n";
+	}egmx;
+
+	$text =~ s{ ^(.+)[ \t]*\n-+[ \t]*\n+ }{
+		"<h2>"  .  _RunSpanGamut($1)  .  "</h2>\n\n";
+	}egmx;
+
+
+	# atx-style headers:
+	#	# Header 1
+	#	## Header 2
+	#	## Header 2 with closing hashes ##
+	#	...
+	#	###### Header 6
+	#
+	$text =~ s{
+			^(\#{1,6})	# $1 = string of #'s
+			[ \t]*
+			(.+?)		# $2 = Header text
+			[ \t]*
+			\#*			# optional closing #'s (not counted)
+			\n+
+		}{
+			my $h_level = length($1);
+			"<h$h_level>"  .  _RunSpanGamut($2)  .  "</h$h_level>\n\n";
+		}egmx;
+
+	return $text;
+}
+
+
+sub _DoLists {
+#
+# Form HTML ordered (numbered) and unordered (bulleted) lists.
+#
+	my $text = shift;
+	my $less_than_tab = $g_tab_width - 1;
+
+	# Re-usable patterns to match list item bullets and number markers:
+	my $marker_ul  = qr/[*+-]/;
+	my $marker_ol  = qr/\d+[.]/;
+	my $marker_any = qr/(?:$marker_ul|$marker_ol)/;
+
+	# Re-usable pattern to match any entirel ul or ol list:
+	my $whole_list = qr{
+		(								# $1 = whole list
+		  (								# $2
+			[ ]{0,$less_than_tab}
+			(${marker_any})				# $3 = first list item marker
+			[ \t]+
+		  )
+		  (?s:.+?)
+		  (								# $4
+			  \z
+			|
+			  \n{2,}
+			  (?=\S)
+			  (?!						# Negative lookahead for another list item marker
+				[ \t]*
+				${marker_any}[ \t]+
+			  )
+		  )
+		)
+	}mx;
+
+	# We use a different prefix before nested lists than top-level lists.
+	# See extended comment in _ProcessListItems().
+	#
+	# Note: There's a bit of duplication here. My original implementation
+	# created a scalar regex pattern as the conditional result of the test on
+	# $g_list_level, and then only ran the $text =~ s{...}{...}egmx
+	# substitution once, using the scalar as the pattern. This worked,
+	# everywhere except when running under MT on my hosting account at Pair
+	# Networks. There, this caused all rebuilds to be killed by the reaper (or
+	# perhaps they crashed, but that seems incredibly unlikely given that the
+	# same script on the same server ran fine *except* under MT. I've spent
+	# more time trying to figure out why this is happening than I'd like to
+	# admit. My only guess, backed up by the fact that this workaround works,
+	# is that Perl optimizes the substition when it can figure out that the
+	# pattern will never change, and when this optimization isn't on, we run
+	# afoul of the reaper. Thus, the slightly redundant code to that uses two
+	# static s/// patterns rather than one conditional pattern.
+
+	if ($g_list_level) {
+		$text =~ s{
+				^
+				$whole_list
+			}{
+				my $list = $1;
+				my $list_type = ($3 =~ m/$marker_ul/) ? "ul" : "ol";
+				# Turn double returns into triple returns, so that we can make a
+				# paragraph for the last item in a list, if necessary:
+				$list =~ s/\n{2,}/\n\n\n/g;
+				my $result = _ProcessListItems($list, $marker_any);
+				$result = "<$list_type>\n" . $result . "</$list_type>\n";
+				$result;
+			}egmx;
+	}
+	else {
+		$text =~ s{
+				(?:(?<=\n\n)|\A\n?)
+				$whole_list
+			}{
+				my $list = $1;
+				my $list_type = ($3 =~ m/$marker_ul/) ? "ul" : "ol";
+				# Turn double returns into triple returns, so that we can make a
+				# paragraph for the last item in a list, if necessary:
+				$list =~ s/\n{2,}/\n\n\n/g;
+				my $result = _ProcessListItems($list, $marker_any);
+				$result = "<$list_type>\n" . $result . "</$list_type>\n";
+				$result;
+			}egmx;
+	}
+
+
+	return $text;
+}
+
+
+sub _ProcessListItems {
+#
+#	Process the contents of a single ordered or unordered list, splitting it
+#	into individual list items.
+#
+
+	my $list_str = shift;
+	my $marker_any = shift;
+
+
+	# The $g_list_level global keeps track of when we're inside a list.
+	# Each time we enter a list, we increment it; when we leave a list,
+	# we decrement. If it's zero, we're not in a list anymore.
+	#
+	# We do this because when we're not inside a list, we want to treat
+	# something like this:
+	#
+	#		I recommend upgrading to version
+	#		8. Oops, now this line is treated
+	#		as a sub-list.
+	#
+	# As a single paragraph, despite the fact that the second line starts
+	# with a digit-period-space sequence.
+	#
+	# Whereas when we're inside a list (or sub-list), that line will be
+	# treated as the start of a sub-list. What a kludge, huh? This is
+	# an aspect of Markdown's syntax that's hard to parse perfectly
+	# without resorting to mind-reading. Perhaps the solution is to
+	# change the syntax rules such that sub-lists must start with a
+	# starting cardinal number; e.g. "1." or "a.".
+
+	$g_list_level++;
+
+	# trim trailing blank lines:
+	$list_str =~ s/\n{2,}\z/\n/;
+
+
+	$list_str =~ s{
+		(\n)?							# leading line = $1
+		(^[ \t]*)						# leading whitespace = $2
+		($marker_any) [ \t]+			# list marker = $3
+		((?s:.+?)						# list item text   = $4
+		(\n{1,2}))
+		(?= \n* (\z | \2 ($marker_any) [ \t]+))
+	}{
+		my $item = $4;
+		my $leading_line = $1;
+		my $leading_space = $2;
+
+		if ($leading_line or ($item =~ m/\n{2,}/)) {
+			$item = _RunBlockGamut(_Outdent($item));
+		}
+		else {
+			# Recursion for sub-lists:
+			$item = _DoLists(_Outdent($item));
+			chomp $item;
+			$item = _RunSpanGamut($item);
+		}
+
+		"<li>" . $item . "</li>\n";
+	}egmx;
+
+	$g_list_level--;
+	return $list_str;
+}
+
+
+
+sub _DoCodeBlocks {
+#
+#	Process Markdown `<pre><code>` blocks.
+#	
+
+	my $text = shift;
+
+	$text =~ s{
+			(?:\n\n|\A)
+			(	            # $1 = the code block -- one or more lines, starting with a space/tab
+			  (?:
+			    (?:[ ]{$g_tab_width} | \t)  # Lines must start with a tab or a tab-width of spaces
+			    .*\n+
+			  )+
+			)
+			((?=^[ ]{0,$g_tab_width}\S)|\Z)	# Lookahead for non-space at line-start, or end of doc
+		}{
+			my $codeblock = $1;
+			my $result; # return value
+
+			$codeblock = _EncodeCode(_Outdent($codeblock));
+			$codeblock = _Detab($codeblock);
+			$codeblock =~ s/\A\n+//; # trim leading newlines
+			$codeblock =~ s/\s+\z//; # trim trailing whitespace
+
+			$result = "\n\n<pre><code>" . $codeblock . "\n</code></pre>\n\n";
+
+			$result;
+		}egmx;
+
+	return $text;
+}
+
+
+sub _DoCodeSpans {
+#
+# 	*	Backtick quotes are used for <code></code> spans.
+# 
+# 	*	You can use multiple backticks as the delimiters if you want to
+# 		include literal backticks in the code span. So, this input:
+#     
+#         Just type ``foo `bar` baz`` at the prompt.
+#     
+#     	Will translate to:
+#     
+#         <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
+#     
+#		There's no arbitrary limit to the number of backticks you
+#		can use as delimters. If you need three consecutive backticks
+#		in your code, use four for delimiters, etc.
+#
+#	*	You can use spaces to get literal backticks at the edges:
+#     
+#         ... type `` `bar` `` ...
+#     
+#     	Turns to:
+#     
+#         ... type <code>`bar`</code> ...
+#
+
+	my $text = shift;
+
+	$text =~ s@
+			(`+)		# $1 = Opening run of `
+			(.+?)		# $2 = The code block
+			(?<!`)
+			\1			# Matching closer
+			(?!`)
+		@
+ 			my $c = "$2";
+ 			$c =~ s/^[ \t]*//g; # leading whitespace
+ 			$c =~ s/[ \t]*$//g; # trailing whitespace
+ 			$c = _EncodeCode($c);
+			"<code>$c</code>";
+		@egsx;
+
+	return $text;
+}
+
+
+sub _EncodeCode {
+#
+# Encode/escape certain characters inside Markdown code runs.
+# The point is that in code, these characters are literals,
+# and lose their special Markdown meanings.
+#
+    local $_ = shift;
+
+	# Encode all ampersands; HTML entities are not
+	# entities within a Markdown code span.
+	s/&/&amp;/g;
+
+	# Encode $'s, but only if we're running under Blosxom.
+	# (Blosxom interpolates Perl variables in article bodies.)
+	{
+		no warnings 'once';
+    	if (defined($blosxom::version)) {
+    		s/\$/&#036;/g;	
+    	}
+    }
+
+
+	# Do the angle bracket song and dance:
+	s! <  !&lt;!gx;
+	s! >  !&gt;!gx;
+
+	# Now, escape characters that are magic in Markdown:
+	s! \* !$g_escape_table{'*'}!gx;
+	s! _  !$g_escape_table{'_'}!gx;
+	s! {  !$g_escape_table{'{'}!gx;
+	s! }  !$g_escape_table{'}'}!gx;
+	s! \[ !$g_escape_table{'['}!gx;
+	s! \] !$g_escape_table{']'}!gx;
+	s! \\ !$g_escape_table{'\\'}!gx;
+
+	return $_;
+}
+
+
+sub _DoItalicsAndBold {
+	my $text = shift;
+
+	# <strong> must go first:
+	$text =~ s{ (\*\*|__) (?=\S) (.+?[*_]*) (?<=\S) \1 }
+		{<strong>$2</strong>}gsx;
+
+	$text =~ s{ (\*|_) (?=\S) (.+?) (?<=\S) \1 }
+		{<em>$2</em>}gsx;
+
+	return $text;
+}
+
+
+sub _DoBlockQuotes {
+	my $text = shift;
+
+	$text =~ s{
+		  (								# Wrap whole match in $1
+			(
+			  ^[ \t]*>[ \t]?			# '>' at the start of a line
+			    .+\n					# rest of the first line
+			  (.+\n)*					# subsequent consecutive lines
+			  \n*						# blanks
+			)+
+		  )
+		}{
+			my $bq = $1;
+			$bq =~ s/^[ \t]*>[ \t]?//gm;	# trim one level of quoting
+			$bq =~ s/^[ \t]+$//mg;			# trim whitespace-only lines
+			$bq = _RunBlockGamut($bq);		# recurse
+
+			$bq =~ s/^/  /g;
+			# These leading spaces screw with <pre> content, so we need to fix that:
+			$bq =~ s{
+					(\s*<pre>.+?</pre>)
+				}{
+					my $pre = $1;
+					$pre =~ s/^  //mg;
+					$pre;
+				}egsx;
+
+			"<blockquote>\n$bq\n</blockquote>\n\n";
+		}egmx;
+
+
+	return $text;
+}
+
+
+sub _FormParagraphs {
+#
+#	Params:
+#		$text - string to process with html <p> tags
+#
+	my $text = shift;
+
+	# Strip leading and trailing lines:
+	$text =~ s/\A\n+//;
+	$text =~ s/\n+\z//;
+
+	my @grafs = split(/\n{2,}/, $text);
+
+	#
+	# Wrap <p> tags.
+	#
+	foreach (@grafs) {
+		unless (defined( $g_html_blocks{$_} )) {
+			$_ = _RunSpanGamut($_);
+			s/^([ \t]*)/<p>/;
+			$_ .= "</p>";
+		}
+	}
+
+	#
+	# Unhashify HTML blocks
+	#
+	foreach (@grafs) {
+		if (defined( $g_html_blocks{$_} )) {
+			$_ = $g_html_blocks{$_};
+		}
+	}
+
+	return join "\n\n", @grafs;
+}
+
+
+sub _EncodeAmpsAndAngles {
+# Smart processing for ampersands and angle brackets that need to be encoded.
+
+	my $text = shift;
+
+	# Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
+	#   http://bumppo.net/projects/amputator/
+ 	$text =~ s/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/&amp;/g;
+
+	# Encode naked <'s
+ 	$text =~ s{<(?![a-z/?\$!])}{&lt;}gi;
+
+	return $text;
+}
+
+
+sub _EncodeBackslashEscapes {
+#
+#   Parameter:  String.
+#   Returns:    The string, with after processing the following backslash
+#               escape sequences.
+#
+    local $_ = shift;
+
+    s! \\\\  !$g_escape_table{'\\'}!gx;		# Must process escaped backslashes first.
+    s! \\`   !$g_escape_table{'`'}!gx;
+    s! \\\*  !$g_escape_table{'*'}!gx;
+    s! \\_   !$g_escape_table{'_'}!gx;
+    s! \\\{  !$g_escape_table{'{'}!gx;
+    s! \\\}  !$g_escape_table{'}'}!gx;
+    s! \\\[  !$g_escape_table{'['}!gx;
+    s! \\\]  !$g_escape_table{']'}!gx;
+    s! \\\(  !$g_escape_table{'('}!gx;
+    s! \\\)  !$g_escape_table{')'}!gx;
+    s! \\>   !$g_escape_table{'>'}!gx;
+    s! \\\#  !$g_escape_table{'#'}!gx;
+    s! \\\+  !$g_escape_table{'+'}!gx;
+    s! \\\-  !$g_escape_table{'-'}!gx;
+    s! \\\.  !$g_escape_table{'.'}!gx;
+    s{ \\!  }{$g_escape_table{'!'}}gx;
+
+    return $_;
+}
+
+
+sub _DoAutoLinks {
+	my $text = shift;
+
+	$text =~ s{<((https?|ftp):[^'">\s]+)>}{<a href="$1">$1</a>}gi;
+
+	# Email addresses: <address@domain.foo>
+	$text =~ s{
+		<
+        (?:mailto:)?
+		(
+			[-.\w]+
+			\@
+			[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
+		)
+		>
+	}{
+		_EncodeEmailAddress( _UnescapeSpecialChars($1) );
+	}egix;
+
+	return $text;
+}
+
+
+sub _EncodeEmailAddress {
+#
+#	Input: an email address, e.g. "foo@example.com"
+#
+#	Output: the email address as a mailto link, with each character
+#		of the address encoded as either a decimal or hex entity, in
+#		the hopes of foiling most address harvesting spam bots. E.g.:
+#
+#	  <a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;
+#       x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111;
+#       &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>
+#
+#	Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
+#	mailing list: <http://tinyurl.com/yu7ue>
+#
+
+	my $addr = shift;
+
+	srand;
+	my @encode = (
+		sub { '&#' .                 ord(shift)   . ';' },
+		sub { '&#x' . sprintf( "%X", ord(shift) ) . ';' },
+		sub {                            shift          },
+	);
+
+	$addr = "mailto:" . $addr;
+
+	$addr =~ s{(.)}{
+		my $char = $1;
+		if ( $char eq '@' ) {
+			# this *must* be encoded. I insist.
+			$char = $encode[int rand 1]->($char);
+		} elsif ( $char ne ':' ) {
+			# leave ':' alone (to spot mailto: later)
+			my $r = rand;
+			# roughly 10% raw, 45% hex, 45% dec
+			$char = (
+				$r > .9   ?  $encode[2]->($char)  :
+				$r < .45  ?  $encode[1]->($char)  :
+							 $encode[0]->($char)
+			);
+		}
+		$char;
+	}gex;
+
+	$addr = qq{<a href="$addr">$addr</a>};
+	$addr =~ s{">.+?:}{">}; # strip the mailto: from the visible part
+
+	return $addr;
+}
+
+
+sub _UnescapeSpecialChars {
+#
+# Swap back in all the special characters we've hidden.
+#
+	my $text = shift;
+
+	while( my($char, $hash) = each(%g_escape_table) ) {
+		$text =~ s/$hash/$char/g;
+	}
+    return $text;
+}
+
+
+sub _TokenizeHTML {
+#
+#   Parameter:  String containing HTML markup.
+#   Returns:    Reference to an array of the tokens comprising the input
+#               string. Each token is either a tag (possibly with nested,
+#               tags contained therein, such as <a href="<MTFoo>">, or a
+#               run of text between tags. Each element of the array is a
+#               two-element array; the first is either 'tag' or 'text';
+#               the second is the actual value.
+#
+#
+#   Derived from the _tokenize() subroutine from Brad Choate's MTRegex plugin.
+#       <http://www.bradchoate.com/past/mtregex.php>
+#
+
+    my $str = shift;
+    my $pos = 0;
+    my $len = length $str;
+    my @tokens;
+
+    my $depth = 6;
+    my $nested_tags = join('|', ('(?:<[a-z/!$](?:[^<>]') x $depth) . (')*>)' x  $depth);
+    my $match = qr/(?s: <! ( -- .*? -- \s* )+ > ) |  # comment
+                   (?s: <\? .*? \?> ) |              # processing instruction
+                   $nested_tags/ix;                   # nested tags
+
+    while ($str =~ m/($match)/g) {
+        my $whole_tag = $1;
+        my $sec_start = pos $str;
+        my $tag_start = $sec_start - length $whole_tag;
+        if ($pos < $tag_start) {
+            push @tokens, ['text', substr($str, $pos, $tag_start - $pos)];
+        }
+        push @tokens, ['tag', $whole_tag];
+        $pos = pos $str;
+    }
+    push @tokens, ['text', substr($str, $pos, $len - $pos)] if $pos < $len;
+    \@tokens;
+}
+
+
+sub _Outdent {
+#
+# Remove one level of line-leading tabs or spaces
+#
+	my $text = shift;
+
+	$text =~ s/^(\t|[ ]{1,$g_tab_width})//gm;
+	return $text;
+}
+
+
+sub _Detab {
+#
+# Cribbed from a post by Bart Lateur:
+# <http://www.nntp.perl.org/group/perl.macperl.anyperl/154>
+#
+	my $text = shift;
+
+	$text =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
+	return $text;
+}
+
+
+1;
+
+__END__
+
+
+=pod
+
+=head1 NAME
+
+B<Markdown>
+
+
+=head1 SYNOPSIS
+
+B<Markdown.pl> [ B<--html4tags> ] [ B<--version> ] [ B<-shortversion> ]
+    [ I<file> ... ]
+
+
+=head1 DESCRIPTION
+
+Markdown is a text-to-HTML filter; it translates an easy-to-read /
+easy-to-write structured text format into HTML. Markdown's text format
+is most similar to that of plain text email, and supports features such
+as headers, *emphasis*, code blocks, blockquotes, and links.
+
+Markdown's syntax is designed not as a generic markup language, but
+specifically to serve as a front-end to (X)HTML. You can  use span-level
+HTML tags anywhere in a Markdown document, and you can use block level
+HTML tags (like <div> and <table> as well).
+
+For more information about Markdown's syntax, see:
+
+    http://daringfireball.net/projects/markdown/
+
+
+=head1 OPTIONS
+
+Use "--" to end switch parsing. For example, to open a file named "-z", use:
+
+	Markdown.pl -- -z
+
+=over 4
+
+
+=item B<--html4tags>
+
+Use HTML 4 style for empty element tags, e.g.:
+
+    <br>
+
+instead of Markdown's default XHTML style tags, e.g.:
+
+    <br />
+
+
+=item B<-v>, B<--version>
+
+Display Markdown's version number and copyright information.
+
+
+=item B<-s>, B<--shortversion>
+
+Display the short-form version number.
+
+
+=back
+
+
+
+=head1 BUGS
+
+To file bug reports or feature requests (other than topics listed in the
+Caveats section above) please send email to:
+
+    support@daringfireball.net
+
+Please include with your report: (1) the example input; (2) the output
+you expected; (3) the output Markdown actually produced.
+
+
+=head1 VERSION HISTORY
+
+See the readme file for detailed release notes for this version.
+
+1.0.1 - 14 Dec 2004
+
+1.0 - 28 Aug 2004
+
+
+=head1 AUTHOR
+
+    John Gruber
+    http://daringfireball.net
+
+    PHP port and other contributions by Michel Fortin
+    http://michelf.com
+
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2003-2004 John Gruber   
+<http://daringfireball.net/>   
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+  be used to endorse or promote products derived from this software
+  without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
+
+=cut

Propchange: incubator/deltacloud/trunk/site/bin/Markdown.pl
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/deltacloud/trunk/site/building_website.txt
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/building_website.txt?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/building_website.txt (added)
+++ incubator/deltacloud/trunk/site/building_website.txt Mon Oct 25 23:26:58 2010
@@ -0,0 +1,69 @@
+How to Build the Deltacloud Website
+===================================
+
+
+Requirements
+------------
+
+You need to have Ruby version 1.8 installed, along with the following gems:
+
+* webby
+* haml
+* rdiscount
+
+Depending on your distribution, you may need to add the directory with `webby`
+executable to your $PATH.
+
+
+Building the Website
+--------------------
+
+Deltacloud website is created using [Webby][1]. It takes a website defined by a
+set of layouts, templates and content files, runs a count of filters on them
+and produces a static web structure that can be directly posted to a webserver
+or displayed in a browser.
+
+[1]: http://webby.rubyforge.org/
+
+To do this, go to the `deltacloud.org` directory and run `webby`:
+
+    $ cd path/to/docs/deltacloud.org
+    $ webby
+
+The website will be generated in the `deltacloud.org/output/` directory. To
+view it, you can point your browser to that directory.
+
+    file:///path/to/docs/deltacloud.org/output/
+
+In addition, Webby comes with a little webserver that can make it easier. If
+you run:
+
+    $ webby autobuild
+
+The website will be opened in your browser and it will automatically rebuild
+itself any time you change its sources.
+
+However, webby does not track the *.mdown files in the docs/docs directory so
+the autobuild won't trigger when you change them. You must rebuild them manually
+by issuing the `webby` command.
+
+
+File Structure
+--------------
+
+docs/
+    - documentation for Deltacloud
+
+deltacloud.org/
+    - the Deltacloud website
+
+deltacloud.org/content/
+    - the pages that are displayed on the website
+
+deltacloud.org/layouts/
+    - the structure of the website -- including logo, navigation,
+      footers, etc.
+
+deltacloud.org/output/
+    - the final version of the site -- this is what you want to view in a
+      web browser

Propchange: incubator/deltacloud/trunk/site/building_website.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/deltacloud/trunk/site/deltacloud.org/Sitefile
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/Sitefile?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/Sitefile (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/Sitefile Mon Oct 25 23:26:58 2010
@@ -0,0 +1,7 @@
+
+task :default => :build
+
+desc 'deploy the site to the webserver'
+task :deploy => [:build, 'deploy:rsync']
+
+# EOF

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/Scripts/swfobject_modified.js
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/Scripts/swfobject_modified.js?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/Scripts/swfobject_modified.js (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/Scripts/swfobject_modified.js Mon Oct 25 23:26:58 2010
@@ -0,0 +1,669 @@
+/*!    SWFObject v2.0 <http://code.google.com/p/swfobject/>
+       Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
+       This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
+*/
+
+var swfobject = function() {
+
+       var UNDEF = "undefined",
+               OBJECT = "object",
+               SHOCKWAVE_FLASH = "Shockwave Flash",
+               SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+               FLASH_MIME_TYPE = "application/x-shockwave-flash",
+               EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+
+               win = window,
+               doc = document,
+               nav = navigator,
+
+               domLoadFnArr = [],
+               regObjArr = [],
+               timer = null,
+               storedAltContent = null,
+               storedAltContentId = null,
+               isDomLoaded = false,
+               isExpressInstallActive = false;
+
+       /* Centralized function for browser feature detection
+               - Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
+               - User agent string detection is only used when no alternative is possible
+               - Is executed directly for optimal performance
+       */
+       var ua = function() {
+               var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF && typeof doc.appendChild != UNDEF && typeof doc.replaceChild != UNDEF && typeof doc.removeChild != UNDEF && typeof doc.cloneNode != UNDEF,
+                       playerVersion = [0,0,0],
+                       d = null;
+               if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+                       d = nav.plugins[SHOCKWAVE_FLASH].description;
+                       if (d) {
+                               d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+                               playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+                               playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+                               playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
+                       }
+               }
+               else if (typeof win.ActiveXObject != UNDEF) {
+                       var a = null, fp6Crash = false;
+                       try {
+                               a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
+                       }
+                       catch(e) {
+                               try {
+                                       a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
+                                       playerVersion = [6,0,21];
+                                       a.AllowScriptAccess = "always";  // Introduced in fp6.0.47
+                               }
+                               catch(e) {
+                                       if (playerVersion[0] == 6) {
+                                               fp6Crash = true;
+                                       }
+                               }
+                               if (!fp6Crash) {
+                                       try {
+                                               a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+                                       }
+                                       catch(e) {}
+                               }
+                       }
+                       if (!fp6Crash && a) { // a will return null when ActiveX is disabled
+                               try {
+                                       d = a.GetVariable("$version");  // Will crash fp6.0.21/23/29
+                                       if (d) {
+                                               d = d.split(" ")[1].split(",");
+                                               playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+                                       }
+                               }
+                               catch(e) {}
+                       }
+               }
+               var u = nav.userAgent.toLowerCase(),
+                       p = nav.platform.toLowerCase(),
+                       webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+                       ie = false,
+                       windows = p ? /win/.test(p) : /win/.test(u),
+                       mac = p ? /mac/.test(p) : /mac/.test(u);
+               /*@cc_on
+                       ie = true;
+                       @if (@_win32)
+                               windows = true;
+                       @elif (@_mac)
+                               mac = true;
+                       @end
+               @*/
+               return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
+       }();
+
+       /* Cross-browser onDomLoad
+               - Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
+               - Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
+       */
+       var onDomLoad = function() {
+               if (!ua.w3cdom) {
+                       return;
+               }
+               addDomLoadEvent(main);
+               if (ua.ie && ua.win) {
+                       try {  // Avoid a possible Operation Aborted error
+                               doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors
+                               var s = getElementById("__ie_ondomload");
+                               if (s) {
+                                       s.onreadystatechange = function() {
+                                               if (this.readyState == "complete") {
+                                                       this.parentNode.removeChild(this);
+                                                       callDomLoadFunctions();
+                                               }
+                                       };
+                               }
+                       }
+                       catch(e) {}
+               }
+               if (ua.webkit && typeof doc.readyState != UNDEF) {
+                       timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
+               }
+               if (typeof doc.addEventListener != UNDEF) {
+                       doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
+               }
+               addLoadEvent(callDomLoadFunctions);
+       }();
+
+       function callDomLoadFunctions() {
+               if (isDomLoaded) {
+                       return;
+               }
+               if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
+                       var s = createElement("span");
+                       try { // Avoid a possible Operation Aborted error
+                               var t = doc.getElementsByTagName("body")[0].appendChild(s);
+                               t.parentNode.removeChild(t);
+                       }
+                       catch (e) {
+                               return;
+                       }
+               }
+               isDomLoaded = true;
+               if (timer) {
+                       clearInterval(timer);
+                       timer = null;
+               }
+               var dl = domLoadFnArr.length;
+               for (var i = 0; i < dl; i++) {
+                       domLoadFnArr[i]();
+               }
+       }
+
+       function addDomLoadEvent(fn) {
+               if (isDomLoaded) {
+                       fn();
+               }
+               else {
+                       domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+               }
+       }
+
+       /* Cross-browser onload
+               - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
+               - Will fire an event as soon as a web page including all of its assets are loaded
+        */
+       function addLoadEvent(fn) {
+               if (typeof win.addEventListener != UNDEF) {
+                       win.addEventListener("load", fn, false);
+               }
+               else if (typeof doc.addEventListener != UNDEF) {
+                       doc.addEventListener("load", fn, false);
+               }
+               else if (typeof win.attachEvent != UNDEF) {
+                       win.attachEvent("onload", fn);
+               }
+               else if (typeof win.onload == "function") {
+                       var fnOld = win.onload;
+                       win.onload = function() {
+                               fnOld();
+                               fn();
+                       };
+               }
+               else {
+                       win.onload = fn;
+               }
+       }
+
+       /* Main function
+               - Will preferably execute onDomLoad, otherwise onload (as a fallback)
+       */
+       function main() { // Static publishing only
+               var rl = regObjArr.length;
+               for (var i = 0; i < rl; i++) { // For each registered object element
+                       var id = regObjArr[i].id;
+                       if (ua.pv[0] > 0) {
+                               var obj = getElementById(id);
+                               if (obj) {
+                                       regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
+                                       regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
+                                       if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
+                                               if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
+                                                       fixParams(obj);
+                                               }
+                                               setVisibility(id, true);
+                                       }
+                                       else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
+                                               showExpressInstall(regObjArr[i]);
+                                       }
+                                       else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
+                                               displayAltContent(obj);
+                                       }
+                               }
+                       }
+                       else {  // If no fp is installed, we let the object element do its job (show alternative content)
+                               setVisibility(id, true);
+                       }
+               }
+       }
+
+       /* Fix nested param elements, which are ignored by older webkit engines
+               - This includes Safari up to and including version 1.2.2 on Mac OS 10.3
+               - Fall back to the proprietary embed element
+       */
+       function fixParams(obj) {
+               var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+               if (nestedObj) {
+                       var e = createElement("embed"), a = nestedObj.attributes;
+                       if (a) {
+                               var al = a.length;
+                               for (var i = 0; i < al; i++) {
+                                       if (a[i].nodeName.toLowerCase() == "data") {
+                                               e.setAttribute("src", a[i].nodeValue);
+                                       }
+                                       else {
+                                               e.setAttribute(a[i].nodeName, a[i].nodeValue);
+                                       }
+                               }
+                       }
+                       var c = nestedObj.childNodes;
+                       if (c) {
+                               var cl = c.length;
+                               for (var j = 0; j < cl; j++) {
+                                       if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") {
+                                               e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
+                                       }
+                               }
+                       }
+                       obj.parentNode.replaceChild(e, obj);
+               }
+       }
+
+       /* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect
+               - Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML
+               - Dynamic publishing only
+       */
+       function fixObjectLeaks(id) {
+               if (ua.ie && ua.win && hasPlayerVersion("8.0.0")) {
+                       win.attachEvent("onunload", function () {
+                               var obj = getElementById(id);
+                               if (obj) {
+                                       for (var i in obj) {
+                                               if (typeof obj[i] == "function") {
+                                                       obj[i] = function() {};
+                                               }
+                                       }
+                                       obj.parentNode.removeChild(obj);
+                               }
+                       });
+               }
+       }
+
+       /* Show the Adobe Express Install dialog
+               - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
+       */
+       function showExpressInstall(regObj) {
+               isExpressInstallActive = true;
+               var obj = getElementById(regObj.id);
+               if (obj) {
+                       if (regObj.altContentId) {
+                               var ac = getElementById(regObj.altContentId);
+                               if (ac) {
+                                       storedAltContent = ac;
+                                       storedAltContentId = regObj.altContentId;
+                               }
+                       }
+                       else {
+                               storedAltContent = abstractAltContent(obj);
+                       }
+                       if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
+                               regObj.width = "310";
+                       }
+                       if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
+                               regObj.height = "137";
+                       }
+                       doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+                       var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+                               dt = doc.title,
+                               fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
+                               replaceId = regObj.id;
+                       // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
+                       // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+                       if (ua.ie && ua.win && obj.readyState != 4) {
+                               var newObj = createElement("div");
+                               replaceId += "SWFObjectNew";
+                               newObj.setAttribute("id", replaceId);
+                               obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
+                               obj.style.display = "none";
+                               win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
+                       }
+                       createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
+               }
+       }
+
+       /* Functions to abstract and display alternative content
+       */
+       function displayAltContent(obj) {
+               if (ua.ie && ua.win && obj.readyState != 4) {
+                       // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
+                       // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+                       var el = createElement("div");
+                       obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
+                       el.parentNode.replaceChild(abstractAltContent(obj), el);
+                       obj.style.display = "none";
+                       win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
+               }
+               else {
+                       obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+               }
+       }
+
+       function abstractAltContent(obj) {
+               var ac = createElement("div");
+               if (ua.win && ua.ie) {
+                       ac.innerHTML = obj.innerHTML;
+               }
+               else {
+                       var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+                       if (nestedObj) {
+                               var c = nestedObj.childNodes;
+                               if (c) {
+                                       var cl = c.length;
+                                       for (var i = 0; i < cl; i++) {
+                                               if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) {
+                                                       ac.appendChild(c[i].cloneNode(true));
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return ac;
+       }
+
+       /* Cross-browser dynamic SWF creation
+       */
+       function createSWF(attObj, parObj, id) {
+               var r, el = getElementById(id);
+               if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+                       attObj.id = id;
+               }
+               if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
+                       var att = "";
+                       for (var i in attObj) {
+                               if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
+                                       if (i == "data") {
+                                               parObj.movie = attObj[i];
+                                       }
+                                       else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+                                               att += ' class="' + attObj[i] + '"';
+                                       }
+                                       else if (i != "classid") {
+                                               att += ' ' + i + '="' + attObj[i] + '"';
+                                       }
+                               }
+                       }
+                       var par = "";
+                       for (var j in parObj) {
+                               if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
+                                       par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+                               }
+                       }
+                       el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+                       fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only
+                       r = getElementById(attObj.id);
+               }
+               else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
+                       var e = createElement("embed");
+                       e.setAttribute("type", FLASH_MIME_TYPE);
+                       for (var k in attObj) {
+                               if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
+                                       if (k == "data") {
+                                               e.setAttribute("src", attObj[k]);
+                                       }
+                                       else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+                                               e.setAttribute("class", attObj[k]);
+                                       }
+                                       else if (k != "classid") { // Filter out IE specific attribute
+                                               e.setAttribute(k, attObj[k]);
+                                       }
+                               }
+                       }
+                       for (var l in parObj) {
+                               if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
+                                       if (l != "movie") { // Filter out IE specific param element
+                                               e.setAttribute(l, parObj[l]);
+                                       }
+                               }
+                       }
+                       el.parentNode.replaceChild(e, el);
+                       r = e;
+               }
+               else { // Well-behaving browsers
+                       var o = createElement(OBJECT);
+                       o.setAttribute("type", FLASH_MIME_TYPE);
+                       for (var m in attObj) {
+                               if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
+                                       if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+                                               o.setAttribute("class", attObj[m]);
+                                       }
+                                       else if (m != "classid") { // Filter out IE specific attribute
+                                               o.setAttribute(m, attObj[m]);
+                                       }
+                               }
+                       }
+                       for (var n in parObj) {
+                               if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
+                                       createObjParam(o, n, parObj[n]);
+                               }
+                       }
+                       el.parentNode.replaceChild(o, el);
+                       r = o;
+               }
+               return r;
+       }
+
+       function createObjParam(el, pName, pValue) {
+               var p = createElement("param");
+               p.setAttribute("name", pName);
+               p.setAttribute("value", pValue);
+               el.appendChild(p);
+       }
+
+       function getElementById(id) {
+               return doc.getElementById(id);
+       }
+
+       function createElement(el) {
+               return doc.createElement(el);
+       }
+
+       function hasPlayerVersion(rv) {
+               var pv = ua.pv, v = rv.split(".");
+               v[0] = parseInt(v[0], 10);
+               v[1] = parseInt(v[1], 10);
+               v[2] = parseInt(v[2], 10);
+               return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+       }
+
+       /* Cross-browser dynamic CSS creation
+               - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
+       */
+       function createCSS(sel, decl) {
+               if (ua.ie && ua.mac) {
+                       return;
+               }
+               var h = doc.getElementsByTagName("head")[0], s = createElement("style");
+               s.setAttribute("type", "text/css");
+               s.setAttribute("media", "screen");
+               if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
+                       s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+               }
+               h.appendChild(s);
+               if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+                       var ls = doc.styleSheets[doc.styleSheets.length - 1];
+                       if (typeof ls.addRule == OBJECT) {
+                               ls.addRule(sel, decl);
+                       }
+               }
+       }
+
+       function setVisibility(id, isVisible) {
+               var v = isVisible ? "visible" : "hidden";
+               if (isDomLoaded) {
+                       getElementById(id).style.visibility = v;
+               }
+               else {
+                       createCSS("#" + id, "visibility:" + v);
+               }
+       }
+
+       function getTargetVersion(obj) {
+           if (!obj)
+               return 0;
+               var c = obj.childNodes;
+               var cl = c.length;
+               for (var i = 0; i < cl; i++) {
+                       if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "object") {
+                           c = c[i].childNodes;
+                           cl = c.length;
+                           i = 0;
+                       }
+                       if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param" && c[i].getAttribute("name") == "swfversion") {
+                          return c[i].getAttribute("value");
+                       }
+               }
+               return 0;
+       }
+
+       function getExpressInstall(obj) {
+           if (!obj)
+               return "";
+               var c = obj.childNodes;
+               var cl = c.length;
+               for (var i = 0; i < cl; i++) {
+                       if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "object") {
+                           c = c[i].childNodes;
+                           cl = c.length;
+                           i = 0;
+                       }
+                       if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param" && c[i].getAttribute("name") == "expressinstall") {
+                           return c[i].getAttribute("value");
+                       }
+               }
+               return "";
+       }
+
+       return {
+               /* Public API
+                       - Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
+               */
+               registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
+                       if (!ua.w3cdom || !objectIdStr) {
+                               return;
+                       }
+                       var obj = document.getElementById(objectIdStr);
+                       var xi = getExpressInstall(obj);
+                       var regObj = {};
+                       regObj.id = objectIdStr;
+                       regObj.swfVersion = swfVersionStr ? swfVersionStr : getTargetVersion(obj);
+                       regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : ((xi != "") ? xi : false);
+                       regObjArr[regObjArr.length] = regObj;
+                       setVisibility(objectIdStr, false);
+               },
+
+               getObjectById: function(objectIdStr) {
+                       var r = null;
+                       if (ua.w3cdom && isDomLoaded) {
+                               var o = getElementById(objectIdStr);
+                               if (o) {
+                                       var n = o.getElementsByTagName(OBJECT)[0];
+                                       if (!n || (n && typeof o.SetVariable != UNDEF)) {
+                                       r = o;
+                                       }
+                                       else if (typeof n.SetVariable != UNDEF) {
+                                               r = n;
+                                       }
+                               }
+                       }
+                       return r;
+               },
+
+               embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
+                       if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
+                               return;
+                       }
+                       widthStr += ""; // Auto-convert to string to make it idiot proof
+                       heightStr += "";
+                       if (hasPlayerVersion(swfVersionStr)) {
+                               setVisibility(replaceElemIdStr, false);
+                               var att = (typeof attObj == OBJECT) ? attObj : {};
+                               att.data = swfUrlStr;
+                               att.width = widthStr;
+                               att.height = heightStr;
+                               var par = (typeof parObj == OBJECT) ? parObj : {};
+                               if (typeof flashvarsObj == OBJECT) {
+                                       for (var i in flashvarsObj) {
+                                               if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
+                                                       if (typeof par.flashvars != UNDEF) {
+                                                               par.flashvars += "&" + i + "=" + flashvarsObj[i];
+                                                       }
+                                                       else {
+                                                               par.flashvars = i + "=" + flashvarsObj[i];
+                                                       }
+                                               }
+                                       }
+                               }
+                               addDomLoadEvent(function() {
+                                       createSWF(att, par, replaceElemIdStr);
+                                       if (att.id == replaceElemIdStr) {
+                                               setVisibility(replaceElemIdStr, true);
+                                       }
+                               });
+                       }
+                       else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
+                               setVisibility(replaceElemIdStr, false);
+                               addDomLoadEvent(function() {
+                                       var regObj = {};
+                                       regObj.id = regObj.altContentId = replaceElemIdStr;
+                                       regObj.width = widthStr;
+                                       regObj.height = heightStr;
+                                       regObj.expressInstall = xiSwfUrlStr;
+                                       showExpressInstall(regObj);
+                               });
+                       }
+               },
+
+               getFlashPlayerVersion: function() {
+                       return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+               },
+
+               hasFlashPlayerVersion:hasPlayerVersion,
+
+               createSWF: function(attObj, parObj, replaceElemIdStr) {
+                       if (ua.w3cdom && isDomLoaded) {
+                               return createSWF(attObj, parObj, replaceElemIdStr);
+                       }
+                       else {
+                               return undefined;
+                       }
+               },
+
+               createCSS: function(sel, decl) {
+                       if (ua.w3cdom) {
+                               createCSS(sel, decl);
+                       }
+               },
+
+               addDomLoadEvent:addDomLoadEvent,
+
+               addLoadEvent:addLoadEvent,
+
+               getQueryParamValue: function(param) {
+                       var q = doc.location.search || doc.location.hash;
+                       if (param == null) {
+                               return q;
+                       }
+                       if(q) {
+                               var pairs = q.substring(1).split("&");
+                               for (var i = 0; i < pairs.length; i++) {
+                                       if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+                                               return pairs[i].substring((pairs[i].indexOf("=") + 1));
+                                       }
+                               }
+                       }
+                       return "";
+               },
+
+               // For internal usage only
+               expressInstallCallback: function() {
+                       if (isExpressInstallActive && storedAltContent) {
+                               var obj = getElementById(EXPRESS_INSTALL_ID);
+                               if (obj) {
+                                       obj.parentNode.replaceChild(storedAltContent, obj);
+                                       if (storedAltContentId) {
+                                               setVisibility(storedAltContentId, true);
+                                               if (ua.ie && ua.win) {
+                                                       storedAltContent.style.display = "block";
+                                               }
+                                       }
+                                       storedAltContent = null;
+                                       storedAltContentId = null;
+                                       isExpressInstallActive = false;
+                               }
+                       }
+               }
+
+       };
+
+}();

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/_external.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/_external.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/_external.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/_external.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,16 @@
+---
+filter:
+  - haml
+  - outline
+---
+- page = render(:partial => "markdown", :locals => {:path => path} )
+- doc = Hpricot(page)
+- header = (doc/"h1").remove
+= header.first
+/- title, rest = page.split("</h1>")
+
+/= title + '</h1>'
+<toc class="toc" numbering="off" toc_style="ul" toc_range="h2-h3" />
+
+/= rest
+= doc.to_html

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/_markdown.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/_markdown.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/_markdown.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/_markdown.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,6 @@
+---
+filter:
+  - haml
+  - markdown
+---
+= File.open(path).read

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/_navigation.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/_navigation.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/_navigation.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/_navigation.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,17 @@
+---
+filter: haml
+---
+- menu = [ { :href => "index.html", :title => "Deltacloud Home", :text => "Home" }, |
+  { :href => "download.html", :title => "Get the latest releases", :text => "Download" }, |
+  { :href => "contribute.html", :title => "Information about design/development process", :text => "Contribute" }, |
+  { :href => "documentation.html", :title => "Project documentation", :text => "Documentation" } ] |
+
+#navigation
+  #menu.container
+    %ul.l0
+      - menu.each do |link|
+        %li
+          - current_page = "#{area}.html" unless area.nil? or area.empty? or (link[:href].index(area) != 0)
+          - state = (link[:href] == current_page) ? 'active' : 'inactive'
+          %a{ :class => state, :href => "./#{link[:href]}", :title => link[:title] }<
+            = link[:text]

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/_providers.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/_providers.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/_providers.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/_providers.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,49 @@
+---
+filter:
+  - haml
+---
+%table#providers
+  %tr
+    %th.emptycell &nbsp;
+    %th
+      %strong Create
+      new instances
+    %th
+      %strong Start
+      stopped instances
+    %th
+      %strong Stop
+      running instances
+    %th
+      %strong Reboot
+      running instances
+    %th
+      %strong Destroy
+      instances
+    %th
+      List all/get details about
+      %strong hardware profiles
+    %th
+      List all/get details about
+      %strong realms
+    %th
+      List all/get details about
+      %strong images
+    %th
+      List all/get details about
+      %strong instances
+  - provider_support.each do |provider|
+    %tr
+      %td.provider
+        = provider[:name]
+        - if not provider[:driver]
+          %span coming soon
+      = support_indicator(provider[:instance][:create])
+      = support_indicator(provider[:instance][:start])
+      = support_indicator(provider[:instance][:stop])
+      = support_indicator(provider[:instance][:reboot])
+      = support_indicator(provider[:instance][:destroy])
+      = support_indicator(provider[:list][:hardware_profiles])
+      = support_indicator(provider[:list][:realms])
+      = support_indicator(provider[:list][:images])
+      = support_indicator(provider[:list][:instances])

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/_submenu-documentation.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/_submenu-documentation.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/_submenu-documentation.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/_submenu-documentation.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,11 @@
+---
+filter: haml
+---
+#subnavigation
+  #submenu.container
+    %ul.l1
+      - documentation_pages.each do |link|
+        %li
+          - state = (link[:href] == current_page) ? 'active' : 'inactive'
+          %a{:class => state, :href => link[:href]}
+            = link[:menu]

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/api.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/api.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/api.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/api.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,8 @@
+---
+title: Deltacloud - Documentation
+area: documentation
+extension: html
+filter:
+  - haml
+---
+= render(:partial => "external", :locals => {:path => '../docs/api.mdown'} )

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/client-ruby.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/client-ruby.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/client-ruby.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/client-ruby.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,8 @@
+---
+title: Deltacloud - Documentation
+area: documentation
+extension: html
+filter:
+  - haml
+---
+= render(:partial => "external", :locals => {:path => '../docs/client-ruby.mdown'} )

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/contribute.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/contribute.haml?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/contribute.haml (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/contribute.haml Mon Oct 25 23:26:58 2010
@@ -0,0 +1,48 @@
+---
+title: Deltacloud - Contribute
+extension: html
+filter:
+  - haml
+  - outline
+---
+%h1 Help make Deltacloud better
+
+<toc class="toc" numbering="off" toc_style="ul" toc_range="h2-h3" />
+
+%p All development of Deltacloud takes place in the open. Communication is run through the mailing list and all source code changes are tracked publicly.
+
+%ul
+  %li
+    %strong Mailing Lists
+    %br
+    :markdown
+      For Deltacloud API: <deltacloud-dev@incubator.apache.org>.
+      To subscribe to it, send an email to <deltacloud-dev-subscribe@incubator.apache.org>.
+      You can also view [Archive][1] in case you are missing something.
+
+      [1]: http://mail-archives.apache.org/mod_mbox/incubator-deltacloud-dev/
+  %li
+    %strong IRC
+    %br
+    :markdown
+      You can also join us on the Freenode IRC channel #deltacloud. Deltacloud developers are generally available on the IRC channel
+  %li
+    %strong Bugs
+    %br
+    :markdown
+      We track bugs in [Apache JIRA][2]. You can [view open bugs][view-bugs] or [file a new one][new-bug] there.
+
+      [2]: https://issues.apache.org/jira/browse/DTACLOUD
+      [view-bugs]: https://issues.apache.org/jira/browse/DTACLOUD
+      [new-bug]: https://issues.apache.org/jira/secure/CreateIssue!default.jspa
+  %li
+    %strong Patches
+    %br
+    :markdown
+      Patches are very welcome. Please send them to the [development list][3]. Patches should be generated with [`git`&nbsp;`format-patch`][4] and sent to the list with [`git`&nbsp;`send-email`][5].
+
+      [3]: http://mail-archives.apache.org/mod_mbox/incubator-deltacloud-dev/
+      [4]: http://kernel.org/pub/software/scm/git/docs/git-format-patch.html
+      [5]: http://kernel.org/pub/software/scm/git/docs/git-send-email.html
+
+= render(:partial => "markdown", :locals => {:path => '../README'} )

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/ie.css
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/ie.css?rev=1027303&view=auto
==============================================================================
--- incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/ie.css (added)
+++ incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/ie.css Mon Oct 25 23:26:58 2010
@@ -0,0 +1,26 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 0.8
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column, * html div.span-1, * html div.span-2, * html div.span-3, * html div.span-4, * html div.span-5, * html div.span-6, * html div.span-7, * html div.span-8, * html div.span-9, * html div.span-10, * html div.span-11, * html div.span-12, * html div.span-13, * html div.span-14, * html div.span-15, * html div.span-16, * html div.span-17, * html div.span-18, * html div.span-19, * html div.span-20, * html div.span-21, * html div.span-22, * html div.span-23, * html div.span-24 {overflow-x:hidden;}
+* html legend {margin:-18px -8px 16px 0;padding:0;}
+ol {margin-left:2em;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+fieldset {padding-top:0;}
\ No newline at end of file

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/cross.png
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/cross.png?rev=1027303&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/cross.png
------------------------------------------------------------------------------
    svn:executable = *

Propchange: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/cross.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/key.png
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/key.png?rev=1027303&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/key.png
------------------------------------------------------------------------------
    svn:executable = *

Propchange: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/key.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/tick.png
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/site/deltacloud.org/content/css/blueprint/plugins/buttons/icons/tick.png?rev=1027303&view=auto
==============================================================================
Binary file - no diff available.



Mime
View raw message