/**
 * @version 1.1
 *
 * @copyright Copyright 2010 WnG Solutions Sarl, all rights reserved
 * @author Daniel Calderini <daniel DOT calderini AT wng DOT ch>
 * @package Handicap International
 */

if (typeof WnG != 'object')
	WnG = {};

/**
 * Initialisation du site
 * Fonction appelee a chaque chargement de page
 * @var function
 */
WnG.init = function() {
	WnG.tools.textSize();
	WnG.tools.searchbox();
	WnG.tools.menuMain();
};

/**
 * Configuration generale du site
 * @var Object
 */
WnG.config = {
	// Configuration des onglets
	tabs: {
		maxTabs: 3
	},
	
	// Box de recherche dans la barre d'outils
	searchbox: {},
	
	// Configuration des galeries photos
	gallery: {
		count: 0,
		lightbox: {
			currentIndex: -1,
			totalIndex: -1,
			
			labels: {
				autoplay_start: 'Start slideshow',
				autoplay_stop: 'Stop slideshow'
			},
			
			autoplay: {
				startIndex: -1,
				running: false,
				interval: 5,
				timer: null
			},
			
			config: {
				'titlePosition': 'inside',
				'titleFormat': function(title, currentArray, currentIndex, currentOpts) {
					return WnG.gallery.title_callback(title, currentArray, currentIndex, currentOpts);
				},
				'onClosed': function() {
					WnG.gallery.autoplay(true);
				}
			}
		}
	}
};

/**
 * Outils du site
 * @var Object
 */
WnG.tools = {
	/**
	 * Initialisation de la gestion de la taille du texte (au chargement de la page)
	 *
	 * @return void
	 */
	textSize: function() {
		// Lecture d'un eventuel cookie
		// L'operation " - 0" permet de s'assurer qu'il s'agit d'un Integer et pas de la constante NaN (Not A Number).
		if ($.cookie(WnG.config.textSize.cookieName) - 0)
			var defaultSize = $.cookie(WnG.config.textSize.cookieName) - 0;
		else
			var defaultSize = WnG.config.textSize.original - 0;
		
		// Definition de la taille par defaut
		WnG.tools.textSize_change('#content', defaultSize);
		WnG.config.textSize.current = defaultSize;
		
		// Lien de changement de taille du texte
		$('#tools .accessSize a').click(function() {
			if ($(this).hasClass('smaller')) {
				if (WnG.config.textSize.current <= WnG.config.textSize.min)
					return false;
				
				WnG.config.textSize.current = Math.round((WnG.config.textSize.current - 0.1) * 10) / 10;
			} else if ($(this).hasClass('bigger')) {
				if (WnG.config.textSize.current >= WnG.config.textSize.max)
					return false;
				
				WnG.config.textSize.current = Math.round((WnG.config.textSize.current + 0.1) * 10) / 10;
			}
			
			// Modification de la taille
			WnG.tools.textSize_change('#content', WnG.config.textSize.current);
			
			return false;
		});
	},
	
	/**
	 * Modifie la taille actuelle du texte
	 *
	 * @param string selector Selecteur CSS sur lequel appliquer la modification
	 * @param float size Nouvelle taille du texte (en "em")
	 * @return void
	 */
	textSize_change: function(selector, size) {
		// Modification de l'affichage
		$(selector).css('font-size', size + 'em');
		
		// Ajout du cookie de la taille actuelle
		$.cookie(WnG.config.textSize.cookieName, size, { expires: 7, path: '/' });
	},
	
	/**
	 * Initialisation de la box de recherche dans la barre d'outils
	 *
	 * @return void
	 */
	searchbox: function() {
		$('#tx_indexedsearch_sword').focus(function() {
			var currentValue = $(this).attr('value');
			
			if (currentValue == WnG.config.searchbox.defaultValue)
				$(this).attr('value', '');
		});
		
		$('#tx_indexedsearch_sword').blur(function() {
			var currentValue = $(this).attr('value');
			
			if (currentValue == '')
				$(this).attr('value', WnG.config.searchbox.defaultValue);
		});
	},
	
	/**
	 * Initialisation du menu principal du site (menu deroulant)
	 *
	 * @return void
	 */
	menuMain: function() {
		// Parcours des elements du menu
		$('#menuMain .menuSub').each(function() {
			// Cache le menu par defaut
			$(this).addClass('hideMe');
			
			// Affichage du menu au survol
			$(this).parent().hover(WnG.tools.menuMain_display, WnG.tools.menuMain_hide);
			
			// Affichage du menu au focus
			$(this).parent().focusin(WnG.tools.menuMain_display);
			$(this).parent().focusout(WnG.tools.menuMain_hide);
		});
	},
	
	/**
	 * Affiche le sous-menu
	 *
	 * @return void
	 */
	menuMain_display: function() {
		if (!$(this).hasClass('hover')) {
			$(this).children('.menuSub').removeClass('hideMe');
			$(this).addClass('hover');
		}
	},
	
	/**
	 * Cache le sous-menu
	 *
	 * @return void
	 */
	menuMain_hide: function() {
		if ($(this).hasClass('hover')) {
			$(this).removeClass('hover');
			$(this).children('.menuSub').addClass('hideMe');
			$(this).children('.menuSub').css('display', 'block');
		}
	},
	
	/**
	 * Redirige un utilisateur vers l'URL choisie si elle n'est pas nulle
	 *
	 * @param string url
	 * @return void
	 */
	jumpto: function(url) {
		if (url == '')
			return;
		
		window.location = url;
	},
	
	/**
	 * Retourne la valeur du parametre "name" qui se trouve dans l'URL "url"
	 *
	 * @param string name
	 * @param string url
	 * @return string
	 */
	getParamInUrl: function(name, url) {
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		
		var regexS = '[\\?&]' + name + '=([^&#]*)';
		var regex = new RegExp(regexS);
		var results = regex.exec(url);
		
		if (results == null) return '';
		else return results[1];
	}
};

