/**
 * 
 * @author Kris Cieslak
 * @version v1.0 (beta)
 * @license (Creative Commons) http://creativecommons.org/licenses/by-nc-sa/3.0/
 *
 * //digitalinsane.com
 */
var YD=YAHOO.util.Dom;
var YE=YAHOO.util.Event;
var YA=YAHOO.util.Anim;
var $ = function (el) { return YD.get(el);}
var t1;
var t2;

function d2h(d) {
	 var hex="0123456789abcdef";
     var h = hex.substr(d&15,1);
     while(d>15) {d>>=4;h=hex.substr(d&15,1)+h;}
	 if (h.length==1) h='0'+h;
     return h;
}
var numVal = function (val) {
	  if (isNaN(val)) {
	  	  if (val.indexOf('%')!=-1) val=val.substring(0,val.indexOf('%'));
		  if (val.indexOf('px')!=-1) val=val.substring(0,val.indexOf('px'));
		  if (val.indexOf('em')!=-1) val=val.substring(0,val.indexOf('em'));
	  } else return val;
	  return parseInt(val);
  }
var getRGB = function (el,at) {
   var col=YD.getStyle(el,at);
   var z=new Array;
   col=col.toLowerCase();
   col=col.replace(/ /g,'');
   if ( col.indexOf('#')!=-1) {
         col=col.substring(1,col.length);
         z[0]=parseInt(col.slice(0,2),16);
		 z[1]=parseInt(col.slice(2,4),16);
		 z[2]=parseInt(col.slice(4),16); }   
   if ( col.indexOf('rgb')!=-1) {
   	     col=col.substring(4,col.indexOf(')'));
	     col=col.split(',');
		 z[0]=parseInt(col[0]);  	 
		 z[1]=parseInt(col[1]);
		 z[2]=parseInt(col[2]);  }
   return z;   
}
var setRGB = function (el,at,r,g,b) {
    YD.setStyle(el,at,'#'+d2h(r)+d2h(g)+d2h(b));
}
 
var blob = function (el,w,s,z) {
    if ($(el).nodeName=='SPAN') {
    var at1 = {
        fontSize: { from: w, to: w+s, unit: '%' } }
    var at2 = {
        fontSize: { from: w+s, to: w, unit: '%' }}        
    }
    this.a=new YA(el,at1,0.25,YAHOO.util.Easing.eraseOut);
    this.a.onComplete.subscribe(function () {
               var b=new YA(el,at2,0.25,YAHOO.util.Easing.eraseOut);             
               b.animate(); 
               b.onComplete.subscribe(function() {
                   if (z) z();
               } ); }
                );
}
blob.prototype.start = function () { this.a.animate(); }
   
YAHOO.namespace('invaders');

