var $helpers = {};
(function ($){

	$helpers.createObserverableSubject = function(){
		var observers = [];
		var addObserver = function (o) {
	        if (typeof o !== 'function') {
	        	return;
	        }
	        for (var i=0; i<observers.length; i++) {
	            var observer = observers[i];
	            if (observer === o) {
	                return;
	            }
	        }
	        observers.push(o);
	    };
	    var removeObserver = function (o) {
	        for (var i=0; i < observers.length; i ++) {
	            var observer = observers[i];
	            if (observer === o) {
	                observers.splice(i, 1);
	                return;
	            }
	        }
	    };
	    var notifyObservers = function (data) {
	        var observersSnapshot = observers.slice(0);
	        for (var i=0; i < observersSnapshot.length; i ++) {
	            observersSnapshot[i](data);
	        }
	    };
	    return {
	        add: addObserver,
	        remove: removeObserver,
	        notify: notifyObservers
	    };

	}

	jQuery.fn.hoverBlink = function (){
		$(this).each(function (){
			var $this = $(this).css('position', 'relative');
			var $blinker = $('<span />')
					.addClass('blinker')
					.appendTo($this);
			$this.mouseover(function (){
				$blinker.stop().animate({opacity: 0.3}, 100, function (){
					$blinker.animate({opacity: 0}, 100);	
				});
				
			});
			
			
		});
		
		return this;
	}
	
	jQuery.fn.swicher = function (callback){
		$(this).each(function (){

			var $links = $(this).find('a');
			$links.click(function (event){
				event.preventDefault();
				var $this = $(this);
				if ($this.hasClass('active')) return;

				var $active = $links.filter('.active');
				if ($active.get(0)){
					$active.removeClass('active');
					$($active.attr('href')).hide();
				}

				$this.addClass('active');
				$($this.attr('href')).show();

				if (typeof callback == 'function') {
					callback.call(this);
				}

			}).each(function (){
				var $this = $(this);
				$($this.attr('href')).hide();
			}).filter(':first').click();

		})

	};

	jQuery.fn.gradientText = function (options){
		var config = {
			from: "#000",
			to: "#FFF"
		};
		$.extend(config, options);
		$(this).each(function(){

			/*=============== wrapping letters ======================*/
/*			var letters = this.innerHTML.split(''),
				wHTML = '<span class="gr-t">';
			for (var i=0; i<letters.length;i++){
				wHTML+= /\S/.test(letters[i]) ? '<span class="gr-l">'+letters[i]+'</span>' : letters[i];
			}
			wHTML+= '</span>';
			this.innerHTML = wHTML;*/

			/* ================== assign colors =============================*/
			var $root = $(this).find('span.gr-t');

			$root.data('preWidth', -1 );

			$(window).resize(resize);

			setTimeout(resize, 10); 

			function resize(){
				var rw = $root.width();
				if (rw){
					if (rw != $root.data('preWidth') ){
						$root.data('preWidth', rw);
						applyGradient($root);
					}
				} else {
					if (!$root.data('eventAdded')){
						$root.data('eventAdded', true);
						if ($helpers.onShowElement){
							$helpers.onShowElement.add(function ($header){
								if ($root.parent().get(0) == $header.get(0)){
									rw = $root.width();
									if (rw != $root.data('preWidth') ){
										$root.data('preWidth', rw);
										applyGradient($root);
									}
								}
							});
						}
					}

				}
			}


		});

		function applyGradient($root){
			var rootOffset = $root.offset().left,
				rootWidth = $root.width(),
				gradientStart = hexToRgb(config.from),
				gradientStop = hexToRgb(config.to);

			$root.find('span.gr-l').each(function (){
				var $this = $(this);
				var letterPosition = $this.offset().left - rootOffset,
					gOffset = letterPosition / rootWidth,
					resultRGB = [];
				for (var i=0; i<3; i++){
					resultRGB[i] = gradientStart[i] + Math.round((gradientStop[i] - gradientStart[i])*gOffset);
				}
				var color = rgbToHex(resultRGB);
				$this.css('color', color);
			});
		}

		function hexToRgb(hex){
			hex = hex.replace('#', '');
			if (hex.length == 3) {
				hex = hex.substr(0, 1) + hex.substr(0, 1) + hex.substr(1, 1) + hex.substr(1, 1) + hex.substr(2, 1) + hex.substr(2, 1);
			}

			return [parseInt(hex.substr(0, 2), 16), parseInt(hex.substr(2, 2), 16), parseInt(hex.substr(4, 2), 16)];
		}

		function rgbToHex(rgb){
			return '#'+rgb[0].toString(16)+rgb[1].toString(16)+rgb[2].toString(16);
		}


		return this;

	};

	$(function (){
		$('.bottom h3').gradientText({from: "#14293f", to: "#2f71b6"});
		/*$('.content h3').gradientText({from: "#14293f", to: "#2f71b6"});*/
		$('.moduletable-clients .title').gradientText({from: "#14293f", to: "#2f71b6"});
		$('h1').gradientText({from: "#14293f", to: "#2f71b6"});
		$('.moduletable-content-nav h3').gradientText({from: "#14293f", to: "#2f71b6"});

		$('.hover-blink').hoverBlink();
		
		var checkWidth = function() {
			if ($(window).width() < 1080) {
				$('body').addClass('small');
			} else {
				$('body').removeClass('small');
			}
		};

		checkWidth();
		$(window).resize(checkWidth);

	});



})(jQuery);
