(function($){

$.fn.kliklogo = function(method, options){
      /* transitionTypes:
        1 - fade in
        2 - drop in randomly
        3 - drop in from right
      */
      var options = $.extend({
		  initialTransitionType: Math.floor(Math.random()*5)+1,
		  blockSize: 30,
		  topMargin: 6*30,
		  navLinkIdentifier: '.nav li a',
		  logoLinkIdentifier: '#klik a',
		  animateBars: true
	}, options); 

	  $(options.navLinkIdentifier).click(function(event){
	  	event.preventDefault();
	  	goSkyward(this);
	  	
	  });	
	  
	  $(options.logoLinkIdentifier).click(function(event){
	  	event.preventDefault();
	  	goLogo(5,50,2);
	  });

	  curAction="none";
      browserHeight=0;
	  browserWidth=0;
	  frame=0;
      browserHeight=0;
      browserWidth=0;
      frame=0;
      barDefs=[
        {colour:"#231f20"},
        {colour:"#58585a"},
        {colour:"#797a7e"},
        {colour:"#a0a1a5"},
        {colour:"#c9cacc"},
        {colour:"#e7e7e7"}
      ];
      b=[]; // blockDefs
      
      resetBlockDefs();
      
      
      function resetBlockDefs() {
        b[0]=[];
        b[1]=[];
        b[2]=[];
        b[3]=[];
        b[4]=[];
        b[5]=[];
        b[6]=[];
        b[7]=[];
        b[8]=[];
        b[9]=[];
  
        b[0][0]={c:"#",p:false};
        b[1][0]={c:"#",p:false};
        b[2][0]={c:"#00a851",p:false};
        b[3][0]={c:"#ffffff",p:false};
        b[4][0]={c:"#ffffff",p:false};
        b[5][0]={c:"#ffffff",p:false};
        b[6][0]={c:"#ffffff",p:false};
        b[7][0]={c:"#ffffff",p:false};
        b[8][0]={c:"#ffffff",p:false};
        b[9][0]={c:"#ffffff",p:false};
  
        b[0][1]={c:"#",p:false};
        b[1][1]={c:"#00a851",p:false};
        b[2][1]={c:"#ffffff",p:false};
        b[3][1]={c:"#ffffff",p:false};
        b[4][1]={c:"#ffffff",p:false};
        b[5][1]={c:"#ffffff",p:false};
        b[6][1]={c:"#ffffff",p:false};
        b[7][1]={c:"#ffffff",p:false};
        b[8][1]={c:"#ffffff",p:false};
        b[9][1]={c:"#00a851",p:false};
  
        b[0][2]={c:"#00a851",p:false};
        b[1][2]={c:"#008cd3",p:false};
        b[2][2]={c:"#ffffff",p:false};
        b[3][2]={c:"#008cd3",p:false};
        b[4][2]={c:"#ffffff",p:false};
        b[5][2]={c:"#ffffff",p:false};
        b[6][2]={c:"#ffffff",p:false};
        b[7][2]={c:"#00adef",p:false};
        b[8][2]={c:"#ffffff",p:false};
        b[9][2]={c:"#ffffff",p:false};
  
        b[0][3]={c:"#008cd3",p:false};
        b[1][3]={c:"#008cd3",p:false};
        b[2][3]={c:"#008cd3",p:false};
        b[3][3]={c:"#ffffff",p:false};
        b[4][3]={c:"#00adef",p:false};
        b[5][3]={c:"#ffffff",p:false};
        b[6][3]={c:"#ffffff",p:false};
        b[7][3]={c:"#ffffff",p:false};
        b[8][3]={c:"#008cd3",p:false};
        b[9][3]={c:"#008cd3",p:false};
  
        b[0][4]={c:"#00adef",p:false};
        b[1][4]={c:"#00a851",p:false};
        b[2][4]={c:"#00a851",p:false};
        b[3][4]={c:"#ffffff",p:false};
        b[4][4]={c:"#ffffff",p:false};
        b[5][4]={c:"#ffffff",p:false};
        b[6][4]={c:"#ffffff",p:false};
        b[7][4]={c:"#00adef",p:false};
        b[8][4]={c:"#00a851",p:false};
        b[9][4]={c:"#00a851",p:false};
  
        b[0][5]={c:"#00a851",p:false};
        b[1][5]={c:"#00a851",p:false};
        b[2][5]={c:"#00a851",p:false};
        b[3][5]={c:"#00a851",p:false};
        b[4][5]={c:"#ffffff",p:false};
        b[5][5]={c:"#ffffff",p:false};
        b[6][5]={c:"#00a851",p:false};
        b[7][5]={c:"#00a851",p:false};
        b[8][5]={c:"#00a851",p:false};
        b[9][5]={c:"#00a851",p:false};
  
        b[0][6]={c:"#00adef",p:false};
        b[1][6]={c:"#00adef",p:false};
        b[2][6]={c:"#00adef",p:false};
        b[3][6]={c:"#4e3593",p:false};
        b[4][6]={c:"#ffffff",p:false};
        b[5][6]={c:"#00adef",p:false};
        b[6][6]={c:"#4e3593",p:false};
        b[7][6]={c:"#00adef",p:false};
        b[8][6]={c:"#00adef",p:false};
        b[9][6]={c:"#00adef",p:false};
  
        b[0][7]={c:"#4e3593",p:false};
        b[1][7]={c:"#4e3593",p:false};
        b[2][7]={c:"#ffffff",p:false};
        b[3][7]={c:"#4e3593",p:false};
        b[4][7]={c:"#4e3593",p:false};
        b[5][7]={c:"#4e3593",p:false};
        b[6][7]={c:"#4e3593",p:false};
        b[7][7]={c:"#4e3593",p:false};
        b[8][7]={c:"#4e3593",p:false};
        b[9][7]={c:"#4e3593",p:false};
  
        b[0][8]={c:"#f26746",p:false};
        b[1][8]={c:"#ed3529",p:false};
        b[2][8]={c:"#ed3529",p:false};
        b[3][8]={c:"#ed3529",p:false};
        b[4][8]={c:"#f26746",p:false};
        b[5][8]={c:"#f26746",p:false};
        b[6][8]={c:"#ed3529",p:false};
        b[7][8]={c:"#ed3529",p:false};
        b[8][8]={c:"#ed3529",p:false};
        b[9][8]={c:"#f26746",p:false};
  
        b[0][9]={c:"#f8a76f",p:false};
        b[1][9]={c:"#f47320",p:false};
        b[2][9]={c:"#f47320",p:false};
        b[3][9]={c:"#f47320",p:false};
        b[4][9]={c:"#f8a76f",p:false};
        b[5][9]={c:"#f8a76f",p:false};
        b[6][9]={c:"#f47320",p:false};
        b[7][9]={c:"#f47320",p:false};
        b[8][9]={c:"#f8a76f",p:false};
        b[9][9]={c:"#f8a76f",p:false};
  
        b[0][10]={c:"#fede00",p:false};
        b[1][10]={c:"#ffea81",p:false};
        b[2][10]={c:"#ffe44f",p:false};
        b[3][10]={c:"#fede00",p:false};
        b[4][10]={c:"#ffea81",p:false};
        b[5][10]={c:"#ffea81",p:false};
        b[6][10]={c:"#ffe44f",p:false};
        b[7][10]={c:"#ffe44f",p:false};
        b[8][10]={c:"#ffea81",p:false};
        b[9][10]={c:"#fede00",p:false};
      }

      function resetAvailableBlocks() {
        availableBlocks=[];
        for (x=0;x<10;x++) {
          for (y=0;y<b[x].length;y++) {
            availableBlocks.push({id:'#b'+x+'-'+y,x:x,y:y});
          }
        }
      }
      numBlocks=110;
      curBlock=0;

      function shuffle(o) {
        for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
        return o;
      };

      /* Capture the window resize event */
      $(window).resize(function(){ resize(); });
      
      function resize() {
        /* Resize 3 box model */
        if($('#contain').length != 0){
        	if($('#contain').width() > $('#colours-wrapper').width()){$('#bars').css('width',$('#contain').width());}else{$('#bars').css('width',$('#colours-wrapper').width());}
        }else{
        	$('#bars').css('width',$('#wrapper').width());
        }
        
      }

      function init() {
        contentWidth=options.blockSize*10;
        $('#intro-content').width(contentWidth);
        $('#leftcol').css('margin-right',contentWidth/2);
        $('#leftcolContent').css('margin-top',options.blockSize*15);
        $('#rightcolContent').css('margin-top',options.blockSize*15);
        $('#rightcol').css('margin-left',(contentWidth/2)-1);
        
        if($('#colours-wrapper').length != 0){
        	$('#bars').css('width',$('#colours-wrapper').width() + 15).css('left', 0);
        }else{
        	$('#bars').css('width',$('#wrapper').width() + 15).css('left', 0);
        }
        
        $('#bars').css('width',$('#contain').width() + 15).css('left', 0);
        $("#colours").css('top',0);
        $("#colours").css('height',options.blockSize*11);
        $("#klik").css('top',options.blockSize*13);
        $('#bars').css('top',options.topMargin);
        /* Bars */
        for (n=0;n<6;n++) {
          $("#bars").append("<div id='bar"+n+"' class='bar'></div>");
          $("#bar"+n).height(2);
          $("#bar"+n).css('background-color',barDefs[n].colour);
        }
        resize();
        /* Blocks */
        availableBlocks=[];    
            
        for (x=0;x<10;x++) {
          for (y=0;y<b[x].length;y++) {
            $("#colours").append("<div id='b"+x+"-"+y+"' class='block'></div>");
            
            $("#b"+x+"-"+y).css('width',options.blockSize);
            $("#b"+x+"-"+y).css('height',options.blockSize);
            if(b[x][y].c != "#"){
            	$("#b"+x+"-"+y).css('background-color',b[x][y].c);
            }
            if (options.initialTransitionType==1) {
              $("#b"+x+"-"+y).css('left',options.blockSize*x);
              $("#b"+x+"-"+y).css('top',options.blockSize*(y+1));
            } else if (options.initialTransitionType==3) {
              $("#b"+x+"-"+y).css('left',0);
              $("#b"+x+"-"+y).css('top',-options.blockSize);
            } else if (options.initialTransitionType==2) {
              $("#b"+x+"-"+y).css('left',options.blockSize*x);
              $("#b"+x+"-"+y).css('top',-options.blockSize);
            } else if (options.initialTransitionType==4) {
              $("#b"+x+"-"+y).css('left',options.blockSize*6);
              $("#b"+x+"-"+y).css('top',-options.blockSize);
            } else if (options.initialTransitionType==5) {
              $("#b"+x+"-"+y).css('left',options.blockSize*6);
              $("#b"+x+"-"+y).css('top',options.blockSize*(y+1));
            } else if (options.initialTransitionType==6) {
              $("#b"+x+"-"+y).css('left',options.blockSize*x);
              $("#b"+x+"-"+y).css('top',options.blockSize*(y+1));
              $("#b"+x+"-"+y).css('width',options.blockSize*400);
              $("#b"+x+"-"+y).css('height',options.blockSize*400);
            }
            // Build a list of available blocks
            availableBlocks.push({id:'#b'+x+'-'+y,x:x,y:y});
          }
        }
        $('.block').click(function() { alert('No, I am not Flash! Just pure HTML/Javascript...'); });
      }
	  
	  
	  var methods = {
      	init: function(){init(); run();},
      	goLogo: function(){ goLogo(tSpeed,bSpeed,transitionType);},
      	end: function(){goSkyward();}
      };
      
      if ( methods[method] ) {
      	return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
      } else if ( typeof method === 'object' || ! method ) {
      	return methods.init.apply( this, arguments );
      } else {
        $.error( 'Method ' +  method + ' does not exist on jQuery.kliklogo' );
      } 

      function run() {
        if(options.animateBars){
	        for (n=0;n<6;n++) {
	          $("#bar"+n).animate({height: options.blockSize }, 1000, 'linear'); // Insert a delay((6-n)*200). for garage-door effect
	        }
        }
        $('#bars div').height(options.blockSize); 
        // Animate bars
        $("#bars").animate({top: options.topMargin, opacity:1 }, 1000, barsLoaded);
        // Appear Klik
        $("#klik").animate({opacity: 1 }, 2000);
      }

      function barsLoaded() {
        goLogo(20,((options.initialTransitionType==2)?-1:250),options.initialTransitionType);
        $("#leftcolContent").animate({opacity: 1}, 2000);
        $("#rightcolContent").animate({opacity: 1 }, 2000);
        $("#intro-footer").animate({opacity: 1 }, 3000);
      }

      // Block Animations
      function getNextBlock() {
        curBlock++;
        block=availableBlocks[curBlock-1];
        block.speed=(blockSpeed==-1)?Math.floor(Math.random()*2000):blockSpeed;
        return block;
      }
      function blocksToLogo() {
        if (curAction!="goLogo") return;
        block=getNextBlock();
        $(block.id).animate({opacity: 1,top: options.blockSize*(block.y+1),left: options.blockSize*block.x }, block.speed);
        if (curBlock<availableBlocks.length) {
          s=(transitionSpeed==-1)?Math.floor(Math.random()*1000):transitionSpeed;
          setTimeout( blocksToLogo , s );
        }
        // availableBlocks.splice(randomBlockNum,1);        
        return false;
      }

      function blocksToLeft() {
        if (curAction!="goLeft") return;
        block=getNextBlock();
        $(block.id).animate({opacity: 0,left: -options.blockSize }, block.speed);
        if (curBlock<availableBlocks.length) {
          s=(transitionSpeed==-1)?Math.floor(Math.random()*1000):transitionSpeed;
          setTimeout( blocksToLeft, s );
        }
        return false;
      }

      function blocksToRight() {
        if (curAction!="goRight") return;
        block=getNextBlock();
        $(block.id).animate({opacity: 0,left: contentWidth }, block.speed);
        if (curBlock<availableBlocks.length) {
          s=(transitionSpeed==-1)?Math.floor(Math.random()*1000):transitionSpeed;
          setTimeout( blocksToRight, s );
        }
        return false;
      }

      function blocksToTop() {
        if (curAction!="goSkyward") return;
        block=getNextBlock();
        $(block.id).animate({opacity: 0, top: -options.blockSize, width: options.blockSize/2, height: options.blockSize/2}, block.speed); //Sam h + w to 0
        if (curBlock<availableBlocks.length) {
          s=(transitionSpeed==-1)?Math.floor(Math.random()*1000):transitionSpeed;
          setTimeout( blocksToTop, s );
        }
        return false;
      }

      function goLogo(tSpeed,bSpeed,transitionType) {
        curAction="goLogo";
        curBlock=0;
        if (transitionType==3) {
          resetAvailableBlocks();
          availableBlocks.reverse();
        } else {
          shuffle(availableBlocks);
        }
        // Speeds are in millisecs
        transitionSpeed=tSpeed;
        blockSpeed=bSpeed;
        blocksToLogo();
      }

      function goLeft() {
        curAction="goLeft";
        curBlock=0;
        resetAvailableBlocks();
        availableBlocks.reverse();
        transitionSpeed=3;
        blockSpeed=440;
        blocksToLeft();
      }

      function goRight() {
        curAction="goRight";
        curBlock=0;
        resetAvailableBlocks();
        transitionSpeed=3;
        blockSpeed=440;
        blocksToRight();
      }
      
      function explodeBlocks(){
      	
      }

      function goSkyward(link) {
        curAction="goSkyward";
        curBlock=0;
        resetAvailableBlocks();
        $("#klik").animate({opacity:0},750);
        $(".nav").animate({opacity:0},750);
        for (n=0;n<6;n++) {
          $("#bar"+n).delay(750).animate({height: 16 }, 1000, 'linear');
        }
        $("#bars").delay(750).animate({top:113},1000,"linear", function(){
        	window.location = $(link).attr('href'); //Sam interrupted link is now visited.
        });
        transitionSpeed=9;
        blockSpeed=99;
        blocksToTop();
      }

      function redraw() {
        frame++;
        if (frame<100 && $("#bar1").height()<options.blockSize)
        for (n=0;n<6;n++) {
          $("#bar"+n).height($("#bar1").height()+1);
        }
        /* Every 4th frame */
        if (frame>20 && Math.round(frame/4)==(frame/4) && charnum<typeThis.length) {
          // Do something
        }
      }
}

})(jQuery);