/**
 * Slider d'images sous le menu principal
 * @var Object
 */
WnG.slidebox = {
	/**
	 * Initialisation de la box de defilement des images
	 *
	 * @return void
	 */
	init: function() {
		if ($('#slidebox').hasClass('slide'))
			$('#slidebox').append($('<div></div>').addClass('hoverImage')).append($('<div></div>').addClass('hoverText')).append($('<div></div>').addClass('hoverNavigation'));
		
		// Creation des differents elements de stockage
		$('#slidebox').append($('<ul></ul>').addClass('images'));
		
		// Affichage des images
		WnG.config.slidebox.loadedImages = 0;
		for (var i in WnG.config.slidebox.images) {
			$('#slidebox .images').append(
				$('<li></li>').addClass('image_' + i)
			);
			
			if (WnG.config.slidebox.images[i].link && WnG.config.slidebox.images[i].link.href) {
				$('#slidebox .images li.image_' + i).append(
					$('<a></a>')
						.attr('href', WnG.config.slidebox.images[i].link.href).attr('target', WnG.config.slidebox.images[i].link.target)
				);
			}
			
			// Creation des images (elles ne s'affichent qu'une fois chargees)
			$('<img />')
				.attr('src', WnG.config.slidebox.images[i].image.src)
				.attr('width', WnG.config.slidebox.images[i].image.width).attr('height', WnG.config.slidebox.images[i].image.height)
				.attr('alt', WnG.config.slidebox.images[i].image.alt).attr('title', WnG.config.slidebox.images[i].image.title)
				.addClass('image_' + i).load(function() {
					if ($('#slidebox .images li.' + $(this).attr('class') + ' a').length) {
						var path = '#slidebox .images li.' + $(this).attr('class') + ' a';
					} else {
						var path = '#slidebox .images li.' + $(this).attr('class');
					}
					
					$(path).append($(this));
					WnG.config.slidebox.loadedImages = WnG.config.slidebox.loadedImages + 1;
					
					// Toutes les images sont chargees
					if (WnG.config.slidebox.loadedImages == WnG.config.slidebox.totalImages) {
						// On active le carousel (si necessaire)
						if ($('#slidebox').hasClass('slide')) {
							$('#slidebox ul.images').jcarousel({
								auto: WnG.config.slidebox.timespace,
								scroll: 1,
								wrap: 'last',
								initCallback: WnG.slidebox._initCallback,
								itemVisibleInCallback: {
									onBeforeAnimation: WnG.slidebox._visibleBeforeCallback,
									onAfterAnimation: WnG.slidebox._visibleAfterCallback
								},
								itemVisibleOutCallback: {
									onBeforeAnimation: WnG.slidebox._invisibleBeforeCallback
								}
							});
						}
						
						$('#slidebox').removeClass('loading');
					}
				}).each(function() {
					// Cette methode est necessaire pour gerer correctement le cache de certains navigateurs.
					// En effet Chrome (et d'autres) n'appelle pas l'evenement "load" si un element est deja en cache...
					// (voir le commentaire de stanvp a l'adresse http://api.jquery.com/load-event/ pour plus de details)
					if (this.complete || (jQuery.browser.msie && parseInt(jQuery.browser.version) == 6))
						$(this).trigger('load');
				});
		}
		
		// Image superposee
		if (WnG.config.slidebox.overlay) {
			if (WnG.config.slidebox.overlay.image.src && WnG.config.slidebox.overlay.link.href) {
				
				if ($('#slidebox .hoverImage').length == 0) {
					$('#slidebox').append(
						$('<div></div>')
							.attr('class', 'hoverImage')
					);
				}
				
				$('#slidebox .hoverImage').append(
					$('<a></a>')
						.attr('href', WnG.config.slidebox.overlay.link.href).attr('target', WnG.config.slidebox.overlay.link.target)
						.append(
							$('<img />')
								.attr('src', WnG.config.slidebox.overlay.image.src)
								.attr('width', WnG.config.slidebox.overlay.image.width).attr('height', WnG.config.slidebox.overlay.image.height)
								.attr('alt', WnG.config.slidebox.overlay.image.alt).attr('title', WnG.config.slidebox.overlay.image.title)
						)
				);
			} else if (WnG.config.slidebox.overlay.image.src && !WnG.config.slidebox.overlay.link.href) {
				
				if ($('#slidebox .hoverImage').length == 0) {
					$('#slidebox').append(
						$('<div></div>')
							.attr('class', 'hoverImage')
					);
				}
				
				$('#slidebox .hoverImage').append(
					$('<img />')
						.attr('src', WnG.config.slidebox.overlay.image.src)
						.attr('width', WnG.config.slidebox.overlay.image.width).attr('height', WnG.config.slidebox.overlay.image.height)
						.attr('alt', WnG.config.slidebox.overlay.image.alt).attr('title', WnG.config.slidebox.overlay.image.title)
				);
			}
		}
	},
	
	/**
	 * Supprime la box de slide des images
	 *
	 * @return void
	 */
	removeSlidebox: function() {
		$('#slidebox .hoverText').remove();
		$('#slidebox .hoverNavigation').remove();
	},
	
	/**
	 * Gestion du mouseover pour le carousel
	 *
	 * @param Object carousel Instance du slide d'image
	 * @return void
	 */
	_initCallback: function(carousel) {
		if ($('#slidebox').css('position') == 'static')
			return;
		
		// Stop le carousel au survol des images et autres elements
		$('#slidebox').hover(function() { carousel.stopAuto(); }, function() { carousel.startAuto(); });
		
		// Ajout d'un label au dessus de la liste d'images
		$('#slidebox .hoverNavigation').append('<p></p>');
		$('#slidebox .hoverNavigation p')
			.addClass('hideMe')
			.append('<strong>Navigation graphique entre les images (non-accessible)</strong>');
		
		// Ajout du menu de selection de l'image active
		$('#slidebox .hoverNavigation').append('<ul></ul>');
		
		for (var i in WnG.config.slidebox.images) {
			var display = parseInt(i) + 1;
			$('#slidebox .hoverNavigation ul').append(
				$('<li></li>').append(
					$('<a></a>')
						.attr('href', '#slidebox_pict_' + display)
						.attr('id', 'slidebox_nav_' + display)
						.click(function() {
							carousel.scroll($.jcarousel.intval($(this).text()));
							return false;
						})
						.append(display)
				)
			);
		}
		
		// Menu actif actuel
		$('#slidebox_nav_1').addClass('menuOn');
	},
	
	/**
	 * Fonction callback a appeler avant l'affichage d'un element
	 *
	 * @param Object carousel
	 * @param Object element
	 * @param int index
	 * @param string state
	 * @return void
	 */
	_visibleBeforeCallback: function(carousel, element, index, state) {
		if ($('#slidebox').css('position') == 'static')
			return;
		
		$('#slidebox .hoverNavigation a').removeClass('menuOn');
		$('#slidebox_nav_' + index).addClass('menuOn');
	},
	
	/**
	 * Fonction callback a appeler apres l'affichage d'un element
	 *
	 * @param Object carousel
	 * @param Object element
	 * @param int index
	 * @param string state
	 * @return void
	 */
	_visibleAfterCallback: function(carousel, element, index, state) {
		if ($('#slidebox').css('position') == 'static')
			return;
		
		// Reprise du lien (si existant)
		if ($(element).children('a').size() > 0) {
			var href = $(element).children('a').attr('href');
			var content = $('<a></a>')
				.attr('href', href)
				.append(
					$(element).find('img').attr('alt')
				);
		} else {
			var content = $(element).find('img').attr('alt');
		}
		
		// Creation du texte de description de l'image
		$('#slidebox .hoverText').html(content);
	},
	
	/**
	 * Fonction callback a appeler avant de cacher un element
	 *
	 * @param Object carousel
	 * @param Object element
	 * @param int index
	 * @param string state
	 * @return void
	 */
	_invisibleBeforeCallback: function(carousel, element, index, state) {
		if ($('#slidebox').css('position') == 'static')
			return;
		
		$('#slidebox .hoverText').html('');
	}
};

