<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
  <ModulePrefs title="Patience"
	height="224"
	scaling="false"
	render_inline="never"
	scrolling="false"
	singleton="false"
	screenshot="http://www.tapper-ware.net/cards/patienceig.screenshot.png"
	thumbnail="http://www.tapper-ware.net/cards/patienceig.thumbnail.png"
	description="A simple, yet surprisingly addictive Patience (a.k.a Solitaire) clone."
	author="Hans Schmucker"
	author_email="patiencemodule@googlemail.com"
	author_affiliation="independent"
	/> 
  <Content type="html"><![CDATA[
  	<div style="padding:0px; margin:0px; overflow:hidden; width:100%; height:100%; background-image:url(http://www.tapper-ware.net/data/devel/web/games/patience/cards/bigbg.png);">
		<div style="padding:0px; margin:0px;">
			<meta name="keywords" content="solitaire, patience, browsergame, minigame, cards, onlinegame, browser, online" />
			<script id="hansschmucker_patience_script" type="text/javascript">
		var glbImgBase="http://www.tapper-ware.net/data/devel/web/games/patience/cards/";
		var glbImgSfx=".png";
		

		function methodize(methodize_func,methodize_scope){
			var methodize_args=new Array();
			for(var i=2;i<arguments.length;i++) methodize_args.push(arguments[i]);
			return (function(evt){methodize_func.call(methodize_scope,evt,this,methodize_args);});
		}
		
		function hansschmuckerPatience(id, instance){
		
		function getInnerWidth(){
			if(typeof(window.innerWidth)!="undefined"){
				return window.innerWidth;
			}else if(typeof(document.body)!="undefined" && typeof(document.body.offsetWidth)!="undefined"){
				return document.body.offsetWidth;
			}else return 320;
		}
		
		var _id=id;
		var _instance=instance;
		var _self=this;
		
		function byId(idstring){ return document.getElementById(_id+idstring); }
		
		function addEventHandler(object,type,func){
			if( object.addEventListener ) {
				object.addEventListener(type,func,false);
			} else if ( object.attachEvent ) {
				object.attachEvent("on"+type,func);
			}
		}
		
		function removeEventHandler(object,type,func){
			if( object.removeEventListener ) {
				object.removeEventListener(type,func,false);
			} else if ( object.detachEvent ) {
				object.detachEvent("on"+type,func);
			}
		}

		var glbSelectedCard=0;
		var glbSelected=0;
		var glbOffsetX=0;
		var glbOffsetY=0;
		var _staplewidth=0;
		
		
		this.doresize=function(evt){
			_staplewidth=Math.floor((getInnerWidth()-33)/6);
			
			documentwidth=Math.floor(getInnerWidth());
			
		
			var remotediv=byId("content").parentNode;
			
			if(typeof(documentwidth)=="number"){
				byId("content").style.width=documentwidth+"px";
				byId("content").parentNode.style.width=documentwidth+"px";
			}
			
			_self.playField.staples[1].reposition(evt);
			
			_self.playField.staples[3].reposition(evt);
			_self.playField.staples[4].reposition(evt);
			_self.playField.staples[5].reposition(evt);
			_self.playField.staples[6].reposition(evt);

			_self.playField.staples[8].reposition(evt);
			_self.playField.staples[9].reposition(evt);
			_self.playField.staples[10].reposition(evt);
			_self.playField.staples[11].reposition(evt);
			_self.playField.staples[12].reposition(evt);
			_self.playField.staples[13].reposition(evt);
			
			_self.playField.backgroundLayer[1].reposition(evt);

			_self.playField.backgroundLayer[3].reposition(evt);
			_self.playField.backgroundLayer[4].reposition(evt);
			_self.playField.backgroundLayer[5].reposition(evt);
			_self.playField.backgroundLayer[6].reposition(evt);

			_self.playField.backgroundLayer[8].reposition(evt);
			_self.playField.backgroundLayer[9].reposition(evt);
			_self.playField.backgroundLayer[10].reposition(evt);
			_self.playField.backgroundLayer[11].reposition(evt);
			_self.playField.backgroundLayer[12].reposition(evt);
			_self.playField.backgroundLayer[13].reposition(evt);
			
			_self.highlight.reposition(evt);
			
			
		}
		
		addEventHandler(window,"resize",_self.doresize);
		
		function patienceCard(color, value, stackPos){
			var _pcSelf=this;
			this.color=color;
			this.value=value;
			this.x=(glbOffsetX);
			this.y=(glbOffsetY);
			this.open=0;
			this.cardimg=document.createElement("img");
			this.cardimg.width=32;
			this.cardimg.height=48;
			this.cardimg.style.width="32px";
			this.cardimg.style.height="48px";
			if(value<10) value="0"+value; else value=""+value;
			this.cardimg.Url=glbImgBase+color+value+glbImgSfx;
			
			this.cardimg.src=glbImgBase+"500"+glbImgSfx;
			this.cardimg.style.position="absolute";
			this.cardimg.style.zIndex=stackPos;
			this.cardimg.style.left=glbOffsetX+"px";
			this.cardimg.style.top=glbOffsetY+"px";
			if (navigator.userAgent.toLowerCase().indexOf('msie')!=(-1)){ var src=this.cardimg.src; this.cardimg.src=glbImgBase+"transparent.gif";   this.cardimg.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='scale')";}
			this.cardStackNum=0;
			this.cardStackPos=stackPos;
			this.cardId=stackPos;
			
			this.flip=function(){
				if(this.open==0){
					this.open=1;
					if (navigator.userAgent.toLowerCase().indexOf('msie')!=(-1)){
						this.cardimg.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.cardimg.Url+"', sizingMethod='scale')";
					}else{
						this.cardimg.src=this.cardimg.Url;
					}
				}else{
					this.open=0;
					if (navigator.userAgent.toLowerCase().indexOf('msie')!=(-1)){
						this.cardimg.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+glbImgBase+"500"+glbImgSfx+"', sizingMethod='scale')";
					}else{
						this.cardimg.src=glbImgBase+"500"+glbImgSfx;
					}

				}
			}
			
			
			this.clicked=function(event){
				if(glbSelected==0){
					var isLast=(_pcSelf.cardStackPos+1==_self.playField.staples[_pcSelf.cardStackNum].cardnum);
					if(isLast && _pcSelf.open==0 && _pcSelf.cardStackNum>=7){ _pcSelf.flip(); glbSelected=0; _self.highlight.hide(); return 0}
					
					if(_pcSelf.cardStackNum==0){
						_self.playField.staples[1].addTo(_pcSelf.cardId,0);
						_pcSelf.flip();
						_self.highlight.hide();
						glbSelected=0;
					}else{
						if(isLast || _pcSelf.cardStackNum<7){
							var validCardId=_pcSelf.cardId;
						}else{
							var validCardId=_self.playField.staples[_pcSelf.cardStackNum].cards[_self.playField.staples[_pcSelf.cardStackNum].cardnum-1];
							var invalidStep=0;
							for(var i=_self.playField.staples[_pcSelf.cardStackNum].cardnum-2;i>=_pcSelf.cardStackPos && invalidStep==0;i--){
								thisCardId=_self.playField.staples[_pcSelf.cardStackNum].cards[i];
								thisCard=_self.cardStack.cards[thisCardId];
								prevCardId=_self.playField.staples[_pcSelf.cardStackNum].cards[i+1];
								prevCard=_self.cardStack.cards[prevCardId];
								if((thisCard.value==prevCard.value+1) && ((thisCard.color<3)!=(prevCard.color<3))){
									var validCardId=thisCardId;
								}else{
									invalidStep=1;
								}
							}
						}
						if(_self.cardStack.cards[validCardId].open==0){ _self.cardStack.cards[validCardId].flip(); glbSelected=0; _self.highlight.hide(); return 0}
						
						var validX=_self.cardStack.cards[validCardId].xstaple;
						var validY=_self.cardStack.cards[validCardId].y;
						_self.highlight.displayAt(validX,validY);
						glbSelectedCard=validCardId;
						glbSelected=1;
					}
				}else{
					glbSelected=0;
					_self.highlight.hide();
					var targetStaple=_self.playField.staples[_pcSelf.cardStackNum];
					var targetStapleLastCardId=targetStaple.cards[targetStaple.cardnum-1];
					var targetStapleLastCard=_self.cardStack.cards[targetStapleLastCardId];
					var srcCard=_self.cardStack.cards[glbSelectedCard];
					var srcStaple=_self.playField.staples[srcCard.cardStackNum];
					
					if(targetStaple.stapleNum!=srcStaple.stapleNum && targetStapleLastCard.open!=0){
						if( targetStaple.stapleNum<7 && targetStaple.stapleNum>2){
							if( ((targetStapleLastCard.value==srcCard.value-1) && (targetStapleLastCard.color==srcCard.color))){
								if(srcCard.cardId==srcStaple.cards[srcStaple.cardnum-1]){
									targetStaple.addTo(glbSelectedCard,0);
									if((_self.playField.staples[3].cardnum+_self.playField.staples[4].cardnum+_self.playField.staples[5].cardnum+_self.playField.staples[6].cardnum)==52){
										alert("CONGRATULATIONS!!!\nYou Win!");
									}
								}
							}					
						}else{
							if(targetStaple.stapleNum>=7){
								if(((targetStapleLastCard.value==srcCard.value+1) && ((targetStapleLastCard.color<3)!=(srcCard.color<3)))){
									targetStaple.addTo(glbSelectedCard,1);
								}
							}
						}
					}				
				}
				return 0;
			}
			
			addEventHandler(this.cardimg,"click", _pcSelf.clicked);
			byId("content").appendChild(this.cardimg); 
		}
		
		
		function patienceCardSet(){
			var _pcsSelf=this;
			this.cards=new Array();
			this.cardsnum=4*13;
			var cardidx=0;
			for(var i=1;i<=4;i++){
				for(var j=1;j<=13;j++){
					cardidx=((i-1)*13)+j-1;
					this.cards[cardidx]=new patienceCard(i, j, cardidx);
				}
			}
			
			this.randomize=function(){
				var cardTemp;
				var randIndex;
				var indexTemp;
				for(var i=0;i<this.cardsnum;i++){
					randIndex=Math.floor(Math.random()*this.cardsnum);
					
					cardTemp=this.cards[i];this.cards[i]=this.cards[randIndex];this.cards[randIndex]=cardTemp;
					indexTemp=this.cards[i].cardStackPos;this.cards[i].cardStackPos=this.cards[randIndex].cardStackPos;this.cards[randIndex].cardStackPos=indexTemp;
					indexTemp=this.cards[i].cardId;this.cards[i].cardId=this.cards[randIndex].cardId;this.cards[randIndex].cardId=indexTemp;
					indexTemp=this.cards[i].cardimg.style.zIndex;this.cards[i].cardimg.style.zIndex=this.cards[randIndex].cardimg.style.zIndex;this.cards[randIndex].cardimg.style.zIndex=indexTemp;
				}
			}
		}
		
		function backgroundField(x,y,n){
			var _bgfSelf=this;
			this.cardimg=document.createElement("img");
			this.cardimg.width=32;
			this.cardimg.height=48;
			this.cardimg.style.width="32px";
			this.cardimg.style.height="48px";
			this.cardimg.src=glbImgBase+"501"+glbImgSfx;
			
			this.cardimg.style.position="absolute";
			this.cardimg.style.zIndex="0";
			this.xstaple=x;
			this.cardimg.style.left=(this.xstaple*_staplewidth + glbOffsetX)+"px";
			this.cardimg.style.top=(y+glbOffsetY)+"px";
			byId("content").appendChild(this.cardimg);
			this.stapleNum=n;
			if (navigator.userAgent.toLowerCase().indexOf('msie')!=(-1)){ var src=this.cardimg.src; this.cardimg.src=glbImgBase+"transparent.gif";   this.cardimg.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='scale')";}
			
			this.clicked=function(event){
				if(glbSelected==1){
					glbSelected=0;
					_self.highlight.hide();
					var targetStaple=_self.playField.staples[_bgfSelf.stapleNum];
					var srcCard=_self.cardStack.cards[glbSelectedCard];
					var srcStaple=_self.playField.staples[srcCard.cardStackNum];
					
					if(targetStaple.stapleNum!=srcStaple.stapleNum){
						if( targetStaple.stapleNum<7 && targetStaple.stapleNum>2){
							if(srcCard.value==1){
								if(srcCard.cardId==srcStaple.cards[srcStaple.cardnum-1]){
									targetStaple.addTo(glbSelectedCard,0);
								}
							}					
						}else{
							if(targetStaple.stapleNum>=7){
								if(srcCard.value==13){
									targetStaple.addTo(glbSelectedCard,1);
								}
							}
						}
					}		
				}else if(_bgfSelf.stapleNum==0){
					var stapleLength=_self.playField.staples[1].cardnum;
					for(var i=stapleLength-1;i>=0;i--){
						_self.playField.staples[0].addTo(_self.playField.staples[1].cards[i],0);
						_self.cardStack.cards[_self.playField.staples[1].cards[i]].flip();
					}
				}
			}
			
			
			
			this.reposition=function(event){

						_bgfSelf.x=_bgfSelf.xstaple*_staplewidth + glbOffsetX;
						_bgfSelf.cardimg.style.left=_bgfSelf.x+"px";

					
			}


			addEventHandler(this.cardimg,"click", _bgfSelf.clicked);
		}
		
		
		function patienceStaple(x,y,n){
			var _psSelf=this;
			this.cards=new Array();
			this.cardnum=0;
			_staplewidth=Math.floor((document.body.offsetWidth-33)/6);
			this.x=glbOffsetX+x*_staplewidth;

			this.y=glbOffsetY+y;
			this.stapleNum=n;
			this.xstaple=x;
			this.addTo=function(cardidx,recursive){
				if(recursive==0 || _self.cardStack.cards[cardidx].cardStackPos==_self.playField.staples[_self.cardStack.cards[cardidx].cardStackNum].cardnum-1){
					_psSelf.cards[_psSelf.cardnum]=cardidx;
					_self.cardStack.cards[cardidx].cardimg.style.zIndex=_psSelf.cardnum;
					_self.cardStack.cards[cardidx].x=_psSelf.xstaple*_staplewidth + glbOffsetX;
					_self.cardStack.cards[cardidx].xstaple=_psSelf.xstaple;
					_self.cardStack.cards[cardidx].cardStackPos=_psSelf.cardnum;
					
					_self.cardStack.cards[cardidx].cardimg.style.left=(_psSelf.xstaple*_staplewidth + glbOffsetX)+"px";
					if(_psSelf.stapleNum<7){
						_self.cardStack.cards[cardidx].cardimg.style.top=_psSelf.y+"px";
						_self.cardStack.cards[cardidx].y=_psSelf.y;
					}else{
						_self.cardStack.cards[cardidx].cardimg.style.top=_psSelf.y+_psSelf.cardnum*9+"px";
						_self.cardStack.cards[cardidx].y=_psSelf.y+_psSelf.cardnum*9;
					}
					_self.playField.staples[_self.cardStack.cards[cardidx].cardStackNum].cardnum-=1;
					_self.cardStack.cards[cardidx].cardStackNum=_psSelf.stapleNum;
					_psSelf.cardnum++;
				}else{
					var thisCard=_self.cardStack.cards[cardidx];
					var thisStaple=_self.playField.staples[thisCard.cardStackNum];
					var thisStapleSize=thisStaple.cardnum;
					for(var i=thisCard.cardStackPos;i<thisStapleSize;i++){
						_psSelf.addTo(thisStaple.cards[i],0);
					}
				}
			}
			
			
			this.reposition=function(event){
				for(var i=0;i<_psSelf.cardnum;i++){
					_self.cardStack.cards[_psSelf.cards[i]].x=_psSelf.xstaple*_staplewidth + glbOffsetX;
					_self.cardStack.cards[_psSelf.cards[i]].cardimg.style.left=_self.cardStack.cards[_psSelf.cards[i]].x+"px";
				}
				
			}
			
			this.removeFrom=function(){
				_psSelf.cards[_psSelf.cardnum]=(-1);
				_psSelf.cardnum--;
			}
		}
		



		function patiencePlayField(){
			this.backgroundLayer=new Array();
			this.backgroundLayer[0]=new backgroundField(0,0,0);
			this.staples=new Array();
			this.staples[0]=new patienceStaple(0,0,0);
			this.staples[0].cardnum=52;
			this.staples[1]=new patienceStaple(1,0,1);
			this.backgroundLayer[1]=new backgroundField(1,0,0);
			for(var i=3;i<7;i++){
				this.backgroundLayer[i]=new backgroundField(i,0,i);
				this.staples[i]=new patienceStaple(i,0,i);
			}
			for(var i=0;i<7;i++){
				this.backgroundLayer[i+7]=new backgroundField(i,52,i+7);
				this.staples[i+7]=new patienceStaple(i,52,i+7);
			}
		}
		
		
		
		function patienceHighlight(){
			var _phSelf=this;
			this.x=(0);
			this.y=(0);
			this.cardimg=document.createElement("img");
			this.cardimg.width=32;
			this.cardimg.height=48;
			this.cardimg.style.width="32px";
			this.cardimg.style.height="48px";
			
			this.cardimg.src=glbImgBase+"502"+glbImgSfx;
			this.cardimg.style.position="absolute";
			this.cardimg.style.zIndex=500;
			this.cardimg.style.left="0px";
			this.cardimg.style.top="0px";
			this.cardimg.style.display="none";
			if (navigator.userAgent.toLowerCase().indexOf('msie')!=(-1)){ var src=this.cardimg.src; this.cardimg.src=glbImgBase+"transparent.gif";   this.cardimg.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='scale')";}
			byId("content").appendChild(this.cardimg);
			
			this.displayAt=function(x,y){
				_phSelf.cardimg.style.left=x*_staplewidth + glbOffsetX+"px";
				_phSelf.cardimg.style.top=y+"px";
				_phSelf.x=x*_staplewidth + glbOffsetX;
				_phSelf.y=y;
				_phSelf.xstaple=x;
				_phSelf.cardimg.style.display="";
			}
			
			
			this.reposition=function(evt){
				if(typeof(_phSelf)=="object" && typeof(_phSelf.cardimg)=="object" && typeof(_phSelf.xstaple)=="number"  && typeof(_staplewidth)=="number"  && typeof(glbOffsetX)=="number" ){
					_phSelf.cardimg.style.left=_phSelf.xstaple*_staplewidth + glbOffsetX+"px";
					_phSelf.x=_phSelf.xstaple*_staplewidth + glbOffsetX;
				}
			}
			
			
			this.hide=function(){
				_phSelf.cardimg.style.display="none";
			}
		}
		
		
		function cardLayout(){
			var _clSelf=this;
			var cardCount=_self.playField.staples[0].cardnum-1;
			for(var i=0;i<7;i++){
				for(var j=0;j<i+1;j++){
					cardCount--;
					var thisSrcStaple=_self.playField.staples[0];
					var thisStaple=_self.playField.staples[i+7];
					thisStaple.addTo(cardCount,0);
				}
				_self.cardStack.cards[cardCount].flip();
			}		
		}
		
		 this.load=function(){
			this.playField=new patiencePlayField();
			this.cardStack=new patienceCardSet();
			this.cardStack.randomize();
			this.highlight=new patienceHighlight();
			this.layout=new cardLayout();
			
			if(document.width!=undefined){
				documentwidth=Math.floor((document.width));
			}else{
				documentwidth=Math.floor((document.body.clientWidth));
			}
			
			if(typeof(documentwidth)=="number"){
				byId("content").style.width=documentwidth+"px";
				byId("content").parentNode.style.width=documentwidth+"px";
			}
			this.doresize();
		 }
		 
		 addEventHandler(window,"load",methodize(this.load,this));
			
	     }

		var PATGAME___MODULE_ID__ = new hansschmuckerPatience('PATGAME___MODULE_ID__', 'PATGAME___MODULE_ID__' );
		

			</script> 
			<div id="PATGAME___MODULE_ID__content"  style="width: 320px; margin:0px;" >

				<div id="newbuttonspace" style="position:absolute; width:17px; height:64px; padding:0px; margin:0px; left:0px; top:164px;">
					<img src="http://www.tapper-ware.net/data/devel/web/games/patience/google-ig-button-newgame_v.gif" onclick="document.location.href=document.location.href;" />
				</div>
			</div>
		</div>
	</div>
  ]]></Content> 
</Module>