/**
 * GF Studio - jQuery plugin 2010
 *
 * Copyright (c) 2010 GF Studio SRL
 * http://www.gfstudio.com
 *
 * ToDo:
 * 	1: verificare la presenza della console.
 *	2: migliorare la funzione di validazione
 *	3: inserire un news ticker
 *
 */
(function( $ )
{

	Array.prototype.clean = function( deleteValue )
	{
		for( var i = 0; i < this.length; i++ ){
			if( this[i] == deleteValue ){
				this.splice( i, 1 );
				i--;
			}
		}
		
		return this;
	};

	Array.prototype.in_array = function( p_val )
	{
		for( var i = 0, l = this.length; i < l; i++ ){
			if( this[i] == p_val ){
				return true;
			}
		}
		return false;
	}
	
	$.fn.GF = function(){};

	$.extend( $.fn.GF, 
	{
		/**
		 * configuration
		 */
		config		: {
			multilanguage 	: false
		},
		
		/**
		 * Functions and properties related with the most powerfull browser: internet explorer
		 */
		isIE 		: $.browser.msie ? true : false,
		isIE6 		: $.browser.msie && $.browser.version == '6.0' ? true : false,
		isIE7		: $.browser.msie && $.browser.version == '7.0' ? true : false,
		IEversion 	: $.browser.msie ? $.browser.version : -1,
		
		/**
		 * Mobile functions and properties
		 */
		isMobile	: ( /Android|iPhone|iPad/i ).test( navigator.userAgent ),
		
		/**
		 * Language control
		 */
		getLanguage : function()
		{
			var page = $( 'html' ).attr( 'lang' ).substr( 0, 2 );
			
			return page;
		},
		
		/**
		 * Pageage control
		 */
		pages : function()
		{
			var pages = location.pathname.split( '/' ).clean( '' );
			
			if( !pages.length )
				return false;
			
			if( pages && $.fn.GF.config.multilanguage && pages[0].length <= 2 )
				pages.shift();
			
			return pages;
		},
		 
		isPage : function( name, index )
		{
			index = index || 0;
			
			var pages = $.fn.GF.pages();
			
			if( name instanceof Array ){
				
				var nameSize = name.length;
				
				for( i=0; i<nameSize; i++ ) if( pages[index] == name[i] ) return true;
				
				return false;
				
			}
			
			return pages[index] == name
				 ? true
				 : false;
		},
		
		isHome : function( homeName )
		{
			homeName = homeName || 'home';
		
			var pages = $.fn.GF.pages();
			
			if( !pages )
				return true;
			
			return !pages.length || pages[0] == homeName
				 ? true
				 : false;
		},

		getPage : function( index )
		{
			index = index || 0;
			
			var pages = $.fn.GF.pages();
			
			return pages[index];
		},

		/**
		 * Utility
		 */
		randomNumber : function( min, max )
		{
			return Math.floor( min + Math.random() * ( max - min + 1 ) );
		},
		
		preload : function( selector )
		{
			if( $.fn.GF.isIE )
				return false;
			
			$( selector ).hide().each(function()
			{
				var $this	= $( this );
				var src 	= $this.attr( 'src' );
				var $img 	= $( '<img />' );
				
				$img.attr( 'src', src );
				$img.load( function()
				{
					$this.fadeIn();
					
					//$img = null;
				})
			});
			
		},
		
		/**
		 * Form validation
		 */
		validate : function( options )
		{
			var defaults = {
				form			: '',
				errorClass		: 'error',
				requiredClass 	: 'required',
				onError 		: '',
				onSuccess 		: ''
			};
		
			var opt 	= $.extend( defaults, options );
			var self 	= this;
			var $form 	= $( opt.form );
			
			$form.submit(function()
			{
				
				var error 	= false;
				var filter	= /^[\w](([_\.-]?[\w]+)*)@([\w]+)(([\.-]?[\w]+)*)\.([A-Za-z]{2,})$/;
				var $inputs = $( this ).find( '.' + opt.requiredClass );
				
				$inputs.each(function()
				{

					var $input 			= $( this );
					var $prev			= $input.prev();
					var $next			= $input.next();
					var isPrevLabel 	= $prev.is( 'label' );
					var isNextLabel		= $next.is( 'label' );
					var isParentLabel	= $input.parent().is( 'label' );
					var isMail			= $input.attr( 'name' ).toLowerCase().indexOf( 'mail' ) > 0 ? true : false;
					
					if( !$input.val() || ( isMail && !filter.test( $input.val() ) ) || ( $input.is( 'input[type=checkbox]' ) && !$input.is( ':checked' ) ) ){
						$input.addClass( opt.errorClass );
						
						if( isPrevLabel )
							$prev.addClass( opt.errorClass );
						
						if( isNextLabel )
							$next.addClass( opt.errorClass );
						
						if( isParentLabel )
							$input.parent().addClass( opt.errorClass );
						
						if( !isPrevLabel && !isNextLabel && !isParentLabel )
							$input.parent().addClass( opt.errorClass );
						
						error = true;
					}
					else {
						$input.removeClass( opt.errorClass );

						if( isPrevLabel )
							$prev.removeClass( opt.errorClass );
						
						if( isNextLabel )
							$next.removeClass( opt.errorClass );
							
						if( isParentLabel )
							$input.parent().removeClass( opt.errorClass );

						if( !isPrevLabel && !isNextLabel && !isParentLabel )
							$input.parent().removeClass( opt.errorClass );
					}

				});
				
				if( error ){
					if( opt.onError instanceof Function ){
						opt.onError.form = $form[0];
						opt.onError();
					}
					
					return false;
				}
				else {
					if( opt.onSuccess instanceof Function ){
						opt.onSuccess.form = $form[0];
						return opt.onSuccess();
					}
					
					return true;
				}
			});
		},

		/**
		 * Slide navigations
		 */
		slides: function( options )
		{

			var defaults = {
				menu 		: '#menu',
				slider 		: '#slider',
				activeClass : 'current-menu-item',
				applyClass 	: 'self',
				width 		: 800,
				speed 		: 800,
				easing		: null
			};
			
			var opt 		= $.extend( defaults, options );
			var $scroller	= $( opt.slider );
			
			$( opt.menu ).find( 'a' ).click(function()
			{
				
				var $this		= $( this );
				var href 		= $this.attr( 'href' );
				var $slide 		= $( href );
				var range		= $slide.index() * opt.width;
				
				if( !$slide ) 
					return;

				if( $this.parent().is( 'li' ) ){
				
					if( opt.applyClass == 'self' )
						$this.addClass( opt.activeClass ).parent().siblings().children( 'a' ).removeClass( opt.activeClass );
					else
						$this.parent().addClass( opt.activeClass ).siblings().removeClass( opt.activeClass );
						
				}
				else {
				
					if( opt.applyClass == 'self' )
						$this.addClass( opt.activeClass ).siblings().removeClass( opt.activeClass );
					else
						$this.parent().addClass( opt.activeClass ).siblings().removeClass( opt.activeClass );
				
				}

				var optAnimate = {
					duration	: opt.speed,
					queue		: false
				};
			
				if( null !== opt.easing )
					optAnimate.easing = opt.easing;
			
				$scroller.animate(
					{ marginLeft: -range  },
					optAnimate
				);
	
				
				return false;
			});
			
		},

		/**
		 * Google Map
		 */
		googlemap: function( selector, options )
		{
			var defaults = {
				markers 	: [],
				type 		: 'roadmap',
				zoom		: 10,
				ui			: false,
				scale		: true,
				nav			: true,
				center		: ''
			};
			
			var opt = $.extend( defaults, options );
	
			var mapTypes = {
				hybrid		: 'HYBRID',
				roadmap		: 'ROADMAP',
				satellite	: 'SATELLITE',
				terrain		: 'TERRAIN'
			};
	
			$( selector ).each( function()
			{
				
				var centers = opt.center 
							? opt.center.split( ',' ) 
							: opt.markers[0].coord.split( ',' ); 
	
				var mapOptions = {
					zoom				: opt.zoom,
					center				: new google.maps.LatLng( centers[0], centers[1] ),
					mapTypeId			: google.maps.MapTypeId[mapTypes[opt.type]],
					disableDefaultUI	: opt.ui,
					scaleControl		: opt.scale,
					navigationControl	: opt.nav
				};
	
				var map = new google.maps.Map( this, mapOptions );
				
				// adding markers
				var count = opt.markers.length;
				
				for( var i = 0; i < count; i++ ){
					
					var mark = opt.markers[i];
					
					var coords 			= mark.coord.split( ',' );
					var markerLatLng 	= new google.maps.LatLng( coords[0], coords[1] );
					
					var marker = new google.maps.Marker(
						{ position: markerLatLng, map: map }
					);
	
					if( mark.image )
						marker.icon = mark.image;
	
					if( mark.title )
						marker.title = mark.title;
	
					if( mark.content ){
	
						var infowindow = new google.maps.InfoWindow(
						{
							content: mark.content
						});
	
						if( mark.maxWidth )
							infowindow.maxWidth = mark.maxWidth;
	
						google.maps.event.addListener( marker, 'click', function()
						{
							infowindow.open( map, marker );
						});
					}
	
				}
				
			});

		},

		lazy: function( elements, delay, fadeDuration, iefilter )
		{
			
			delay 			= delay || 200;
			fadeDuration 	= fadeDuration || 600;
			iefilter		= false;
			var options 	= { opacity : 1 };
			
			if( iefilter )
				options.filter = '';
			
			elements.each(function( i )
			{
				var time  = delay * i;
				var $this = $( this ).fadeTo( 0, 0 );
				
				setTimeout(function()
				{
					$this.animate(
						options,
						{ queue: false, duration: fadeDuration }
					);				
				}, time );
			});

		},
		
		/**
		 * Cookie management
		 */
		cookie:
		{
			set		: function( name, value, days )
			{
				if( days ){
					var date = new Date();
					date.setTime( date.getTime() + ( days*24*60*60*1000 ) );
					
					var expires = '; expires='+date.toGMTString();
				}
				else var expires = '';
				
				document.cookie = name+'='+value+expires+'; path=/';				
			},

			get		: function()
			{
				var nameEQ 	= name + '=';
				var ca 		= document.cookie.split( ';' );
				var caSize 	= ca.length;
					
				for( var i=0; i<caSize; i++ ){
					var c = ca[i];
					while( c.charAt( 0 ) == ' ' ) c = c.substring( 1, c.length );
					
					if( c.indexOf( nameEQ ) == 0 ) return c.substring( nameEQ.length, c.length );
				}
				return null;

			},
			
			unset	: function()
			{
				var date = new Date();
				document.cookie = name+'=;path=/;expires=' + date.toGMTString();
			}
		}
	});

})( jQuery );