/**
 * Gestion des galeries photos du site (slide et lightbox)
 * @var Object
 */
WnG.gallery = {
	/**
	 * Defini si une galerie est deja definie sur la page, une page ne pouvant accueillir qu'une seule galerie
	 *
	 * @var bool
	 */
	alreadySet: false,
	
	/**
	 * Initialise l'affichage d'une galerie photos
	 *
	 * @return void
	 */
	init: function() {
		WnG.gallery.alreadySet = true;
	},
	
	/**
	 * Genere une galerie photos selon les parametres donnes
	 *
	 * @param mixed carousel Selecteur jQuery a utiliser pour creer le carousel d'images (en general une balise <ul>)
	 * @param mixed links Selecteur jQuery pour creer les liens en lightbox (liens des images)
	 * @return void
	 */
	create: function(carousel, links) {
		// Initialisation
		WnG.gallery.init();
		
		// Parcours des images de la galerie
		$(links).each(function() {
			// Numero de l'image
			WnG.config.gallery.count++;
			var current = 'wngGalleryImage_' + WnG.config.gallery.count;
			
			// Modification de l'action du lien
			$(this)
				.attr('href', decodeURIComponent(WnG.tools.getParamInUrl('file', $(this).attr('href'))))
				.attr('title', $(this).children('img').attr('title')).attr('rel', 'image-gallery')
				.addClass(current).addClass('jqueryLightbox').unbind('click');
		});
		
		// Activation de la lightbox
		$('a.jqueryLightbox').fancybox(WnG.config.gallery.lightbox.config);
		
		// Activation du carousel d'images
		if ($(carousel).parents('#contentRight').length)
			$(carousel).jcarousel({scroll:1,visible:1});
		else
			$(carousel).jcarousel({scroll:4,visible:4});
	},
	
	/**
	 * Fonction a appeler apres la creation de la legende de l'image
	 *
	 * Le titre par defaut est passe en parametre, ce qui permet de le modifier avant de retourner le titre definitif.
	 *
	 * @param string Title Legende de l'image
	 * @param array currentArray Tableau contenant la liste des images de la galerie
	 * @param int currentIndex Numero de l'image actuelle
	 * @param array currentOpts ...
	 * @return string
	 */
	title_callback: function(title, currentArray, currentIndex, currentOpts) {
		var finalTitle = '';
		
		WnG.config.gallery.lightbox.currentIndex = currentIndex + 1;
		WnG.config.gallery.lightbox.totalIndex = currentArray.length;
		
		// Definition de la premiere image du slideshow s'il ne tourne pas encore
		if (!WnG.config.gallery.lightbox.autoplay.running) {
			WnG.config.gallery.lightbox.autoplay.startIndex = WnG.config.gallery.lightbox.currentIndex;
		} else {
			// Le slideshow tourne et on est revenu a la premiere image de la galerie, on stoppe l'animation
			if (WnG.config.gallery.lightbox.autoplay.startIndex == WnG.config.gallery.lightbox.currentIndex)
				WnG.gallery.autoplay(true);
		}
		
		finalTitle += '<div class="fancybox-autoplay floatR">' + WnG.gallery.autoplay_displayLink(true) + '</div>';
		
		// Creation du titre de l'image
		finalTitle += '<div><strong>Image ' + WnG.config.gallery.lightbox.currentIndex + ' / ' + WnG.config.gallery.lightbox.totalIndex + '</strong><br />' + title.replace('//', '<br />') + '</div>';
		
			// Lecture automatique
	
		
		return finalTitle;
	},
	
	/**
	 * Fonction permettant de lancer/stopper le diaporama automatique
	 *
	 * @param bool forceStop Permet de forcer l'arret du diaporama
	 * @return bool Toujours 'false'
	 */
	autoplay: function(forceStop) {
		// Play / Stop
		if (forceStop || WnG.config.gallery.lightbox.autoplay.running) {
			WnG.config.gallery.lightbox.autoplay.running = false;
			
			// Suppression de l'exec. automatique
			clearInterval(WnG.config.gallery.lightbox.autoplay.timer);
			
			// Changement du label du lien
			WnG.gallery.autoplay_displayLink();
		} else {
			WnG.config.gallery.lightbox.autoplay.running = true;
			
			// Execution automatique
			WnG.config.gallery.lightbox.autoplay.timer = setInterval(
				'WnG.gallery.autoplay_changeImage()', 
				WnG.config.gallery.lightbox.autoplay.interval * 1000
			);
			
			// Changement du label du lien
			WnG.gallery.autoplay_displayLink();
			
			// Si on se trouve sur la derniere image, on retourne a la premiere
			if (WnG.config.gallery.lightbox.currentIndex == WnG.config.gallery.lightbox.totalIndex)
				$.fancybox.pos(0);
		}
		
		return false;
	},
	
	/**
	 * Affichage d'un lien pour lancer/stopper le diaporama automatique
	 *
	 * @param bool returnResult Si 'true' le lien est retourne; sinon le lien est affiche dans la balise '.fancybox-autoplay'
	 * @return mixed Voir le parametre ci-dessus
	 */
	autoplay_displayLink: function(returnResult) {
		var result = '';
		
		if (WnG.config.gallery.lightbox.autoplay.running)
			result += '<a href="#" onclick="WnG.gallery.autoplay(); return false;" class="pictoPlay off"><span class="hideMe">' + WnG.config.gallery.lightbox.labels.autoplay_stop + '</span></a>';
		else
			result += '<a href="#" onclick="WnG.gallery.autoplay(); return false;" class="pictoPlay on"><span class="hideMe">' + WnG.config.gallery.lightbox.labels.autoplay_start + '</span></a>';
		
		if (returnResult)
			return result;
		
		$('.fancybox-autoplay').html(result);
	},
	
	/**
	 * Passer a l'image suivante dans le diaporama automatique
	 *
	 * @return void
	 */
	autoplay_changeImage: function() {
		if (WnG.config.gallery.lightbox.currentIndex == WnG.config.gallery.lightbox.totalIndex)
			$.fancybox.pos(0);
		else
			$.fancybox.next();
	},
	
	/**
	 * Genere une galerie avec les images de tt_content
	 *
	 * @param int id Identifiant de l'element de contenu stockant l'image
	 * @return void
	 */
	tt_content: function() {
		// Une seule galerie par page
		if (WnG.gallery.alreadySet)
			return;
		
		// Creation de la galerie
		var carousel = '.FCE.gallery ul';
		var links = '.FCE.gallery li a';
		
		// Creation de la galerie
		WnG.gallery.create(carousel, links);
		
		return;
	},
	
	/**
	 * Cree une galerie photos avec les images d'une news
	 *
	 * @return void
	 */
	tt_news: function() {
		// Une seule galerie par page
		if (WnG.gallery.alreadySet)
			return;
		
		// Creation de la galerie
		WnG.gallery.create('.news-single-gallery ul', '#contentMain .news-single-gallery a');
	}
};

