<svg width="100%" height="100%"
	xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
	 onload="startup(evt)"
>
<script>
<![CDATA[
	var svgDocument;
		balloon=null;
		count=0
		running=true
		xlow=-200
		xhigh=100
		x=xlow
		incr=5
		dir=1
		xdir=1
		ydir=1
		xspeed=.7
		yspeed=.4
		xcur=50
		ycur=50
		ylow=-25
		yhigh=100
		numlines=35
		rightedge=null
		Hi=new Array()
		Up=new Array()
		bottomedge=null
		svgns = 'http://www.w3.org/2000/svg';
		xlinkns = 'http://www.w3.org/1999/xlink';
function startup(evt) {
	O=evt.target
	O.setAttribute("onclick","running=!running;animate()")
	svgDocument = O.ownerDocument;
	balloon = svgDocument.getElementById("balloon");
	path=svgDocument.getElementById("Q")
	A=getDisplaySize()
	rightedge=A.width
	bottomedge=A.height - 40
	sky=svgDocument.getElementById("sky")
	sky.setAttribute("cy",50)
	sky.setAttribute("cx",rightedge/2)
	sky.setAttribute("r",rightedge/1.45)
	draw("peaks2",7,90,30)
	draw("peaks",10,80,25)
	draw("mountains",15,55,22)
	draw("foothills",22,35,15)
	
	moredraw();
}
function getDisplaySize()
{
//function due to G. Wade Johnson <svg-developers.yahoogroups.com>
//Date: Mon, 12 Dec 2005 20:57:49 -0600
//Subject: Re: [svg-developers] Screen extents
    var extents = null;
    try{
        var view = document.documentElement.viewport;
        extents = {width: view.width,height: view.height};
    }
    catch(e){
        extents = {width: window.innerWidth, height: window.innerHeight};
    }
    return extents;
}
P=new Array()
offset=50
function draw(id,humps,hi,up){
	IDS[IDS.length]=id
	Hi[id]=hi
	Up[id]=up
	var peaks=3*humps
	P[id]=new Array;
	t=svgDocument.getElementById(id)
	for (i=0;i<peaks;i++){
		P[id][i]= {x: Math.floor(Math.random()*(rightedge+2*offset)-offset),
				y: Math.floor(Math.random()*hi)+up};
	}
	P[id].sort(compare)
	s=render(P[id],0)
	t.setAttribute("d",s)
}
function compare(x,y){
	if (x.x<y.x) return -1
	else return 1
}
function render(Arr,lo){
	
	var low=Math.floor(bottomedge*.9)
	var s="M "+(-offset)+" "+(low)+" "
	s+=(7-offset)+" "+(low - Arr[0].y)+" "
	for (i=1;i<Arr.length;i++){
		if ((i)%3==0) s+="C "+Arr[i].x+" "+(low - Arr[i].y)+" "
		else 
		s+=Arr[i].x+" "+(low - Arr[i].y)+" "
	}
	s+="L "+(rightedge+offset)+" "+(low )+" Q "+(rightedge/2)+" "+(low)+" "+(-offset)+" "+(low)+" z"
	return s
}
function moredraw(){
	for (j=0;j<numlines;j++) another(100+j*10)
	Pa = svgDocument.createElementNS(svgns,"path");
	Pa.setAttribute("d", "M 194 340 C 185 360 215 360 206 340"); 
	Pa.setAttribute("stroke", "#440")
	Pa.setAttribute("stroke-width", "3")
	Pa.setAttribute("fill", "#551")
	balloon.appendChild(Pa);
	animate()
}
var xlinkns = "http://www.w3.org/1999/xlink";
function another(x){
	Pa = svgDocument.createElementNS(svgns,"path");
	Pa.setAttribute("id", "P"+count); count++
	Pa.setAttribute("d", "M 100 0 C 200 200 300 200 100 300"); 
	Pa.setAttribute("stroke", color(16,16,12))
	Pa.setAttribute("stroke-width", "5")
	Pa.setAttribute("fill", "none")
	balloon.appendChild(Pa);
}
function animate(){
	if (!running) return
	x+=incr*dir
	if ((x<xlow+incr)||(x>xhigh+incr))dir=-dir
	onestep(x)
	window.setTimeout("animate()",10)
}
IDS=new Array
mea=0
function onestep(x){
	mea++
	balloon.setAttribute("transform","translate("+xcur+","+ycur+")")
	for (i=0;i<count;i++){
		Pa = svgDocument.getElementById("P"+i);
		Pa.setAttribute("d", "M 200 20 C "+((i*18)+x)+" 100 "+(220- x/2)+" 250 200 340 "); 
	}
	adj=0
	for (id in IDS){
		for (j=0;j<P[IDS[id]].length;j++){
			P[IDS[id]][j].x-=(adj*adj/4+1)/2
		}
		adj++
		if(P[IDS[id]][3].x<0){
			st=rightedge+offset
			for (k=0;k<3;k++){
				newx=st+Math.ceil(80*Math.random()/P[IDS[id]].length)
				Q={x: newx,
					y: Math.floor(Math.random()*Hi[IDS[id]]+Up[IDS[id]])}
					st=newx
				P[IDS[id]].push(Q);
				R=P[IDS[id]].shift()
			}
		}
		s=render(P[IDS[id]],R.y)
		t=svgDocument.getElementById(IDS[id])
		t.setAttribute("d",s)
	}
	xcur=xcur+xspeed*xdir
	ycur=ycur+yspeed*ydir
	if((xcur<xlow+150)||(xcur>rightedge/1.5)) xdir=-xdir
	if((ycur<ylow)||(ycur>yhigh)) ydir=-ydir
	if (Math.floor(xcur)%10==0)recolorone(color(16,12,8))
	if (Math.floor(xcur)%20==1)recolorone(color(16,16,0))
	if (Math.floor(xcur)%30==2)recolorone("#da0")
}
first=true
function recolorone(c){
	r=Math.floor(Math.random()*count)
	Pa = svgDocument.getElementById("P"+r);
	Pa.setAttribute("stroke",c); 
}
function color(xr,xg,xb){
	r=Math.floor(Math.random()*xr)
	R=r.toString(16)
	g=Math.floor(Math.random()*xg)
	G=g.toString(16)
	b=Math.floor(Math.random()*xb)
	B=b.toString(16)
	return "#"+R+B+G
}
	//]]>
</script>
<defs>
<path id="Q" stroke="black" stroke-width="3"/>
<linearGradient id="backsky" x1="0%" y1="0%" x2="0%" y2="100%">
	<stop offset="0" stop-color="#888"/>
	<stop offset=".5" stop-color="#0ff"/>
	<stop offset=".9"  stop-color="#ec7"/>
	
	
</linearGradient> 
<radialGradient id="sky" cx="500" cy="300" r="500" gradientUnits="userSpaceOnUse">
	<stop  offset="0" stop-color="#0ff" stop-opacity="1"/>
	<stop  offset=".2" stop-color="#0ff" stop-opacity=".6"/>
	<stop  offset=".71" stop-color="#000" stop-opacity="0"/>
	<stop  offset=".80" stop-color="#8ff" stop-opacity="1"/>
</radialGradient>
<linearGradient id="peak2" x1="0%" y1="0%" x2="0%" y2="100%">
	<stop offset="0" stop-color="#eff"/>
	<stop offset=".2" stop-color="#9cd"/>
	<stop offset=".4" stop-color="#88b"/>
	<stop offset=".9" stop-color="#9a9"/>
</linearGradient> 
<linearGradient id="peak" x1="0%" y1="0%" x2="0%" y2="100%">
	<stop offset="0" stop-color="#ddc"/>
	<stop offset=".2" stop-color="#998"/>
	<stop offset=".4" stop-color="#a8b"/>
	<stop offset=".9" stop-color="#aa6"/>
</linearGradient> 
<linearGradient id="mount" x1="0%" y1="0%" x2="0%" y2="100%">
	<stop offset="0" stop-color="#589"/>
	<stop offset=".2" stop-color="#869"/>
	<stop offset=".6" stop-color="#898"/>
</linearGradient> 

<linearGradient id="foot" x1="0%" y1="0%" x2="0%" y2="100%">
	<stop offset="0" stop-color="#b87"/>
	<stop offset=".1" stop-color="#b63"/>
	<stop offset=".70" stop-color="#c86"/>
	<stop offset=".90"  stop-color="#bc7"/>
</linearGradient> 
</defs>
<rect  height="100%" width="100%" opacity="1" fill="url(#backsky)"/>

<path id="peaks2" d="M 0 500 400 400 800 500 z" fill="url(#peak2)" />
<path id="peaks" d="M 0 500 400 400 800 500 z" fill="url(#peak)" />
<path id="mountains" d="M 0 500 400 400 800 500 z" fill="url(#mount)" />

<path id="foothills" d="M 0 500 400 400 800 500 z" fill="url(#foot)" stroke="none"/>
<rect  height="100%" width="100%" opacity="1" fill="url(#sky)"/>
<g id="balloon" opacity="0.7">
</g>
</svg>