YAHOO.invaders = function () {
	  var score=0;
	  var level=500;
	  var lives=3;
// -=-=-=-=-=-=-=-=-=-=-=-=
      var moveALIENS;
	  var blocksize=12;
	  var blocktop=356;
      var spaceW=58;	 
	  var ivAD;
	  var enemyMISSLE;
	  var emissleMove;
	  var ufoMove;
	  var ufoMake;
      var flag=1;
	// Make BigGun -=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-==--=-=
	 function MakeBigGun() {
	 	var z=document.createElement('div');
		z.id='biggun';
		$('container').appendChild(z);
		YD.addClass('biggun','targets');
	 }  
	// Make walls -=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=
	  function MakeWall(x,y,blocksize,cName) {
	  	function putBrick(xx,yy,ss) {
		  var n=document.createElement('b');
		  n.className='targets wall '+cName;	
		  n.id=YD.generateId('','wall');
		  $('container').appendChild(n);
		  YD.setStyle(n.id,'left',xx+'px');
		  YD.setStyle(n.id,'top',yy+'px');
		  YD.setStyle(n.id,'width',ss+'px');
		  YD.setStyle(n.id,'height',ss+'px'); }
		putBrick(x,y,blocksize);
		putBrick(x,y+blocksize,blocksize); 
		putBrick(x,y+blocksize*2,blocksize);
		putBrick(x+blocksize,y,blocksize);
		putBrick(x+blocksize*2,y,blocksize);
		putBrick(x+blocksize*3,y,blocksize);
		putBrick(x+blocksize*3,y+blocksize,blocksize); 
		putBrick(x+blocksize*3,y+blocksize*2,blocksize);
      }
    // destroyWalls --=-=-=--=-=-=-=-=---=-=-=-=-=-=-=
	  function destroyWalls(rocket,nr) {
		  var q;
		  var n;
		  var trg='w'+nr;
		  if (nr==1) { q=(spaceW+blocksize*4); n=spaceW; } 
		  if (nr==2) { q=(2*spaceW)+(blocksize*8); n=(2*spaceW)+(blocksize*4); }
		  if (nr==3) { q=(3*spaceW)+(blocksize*12); n=(3*spaceW)+(blocksize*8); }
		  if (nr==4) { q=(4*spaceW)+(blocksize*16);  n=(4*spaceW)+(blocksize*12); }
		  if ( (numVal(YD.getStyle(rocket,'left'))>=n) &&
		       (numVal(YD.getStyle(rocket,'left'))<=q)) {
			  	var x=YD.getElementsByClassName(trg,'b','container');
				for (var i=0;i<x.length;i++) 
				  if ((numVal(YD.getStyle(rocket,'top'))>=numVal(YD.getStyle(x[i].id,'top'))) &&
 			         (numVal(YD.getStyle(rocket,'top'))<=numVal(YD.getStyle(x[i].id,'top'))+blocksize) &&
				     (numVal(YD.getStyle(rocket,'left'))>=numVal(YD.getStyle(x[i].id,'left'))) &&
					 (numVal(YD.getStyle(rocket,'left'))<=(numVal(YD.getStyle(x[i].id,'left'))+blocksize))) 
					 break;
					 if(x[i]) {
					 var c=getRGB(x[i].id,'background-color');
					 if (c[1]<=127) $('container').removeChild(x[i]);
					 else
					  setRGB(x[i].id,'background-color',c[0],c[1]-64,c[2])
					  if (rocket=='missle')window.clearInterval(ivAD);
					  if (rocket=='emissle')window.clearInterval(emissleMove);
					  $('container').removeChild($(rocket));        
					 }
				  } 
	  }  
	// Create Aliens -=-=-=-=-=-=-=-=-=-=-==--=-==--=-=-=-=-=-=-=-=-=-==-=
	  function MakeAliens(x,y) {
	  	 var w=24;
		 var h=16;
		 var nr=0;
		 var main=document.createElement('div'); 
		 main.id='aspace';
		 $('container').appendChild(main);
		 YD.setStyle('aspace','width',((w*11)+(10*10))+'px');
   		 YD.setStyle('aspace','height',((h*5)+(4*10))+'px');
     	 YD.setStyle('aspace','top',y+'px');
		 YD.setStyle('aspace','left',x+'px');
		 for (i=0;i<5;i++) {
		 	for (j=0;j<11;j++) {
				 var n=document.createElement('div');
				 $('aspace').appendChild(n);
				 if (i==0) { 
				        n.id='aaliens'+nr; 
						YD.addClass(n.id,'aenemy'); }
				 if ((i==1) || (i==2)) {
				 	    n.id='baliens'+nr;
				        YD.addClass(n.id,'benemy'); }
				 if ((i==3) || (i==4)) { 
				        n.id='caliens'+nr;
						YD.addClass(n.id,'cenemy'); }
				 YD.addClass(n.id,'a'+i);
                 YD.addClass(n.id,'e'+j);						   
				 YD.setStyle(n.id,'position','absolute');		   
			     YD.setStyle(n.id,'top',((i*26))+'px');
				 YD.setStyle(n.id,'left',((j*34))+'px'); 
				 YD.setStyle(n.id,'width',w+'px');
				 YD.setStyle(n.id,'height',h+'px');
				 nr+=1;
			}
		 }
	  }
	// destroyAliens -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    function destroyAliens (xin,yin,nr) {
	     if ( (xin>=(nr*24)+(nr*10)) && (xin<=(nr*24)+(nr*10)+24) ) 
				    {
						var n=YD.getElementsByClassName('e'+nr,'div','aspace');
						for (var i=0;i<n.length;i++) 
							if ( (yin>=numVal(YD.getStyle(n[i].id,'top'))) &&
							     (yin<=(numVal(YD.getStyle(n[i].id,'top'))+numVal(YD.getStyle(n[i].id,'height')))) )
							break;
						if (n[i]) {
							 window.clearInterval(ivAD);
							 $('aspace').removeChild(n[i]);
							 if (YD.hasClass(n[i],'aenemy')) score+=4;
							 if (YD.hasClass(n[i],'benemy')) score+=2;
							 if (YD.hasClass(n[i],'cenemy')) score+=1;
							 $('score').innerHTML=score;
        					 $('container').removeChild($('missle'));
						}
	  			   }   				   		 	
	}	
   // Bounce matrix -=-=-=-=-=-==--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	function Bounce(direct) {
	  if (direct=='left') {	
		var c=YD.getElementsByClassName('e0','div','aspace');
		if (c.length!=0) { return 24 }
		for (var i=1;i<=10;i++) {
 		  c=YD.getElementsByClassName('e'+i,'div','aspace');
		  if (c.length!=0) { return 24-(34*i); }
		}
	  } else if (direct=='right') {
		var c=YD.getElementsByClassName('e10','div','aspace');
		if (c.length!=0) { return 15}
		for (var i=9;i>=0;i--) {
 		  c=YD.getElementsByClassName('e'+i,'div','aspace');
		  if (c.length!=0) { return 15-(34*(10-i)); }
		}
	  }
	}
	function GameOver() {
		var c=YD.getElementsByClassName('a4','div','aspace');
		if (c.length!=0) 
		{ return numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle('aspace','height')) }
		c=YD.getElementsByClassName('a3','div','aspace');
		if (c.length!=0) 
		{ return numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle('aspace','height'))-26; }
		c=YD.getElementsByClassName('a2','div','aspace');
		if (c.length!=0) 
		{ return numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle('aspace','height'))-52; }
		c=YD.getElementsByClassName('a1','div','aspace');
		if (c.length!=0) 
		{ return numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle('aspace','height'))-78; }
		c=YD.getElementsByClassName('a0','div','aspace');
		if (c.length!=0) 
		{ return numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle('aspace','height'))-104; } else
		{ return -666; }
	}
	// Prepare for fire -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	function RandomAlien() {
		var z=Math.floor(Math.random()*10);
		var c=YD.getElementsByClassName('e'+z,'div','aspace');
		if (c.length>0) return c[c.length-1].id; else return 'none';
	}
	// Move Aliens -=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=
	function MoveAliens() {
	   if (flag==1) {
	   	 if ( (numVal(YD.getStyle('aspace','left'))+numVal(YD.getStyle('aspace','width')))>
		      numVal(YD.getStyle('container','width'))-Bounce('right'))
		 { flag=0; 
		   YD.setStyle('aspace','top',(numVal(YD.getStyle('aspace','top'))+5)+'px');
		   return 0; } else	  	
         YD.setStyle('aspace','left',(numVal(YD.getStyle('aspace','left'))+10)+'px');
		            }
	   if (flag==0) {
	   	 if ( numVal(YD.getStyle('aspace','left'))<Bounce('left')) { flag=1; 
		 YD.setStyle('aspace','top',(numVal(YD.getStyle('aspace','top'))+5)+'px');
		 return 0; } else	  	
         YD.setStyle('aspace','left',(numVal(YD.getStyle('aspace','left'))-10)+'px');
		            } 
		var c=GameOver();
		if (c!=-666) {
			if (c>=(numVal(YD.getStyle('biggun','top')))) {
				window.clearInterval(moveALIENS);
                window.clearInterval(enemyMISSLE);
				window.clearInterval(ufoMake);
				window.clearInterval(ufoMove);
				EndGame();
			}
		} else
		{       if (lives<3) {lives+=1; SetLives();}
			    window.clearInterval(moveALIENS); 
				window.clearInterval(enemyMISSLE);
				$('container').removeChild($('aspace'));
			    MakeAliens(24,130);
				if (level<=200) level-=50; else level-=100;
				if (level<0) level=0;
			    moveALIENS=window.setInterval(MoveAliens,level);
				enemyMISSLE=window.setInterval(EnemyFire,2000);
		}
	}
	// UFO -=-=-=-=-=-==--=-=-=-=-=-=-==--=-=-=-=-==--=-=-==--=-=-==--=-=-=
	function CreateUFO() {
		ufo=document.createElement('div');
		ufo.id='ufo';
		$('container').appendChild(ufo);
	}
	function MoveUFO() {
		if ($('ufo')) {
          if (numVal(YD.getStyle('ufo','left')+numVal(YD.getStyle('ufo','width')))<
		  (numVal(YD.getStyle('container','width'))-numVal(YD.getStyle('ufo','width'))-10))
		  YD.setStyle('ufo','left',(numVal(YD.getStyle('ufo','left'))+10)+'px'); else 
		   {
		   	$('container').removeChild($('ufo'));
            timeUFO();
		   }
		}
	}
	function timeUFO()	{
     if (!$('ufo')) 	 
		  ufoMake=window.setInterval(function(){
		  	          if (!$('ufo')) {
				        CreateUFO();
						window.clearInterval(ufoMake);
						             } 
			  },15000);
	}
	// Create and shot the rocket -=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=
	  function EnemyFire() {
	  	if (!$('emissle')) {
   		 var ename=RandomAlien();
		 if ($(ename)) {
		 var rocket=document.createElement('div');	
		 rocket.className='rocket';
		 rocket.id='emissle'
		 $('container').appendChild(rocket);
		 var rx=(numVal(YD.getStyle('aspace','left'))+numVal(YD.getStyle(ename,'left')))+12;
		 var ry=numVal(YD.getStyle('aspace','top'))+numVal(YD.getStyle(ename,'top'))+16;
		 YD.setStyle(rocket.id,'background-color','#FFFFFF');
   		 YD.setStyle(rocket.id,'left',rx+'px');
		 YD.setStyle(rocket.id,'top',ry+'px');
   	     // FLY -=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=
		 emissleMove=window.setInterval(function () {
		 	 YD.setStyle('emissle','top',(numVal(YD.getStyle('emissle','top'))+10)+'px');
			 if (numVal(YD.getStyle('emissle','top'))>numVal(YD.getStyle('biggun','top'))) {
      		 	 window.clearInterval(emissleMove);
			     $('container').removeChild($('emissle'));
			 }
			 if ( (numVal(YD.getStyle('emissle','top'))>=blocktop) &&
			      (numVal(YD.getStyle('emissle','top'))<=(blocktop+(blocksize*4)))  
			    ){ destroyWalls('emissle',1);
				   destroyWalls('emissle',2);
				   destroyWalls('emissle',3);
				   destroyWalls('emissle',4); }
			 if ( ((numVal(YD.getStyle('emissle','top'))+numVal(YD.getStyle('emissle','height')))>=numVal(YD.getStyle('biggun','top'))) &&
			      (numVal(YD.getStyle('emissle','left'))>=numVal(YD.getStyle('biggun','left')) &&  
				  (numVal(YD.getStyle('emissle','left'))<=(numVal(YD.getStyle('biggun','left'))+numVal(YD.getStyle('biggun','width')))))
			    ){ 
                   // gameover				   
				   window.clearInterval(emissleMove);
				   $('container').removeChild($('emissle'));
    			if (lives>0) { lives-=1; SetLives(); }
				if (lives==0) {
				   window.clearInterval(moveALIENS);
                   window.clearInterval(enemyMISSLE);
				   window.clearInterval(ufoMake);
				   window.clearInterval(ufoMove);
				   EndGame();
				}   
				}
		 },50);}
		}
	  }
	  function Fire() {
	  	if (!$('missle')) {
		 var rocket=document.createElement('div');	
		 rocket.className='rocket';
		 rocket.id='missle'
		 $('container').appendChild(rocket);
   		 YD.setStyle(rocket.id,'left',(numVal(YD.getStyle('biggun','left'))+
				 Math.round(numVal(YD.getStyle('biggun','width'))/2))+'px');
		 YD.setStyle(rocket.id,'top',(numVal(YD.getStyle('biggun','top'))-10)+'px');
	     // FLY -=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=
		 ivAD=window.setInterval(function () {
             YD.setStyle('missle','top',(numVal(YD.getStyle('missle','top'))-10)+'px');
			 // Lost -==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  	    	 if ((numVal(YD.getStyle('missle','top'))<100)) {
      		 	 window.clearInterval(ivAD);
			     $('container').removeChild($('missle'));
			 }
			 // Walls -==--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
			  if ( (numVal(YD.getStyle('missle','top'))>=blocktop) &&
			       (numVal(YD.getStyle('missle','top'))<=(blocktop+(blocksize*4)))  
			     )  
				 { 	 destroyWalls('missle',1);
					 destroyWalls('missle',2);
					 destroyWalls('missle',3);
					 destroyWalls('missle',4); }
			 // Aliens -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
			 if ( ((numVal(YD.getStyle('missle','top')+5))>=numVal(YD.getStyle('aspace','top'))) &&
			      ((numVal(YD.getStyle('missle','top')+5))<=numVal(YD.getStyle('aspace','top'))+
				   numVal(YD.getStyle('aspace','height'))) &&  
				  (numVal(YD.getStyle('missle','left'))>=numVal(YD.getStyle('aspace','left'))) &&
				  (numVal(YD.getStyle('missle','left'))<=numVal(YD.getStyle('aspace','left'))+
				   numVal(YD.getStyle('aspace','width')))
			     )
				 {
                   var xin=(numVal(YD.getStyle('missle','left'))-numVal(YD.getStyle('aspace','left')));
				   var yin=(numVal(YD.getStyle('missle','top'))-numVal(YD.getStyle('aspace','top')));
				   for (var i=0;i<=10;i++)  destroyAliens(xin,yin,i);
				 }  
			 // UFO -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
			 if ($('ufo'))
			 if ((numVal(YD.getStyle('missle','top'))<=(numVal(YD.getStyle('ufo','top'))+numVal(YD.getStyle('ufo','height'))) ) &&
			      (numVal(YD.getStyle('missle','left'))>=numVal(YD.getStyle('ufo','left'))) &&
				  (numVal(YD.getStyle('missle','left'))<=(numVal(YD.getStyle('ufo','left'))+numVal(YD.getStyle('ufo','width')))) 
			    ) 
				{ $('container').removeChild($('ufo'));
				  score+=10;
				  $('score').innerHTML=score;
    			  timeUFO(); }
		 },25);
	  }
	  }
	  function SetLives() {
	  		  switch (lives) {
			  	case (0):
				 YD.setStyle('l1','display','none');
				 YD.setStyle('l2','display','none');
				 YD.setStyle('l3','display','none');
				break;
			  	case (1):
				 YD.setStyle('l1','display','none');
				 YD.setStyle('l2','display','none');
				 YD.setStyle('l3','display','block');
				break;
			  	case (2):
				 YD.setStyle('l1','display','none');
				 YD.setStyle('l2','display','block');
				 YD.setStyle('l3','display','block');
				break;
			  	case (3):
				 YD.setStyle('l1','display','block');
				 YD.setStyle('l2','display','block');
				 YD.setStyle('l3','display','block');
				break;
			  }
       }
	  function EndGame() {
	  	  if ($('aspace')) $('container').removeChild($('aspace'));
		  if ($('missle')) $('container').removeChild($('missle'));
		  if ($('emissle')) $('container').removeChild($('emissle'));
		  if ($('ufo')) $('container').removeChild($('ufo'));
		  var n=YD.getElementsByClassName('targets');
		  if (n.length>0)
		  for (var i=0;i<n.length;i++) 
   		  	  if (n[i]) $('container').removeChild(n[i]);
		  YAHOO.invaders.LockKey();
		  YD.setStyle('gameover','display','block');
		  t1.start();
		  YE.addListener(document,'keypress',function (e){
            if (YE.getCharCode(e)==13) YAHOO.invaders.init();
		  });
	  }			  
	  return {
	  	  startGame: function () {
		  	 YD.setStyle('start','display','none');
		  	 var ua = navigator.userAgent.toLowerCase();
			 if (ua.indexOf('opera') != -1)
		  	    YE.addListener(document,'keypress',YAHOO.invaders.unLockKey);
			 else	
		    	YE.addListener(document,'keydown',YAHOO.invaders.unLockKey);
			  MakeBigGun();
			  var n=Math.round((numVal(YD.getStyle('container','width'))-(16*blocksize))/5);
		   	  MakeWall(n,blocktop,blocksize,'w1');
			  MakeWall((2*n)+(blocksize*4),blocktop,blocksize,'w2');
			  MakeWall((3*n)+(blocksize*8),blocktop,blocksize,'w3');
			  MakeWall((4*n)+(blocksize*12),blocktop,blocksize,'w4');
			  MakeAliens(24,130);
			  score=0;
			  lives=3;
			  level=500;
			  $('score').innerHTML=0;
			  SetLives();
			  moveALIENS=window.setInterval(MoveAliens,500);
			  enemyMISSLE=window.setInterval(EnemyFire,2000);
			  timeUFO();
			  ufoMove=window.setInterval(MoveUFO,150);
		  },
   	  	  unLockKey: function (e) {
		  	var x=numVal(YD.getStyle('biggun','left'));
            switch (YE.getCharCode(e)) {
              case (37): x-=10;	if (x<0) x=0; break;
              case (39): var z=numVal(YD.getStyle('biggun','width'));
						 var m=numVal(YD.getStyle('container','width'));
			             x+=10;	
						 if (x>(m-z)) x=m-z; break;
              case (32): Fire(); break;
              //case (27): Restart(); break;
            }
			 YD.setStyle('biggun','left',x+'px');
           },
		   LockKey: function () {
		   	 var ua = navigator.userAgent.toLowerCase();
			 if (ua.indexOf('opera') != -1)
		  	    YE.removeListener(document,'keypress');
			 else	
		    	YE.removeListener(document,'keydown');
		   },
	  	   init: function () {
             YE.removeListener(document,'keydown');
			 YE.removeListener(document,'keypress');
			 YD.setStyle('gameover','display','none');
             YD.setStyle('start','display','block');         
		   }
	  }
} ();
function init() {
	t2=new blob('t2',100,100);
    t1=new blob('t1',100,100,function () { t2.start();});
	YAHOO.invaders.init();
}
YE.addListener(window,'load',init);