/**
 * Systeme d'onglets
 * @var Object
 */
WnG.tabs = {
	/**
	 * Initialisation de l'affichage des onglets
	 */
	init: function() {
		// Activation de l'onglet actuel
		$('#contentMain .tabs .tabsMenu .' + WnG.config.tabs.current).parent().addClass('menuOn');
		
		for (var i = 0; i < WnG.config.tabs.list.length; i++) {
			// Cache le contenu des onglets non-actifs
			if (WnG.config.tabs.list[i] != WnG.config.tabs.current)
				$('#contentMain .tabs .tabsContent.' + WnG.config.tabs.list[i]).addClass('hideMe');
			
			// Si le nombre d'onglet est trop grand
			if ((i + 1) > WnG.config.tabs.maxTabs) {
				// Creation d'un conteneur pour les elements en trop
				if (!hasMore) {
					$('#contentMain .tabsMenu').append(
						$('<li></li>').addClass('tab_more').append(
							$('<a></a>')
								.attr('href', '#')
								.addClass('tab_more')
								.html('<span class="hideMe">+</span>&nbsp;')
						).append(
							$('<ul></ul>').addClass('hideMe').addClass('tabsMenu_more')
						).hover(WnG.tabs.more, WnG.tabs.more)
					);
				}
				
				// Reprise de l'onglet
				var temp_content = $('#contentMain .tabsMenu a.' + WnG.config.tabs.list[i]).parent().html();
				
				// Supression de l'onglet
				$('#contentMain .tabsMenu a.' + WnG.config.tabs.list[i]).remove();
				
				// Ajout de l'onglet au menu "more"
				$('#contentMain .tabsMenu ul.tabsMenu_more').append(
					$('<li></li>').append(temp_content)
				);
				
				var hasMore = true;
			}
		}
		
		// Ajout d'un evenement onclick sur les onglets
		$('#contentMain .tabs .tabsMenu a').click(function() {
			// Verification s'il s'agit du menu actif
			if ($(this).parent().hasClass('menuOn') || $(this).hasClass('tab_more'))
				return false;
			
			// Noms des onglets
			var oldTab = WnG.config.tabs.current;
			var newTab = $(this).attr('class');
			
			// Modification de l'affichage de l'ancien onglet
			$('#contentMain .tabs .tabsMenu .' + oldTab).parent().removeClass('menuOn');
			$('#contentMain .tabs .tabsContent.' + oldTab).addClass('hideMe');
			
			// Affichage de l'onglet choisi
			$(this).parent().addClass('menuOn');
			$('#contentMain .tabs .tabsContent.' + newTab).removeClass('hideMe');
			
			// Modification de l'onglet actif
			WnG.config.tabs.current = newTab;
			
			return false;
		});
	},
	
	/**
	 *
	 */
	more: function() {
		if ($('#contentMain .tabsMenu ul.tabsMenu_more').hasClass('hideMe')) {
			$('#contentMain .tabsMenu ul').removeClass('hideMe');
		} else {
			$('#contentMain .tabsMenu ul').addClass('hideMe');
		}
		
		return false;
	}
};

/**
 *
 */
WnG.actions = {
	/**
	 *
	 */
	init: function() {
		$('#contentMain .menuActions a').each(function() {
			$(this).hover(
				function() {
					$(this).addClass('hover');
				},
				function() {
					$(this).removeClass('hover');
				}
			);
		});
	}
};

/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

/*
 *
 *	jQuery Timer plugin v0.1
 *		Matt Schmidt [http://www.mattptr.net]
 *
 *	Licensed under the BSD License:
 *		http://mattptr.net/license/license.txt
 *
 */
 
jQuery.timer = function (interval, callback) {
	var interval = interval || 100;

	if (!callback)
		return false;
	
	_timer = function (interval, callback) {
		this.stop = function () {
			clearInterval(self.id);
		};
		
		this.internalCallback = function () {
			callback(self);
		};
		
		this.reset = function (val) {
			if (self.id)
				clearInterval(self.id);
			
			var val = val || 100;
			this.id = setInterval(this.internalCallback, val);
		};
		
		this.interval = interval;
		this.id = setInterval(this.internalCallback, this.interval);
		
		var self = this;
	};
	
	return new _timer(interval, callback);
 };
