/*
	Global JS defenitions
	Written by Dmitri Smirnov, 2010
*/

var $$ = {
	hash: {},

  init: function() {
//		this.tooltip();
		this.bgscroll();
		$("a[rel='prettyPhoto[mixed]']").prettyPhoto({theme:'facebook'});

		$(".init").each(function(){
			classList = this.className.split(' ');
			for (var key in classList) {
				var val = classList [key];
				if(val != 'init' && $$.i[val] != undefined) $$.i[val](this);
			}
		});
  },

	color: {

		rgb2hex: function (r, g, b) {
			return (((r & 255) << 16) + ((g & 255) << 8) + b).toString(16)
		},

		hex2rgb: function (hex) {
			 return (function (v) { 
				return [v >> 16 & 255, v >> 8 & 255, v & 255];
			})(parseInt(hex, 16));
		}
	
	},

  bgscroll: function() {
		var backgroundheight = 2540;
		var el = $('#head');
		var h1 = $('#content h1');
		var offset = parseInt(String(el.css('backgroundPosition').match(/\s[0-9|-]*px/)).replace('px', ''));


		var canvas = document.createElement('canvas');
		var gradient = false;
		if(canvas.getContext) {

			// Initaliase a 2-dimensional drawing context
			var ctx = canvas.getContext('2d');
			var img = new Image();
			img.src = String(el.css("backgroundImage")).replace('url(', '').replace(')', '');
			canvas.width = img.width;
			canvas.height = img.height;
			//ctx.drawImage(img,0,0,img.width,img.height);
			//gradient = ctx.getImageData(0, 0, 1, img.height);
			//var gd = gradient.data;

		}


		function scroll() {
			offset = (offset < 1) ? offset + (backgroundheight - 3) : offset - 3;
			el.css("background-position", "0 " + offset + "px");
			if(gradient) {
				var gd = gradient.data;
				var n = (offset+50)*4;
				h1.css({'color': 'rgb('+gd[n]+','+gd[n+1]+','+gd[n+2]+')'});
			}
				
			setTimeout(function() {
					scroll();
				}, 300
			);
		}
		scroll();

  },




  cleardelay: function(name) {
		if (this.hash[name])
			clearTimeout(this.hash[name]);
  },


  load: function() {
		$(document).ready(function() {
			$$.init();
		});
		$(window).load(function() {
		});

	},


	tooltip: function(){	
		var xOffset = 5;
		var yOffset = 20;

		$(".tooltip").hover(function(e){
			var el = $(this);
			this.t = this.title;
			this.title = '';
			this.c = this.className.indexOf('error')>=0?'t_error':'';
			$("body").append('<p id="tooltip" class="'+ this.c +'"><span>'+ this.t +'</span></p>');
			$("#tooltip").css({
				top: (e.pageY - xOffset) + "px", 
				left: (e.pageX + yOffset) + "px"
			}).fadeIn();
    },
		function(){
			this.title = this.t;
			$("#tooltip").remove();
    }).mousemove(function(e){
			$("#tooltip").css({
				top: (e.pageY - xOffset) + "px", 
				left: (e.pageX + yOffset) + "px"
				});
		});
	},
	
	i: {
		'textureFill': function(el){ // Init banner

			//var drawingCanvas = document.getElementById('textureFill');

			var timer = {
				Points: [],
				start: function(){
					this.point('Start');
				},
				point: function(comment){
					this.Points.push([(new Date()).getTime(), comment]);
				},
				end: function(comment){
					this.point(comment);
					var P = this.Points;
					//console.log(P);
					for(var i = 1; i<P.length; i++) {
						console.log(P[i][1] + ': ' + (P[i][0]-P[i-1][0]));
					}
					console.log('Total: ' + (P[P.length-1][0]-P[0][0]));
				},
			};
			timer.start();
			

			var canvas = el;

			//console.log(canvas);


      //$el = $(el);
      //$el.css({width: '1000px', height: '1000px'});
			
			var w = canvas.width;
			var h = canvas.height;

			
			// Extend ImageData object
			if (ImageData.prototype.blend==null) ImageData.prototype.blend = function(o){
				var thisobj = this;
				if(typeof o!="object") o = new Object();
				var set = function(option, defaultValue) {
					return (typeof option=="undefined") ? defaultValue : option;
				}

				// Set Defaults
				this.options = { 
					front:		thisobj,
					opacity:	set(o.opacity, 1),	 			// Front Image Opacity (alpha channel) [0 - 1] 
					mode:			set(o.mode, "normal"), 		// Blend Modes ["normal", "multiply", etc ]
					back:			set(o.back, null ),				// Background Image [ImageData object]
					formula:	set(o.formula, null )			// 
				}
        
        var opacity = Math.max(0,Math.min(1,this.options.opacity));

				// Init Formula for Blend Mode
				var formula = this.options.formula;
				switch (this.options.mode) {
					case "normal" : 
						formula = function(f,b){return f};
						break;

					case "multiply" :
						formula = function(f,b){return f*b}
						break;

					case "softlight" : 
						formula = function(f,b){return (f > 0.5) ? 1 - (1 - f) * (1 - (f - 0.5)) : b * (f + 0.5)};
						break;
					
          case "lighten" : 
						formula = function(f,b){return Math.max(f,b)};
						break;
					
          case "overlay" : 
						formula = function(f,b){return (b > 0.5) ? 1 - (1 - 2*(b-0.5)) * (1 - f) : 2*b*f };
						break;
					
          case "softlight3" : 
						formula = function(f,b){
							return (f > 0.5) ? 1 - (1 - f) * (1 - (f - 0.5)) : b * (f + 0.5);
						};
						break;
				}
				
				var p = this.width*this.height;
				var pix = p*4;
				
				var data = this.data;
				var data2 = this.options.back.data;

        var opacity2 = 1-opacity;
        //var newColor = function(f,b){return (255*formula(f/255, b/255) * opacity + b * opacity2)>>0}
        var newColor = function(f,b){return (255*formula(f/255, b/255) * opacity + b * opacity2)>>0}
	
				while (pix-=4) {
          data[pix]			= newColor(data[pix], data2[pix]);
          data[pix+1] 	= newColor(data[pix+1], data2[pix+1]);
          data[pix+2] 	= newColor(data[pix+2], data2[pix+2]);
				}

				return this;
			}

			//console.log(ImageData);
			//console.log(rgb2hex(102, 204, 255));
			//console.log(hex2rgb("66CCFF"));

			
			// Check the element is in the DOM and the browser supports canvas
			if(canvas.getContext) {
				// Initaliase a 2-dimensional drawing context
				var context = canvas.getContext('2d');
        
        x = 1, 
        y = 1,
        rx = w / 2,
        ry = h / 5;
        
        var xc = ~~(256 * x / w);
        var yc = ~~(256 * y / h);
        grad = context.createRadialGradient(rx, ry, 0, rx, ry, w*5/6);
        grad.addColorStop(0, '#71E4FF');
        //grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
        grad.addColorStop(1, '#196EAE');
        // ctx.restore();
        context.fillStyle = grad;
        context.fillRect(0,0,w,h);

				timer.point('Fill Gradient');

				var Color = $$.color.hex2rgb('196EAE');
				//console.log(Color);
				//context.save();
        var gradient = context.getImageData(0, 0, 1000, 1000);

				//var result = Color.blend({mode: 'multiply', back: gradient.data});
				//context.putImageData(result, 0,0);
        
				
				var gd = gradient.data;

				
				// Creating Noise Image
				var n1 = context.createImageData(1000, 1000);
				var n1d = n1.data;

				for (var i = 0; n = n1d.length, i < n; i += 4) {
          var rnd = 255-parseInt(Math.random()*128);
					n1d[i  ] = rnd; // red channel
					n1d[i+1] = rnd; // green channel
					n1d[i+2] = rnd; // blue channel
					n1d[i+3] = 255; // alpha channel
				}
				// Draw the ImageData object at the given (x,y) coordinates.
				//context.putImageData(n1, 0,0);
        
				timer.point('First Noise');
        
				// Creating Second Noise Image from the First
				var n2 = context.createImageData(1000, 1000);
				var n2d = n2.data;
				var dy = 1 * n2.width*4;

				for (var i = 0; n = n2d.length, i < n; i += 4) {
					n2d[i   + dy] = 255 - n1d[i  ]; // red channel
					n2d[i+1 + dy] = 255 - n1d[i+1]; // green channel
					n2d[i+2 + dy] = 255 - n1d[i+2]; // blue channel
					n2d[i+3] = 255; // alpha channel
				}
				// Draw the ImageData object at the given (x,y) coordinates.
				//context.putImageData(n2, 100,0);

				timer.point('Second Noise');
				
				var result = n2.blend({mode: 'multiply', back: n1, opacity: 1});
				//context.putImageData(result, 200,0);

				timer.point('Multiply noises');

				//var result2 = result.blend({mode: 'lighten', back: gradient});
				var result2 = n2.blend({mode: 'softlight', back: gradient, opacity: .5});
				context.putImageData(result2, 0,0);

				timer.point('Blend to background');





        //context.restore();
				//timer.point('draw image');

/*
				for(j=0; j < h/5; j++){
					for(i=0; i < w/5; i++){
            var rnd = Math.random();
						context.fillStyle = "rgba(255,255,255," + rnd/7 + ")";
						context.fillRect(i,j,1,1);
						//context.fillStyle = "rgba(0,0,0," + rnd/7 + ")";
						context.fillStyle = "rgba("+Color[0]+","+Color[1]+","+Color[2]+"," + rnd/7 + ")";
						context.fillRect(i,j+1,1,1);
					}
				}
*/
				//console.log(imgd);

				timer.end('add points');
				
/*
				// Create the yellow face
				context.strokeStyle = "#000000";
				context.fillStyle = "#FFFF00";
				context.beginPath();
				context.arc(100,100,50,0,Math.PI*2,true);
				context.closePath();
				context.stroke();
				context.fill();*/
			}
			
		}
	}
}



$$.load();





