/*

	[ site.js ]

	1. Initial Construct
		1.0. Font Replacement
		1.1. Apply Equal Heights
		1.2. IE6 Alpha Transparency
		1.3. Form Validation Statement
	2. Form Validation
		2.0. Comments
		2.1. Newsletter
		2.2. Team Signup
		2.3. Sponsorship
	3. Functions
		3.0. Google Analytics
		3.1. Spamless Email
	4. Plugins
		4.0. EqualHeights
		4.1. iFixPNG

*/

var Site = {

/* ############################################
   1. Initial Construct
   ############################################ */

	start: function(){

   /* 1.0. Font Replacement #################### */

		Cufon.set('fontFamily', 'FrizQuadrata');
		Cufon('h1')('h2')('#subnavigation a', { hover: true });


   /* 1.1. Apply Equal Heights ################# */

		// buggy in IE6 when validating forms
		if ( $('.col-left').length ) $('#container').equalHeights(true);


   /* 1.2. IE6 Alpha Transparency ############## */

		/* For IE6 or older, PNG transparency support */
		$('input.submit, a.button').ifixpng();
		$('img.badge1, img.badge2, img.badge3').ifixpng();


   /* 1.3. Form Validation Statement ########### */

		if ( $('form').length ) Site.formValidation();

	},

/* ############################################
   2. Form Validation
   ############################################ */

	formValidation: function(){

		$.getScript('assets/scripts/jquery.validate.js', function(){
			$.validator.setDefaults({
				//submitHandler: function() { alert("submitted!"); }
				onfocusout: false,
				errorPlacement: function(error, element) {
					if (element.is(':radio'))
						error.appendTo(element.parent().parent());
					else if ( element.is(':hidden') )
						element.after(error);
					else
						error.appendTo(element.parent());
				}
			});


   /* 2.0. Comments ############################ */

			if ( $('form#comments').length ) {

				$('form#comments').validate({
					rules: {
						name: 'required',
						email: {
							required: true,
							email: true
						},
						comment: 'required'
					},
					messages: {
						name: 'Ce champ est obligatoire.',
						email: {
							required: 'Ce champ est obligatoire.',
							email: "S'il vous pla&icirc;t entrer un courriel valide."
						},
						comment: 'Ce champ est obligatoire.'
					}
				});

			} /* form#comments */


   /* 2.0. Voting ############################## */

			if ( $('form#vote').length ) {

				$('form#vote').validate({
					rules: {
						email: {
							required: true,
							email: true
						}
					},
					messages: {
						email: {
							required: 'Ce champ est obligatoire.',
							email: "S'il vous pla&icirc;t entrer un courriel valide."
						}
					}
				});

			} /* form#vote */


   /* 2.1. Newsletter ########################## */

			if ( $('form#newsletter').length ) {

				$('form#newsletter').validate({
					rules: {
						name: 'required',
						gender: 'required',
						region: 'required',
						email: {
							required: true,
							email: true
						}/*,
						postal: {
							postCA: true
						}*/
					},
					messages: {
						name: 'Ce champ est obligatoire.',
						gender: 'Ce champ est obligatoire.',
						region: 'Ce champ est obligatoire.',
						email: {
							required: 'Ce champ est obligatoire.',
							email: "S'il vous pla&icirc;t entrer un courriel valide."
						}/*,
						postal: {
							postCA: "Votre code postal doit &ecirc;tre dans le format de X#X #X#."
						}*/
					}
				});

			} /* form#newsletter */


   /* 2.2. Team Signup ######################### */

			if ( $('form#signup').length ) {

				// Team must have at least one woman
				function checkForWomen() {
					f = 0;
					$('input:radio').each(function(){
						if ( $(this).filter(':checked').val() == 'f' ) { f++; }
					});
					if (f > 0) $('input#female').val('true'); else $('input#female').val('false');
				}
				checkForWomen();

				$('form#signup').validate({
					rules: {
						female: { equal: 'true' },
						name: 'required',/*
 						photo: {
 							required: true,
 							accept: 'png|jpe?g|gif'
 						},*/
// 						description: 'required',
						leader: 'required',
						leader_gender: 'required',
						email: {
							required: true,
							email: true
						},
						phone: {
							required: true,
							phone: true
						},
						camping: 'required',
						member2: 'required',
						member2_gender: 'required',
						member3: 'required',
						member3_gender: 'required',
						member4: 'required',
						member4_gender: 'required',
						adults: 'required'
					},
					messages: {
						female: 'Votre equipe doit comporter au moins une femme.',
						name: 'Veuillez svp entrer le nom de votre &eacute;quipe.',/*
 						photo: {
 							required: 'Ce champ est obligatoire.',
 							accept: 'Veuillez svp entrer une photo de votre &eacute;quipe (*.jpg, *.jpeg, *.gif, *.png).'
 						},*/
// 						description: 'Veuillez svp entrer une description.',
						leader: 'Veuillez svp entrer le nom de la personne responsable.',
						leader_gender: 'Veuillez svp entrer le sexe du responsable.',
						email: {
							required: 'Ce champ est obligatoire.',
							email: "S'il vous pla&icirc;t entrer un courriel valide."
						},
						phone: {
							required: 'Ce champ est obligatoire.',
							phone: "S'il vous pla&icirc;t sp&eacute;cifier un num&eacute;ro de t&eacute;l&eacute;phone valide (ex. (789)-555-1234)."
						},
						camping: 'Veuillez svp choisir votre camping.',
						member2: 'Veuillez svp entrer le nom du membre #2.',
						member2_gender: 'Veuillez svp entrer le sexe du membre #2.',
						member3: 'Veuillez svp entrer le nom du membre #3.',
						member3_gender: 'Veuillez svp entrer le sexe du membre #3.',
						member4: 'Veuillez svp entrer le nom du membre #4.',
						member4_gender: 'Veuillez svp entrer le sexe du membre #4.',
						adults: 'Tous les membres de l\'&eacute;quipe doivent avoir 18 ans ou plus'
					}
				});

				// Team must have at least one woman
				$('label.radio').click(function() {
					checkForWomen();
				});

			} /* form#signup */


   /* 2.3. Sponsorship ######################### */

			if ( $('form#sponsorship').length ) {

				$('form#sponsorship').validate({
					rules: {
						name: 'required',
						description: 'required',
						dates: {
							required: true/*,
							date: true*/
						},
						responsable: 'required',
						hours: 'required',
						people: {
							required: true,
							digits: true,
							min: 1
						},
						profile: 'required',
						email: {
							required: true,
							email: true
						},
						phone: {
							required: true,
							phone: true
						},
						location: 'required',
						url: {
							url: true
						},
						exclusivity: 'required',
						permit: 'required'
					},
					messages: {
						name: 'Ce champ est obligatoire.',
						description: 'Ce champ est obligatoire.',
						dates: {
							required: 'Ce champ est obligatoire.'/*,
							date: "S'il vous pla&icirc;t entrer une date valide (ex. 30/30/2008)."*/
						},
						responsable: 'Ce champ est obligatoire.',
						hours: 'Ce champ est obligatoire.',
						people: {
							required: 'Ce champ est obligatoire.',
							digits: "S'il vous pla&icirc;t entrer uniquement des chiffres.",
							min: "S'il vous pla&icirc;t entrer une valeur sup&eacute;rieure &agrave; 1."
						},
						profile: 'Ce champ est obligatoire.',
						email: {
							required: 'Ce champ est obligatoire.',
							email: "S'il vous pla&icirc;t entrer un courriel valide."
						},
						phone: {
							required: 'Ce champ est obligatoire.',
							phone: "S'il vous pla&icirc;t sp&eacute;cifier un num&eacute;ro de t&eacute;l&eacute;phone valide (ex. (789)-555-1234)."
						},
						location: 'Ce champ est obligatoire.',
						url: {
							url: "S'il vous pla&icirc;t entrer une URL valide."
						},
						exclusivity: 'Ce champ est obligatoire.',
						permit: 'Ce champ est obligatoire.'
					}
				});

			} /* form#signup */

		});

	}

/* ############################################# */

}

/* ############################################
   3. Functions
   ############################################ */

   /* 3.0. Google Analytics ################### */

	function googleAnalytics() {
		var gaJsHost = (('https:' == document.location.protocol) ? 'https://ssl.' : 'http://www.');
		$.getScript(gaJsHost + 'google-analytics.com/ga.js', function(){
			var pageTracker = _gat._getTracker(''); // Insert GA Code
				pageTracker._initData();
				pageTracker._trackPageview();
		});
	}

   /* 3.1. Spamless Email ##################### */

	function noSpam(user) {
		var mail = 'mailto:' + user + '@taiga.com';
		window.location.href = mail;
	}

/* ############################################# */

/* ############################################
   4. Plugins
   ############################################ */

(function($) {

   /* 4.0. EqualHeights ########################
    * by Scott Jehl, Todd Parker, Maggie Costello Wachs (http://www.filamentgroup.com)
    */

	$.fn.equalHeights = function(px) {
		$(this).each(function(){
			var tallest = 0;
			var currentTallest = 0;
			$(this).children('.content').each(function(i){
				if ($(this).height() > currentTallest) {
					tallest = this;
					currentTallest = $(this).height();
				}
			});
			if (!px) currentTallest = currentTallest.pxToEm(); //use ems unless px is specified
			// for ie6, set height since min-height isn't supported
			if ($.browser.msie && $.browser.version == 6.0) {
				$(this).children('.content').not(tallest).css({ 'height' : currentTallest });
				$(this).children(tallest).css({ 'height' : 'auto' });
			}
			$(this).children('.content').css({ 'min-height' : currentTallest }); 
		});
		return this;
	};

/* ############################################# */

   /* 4.1. iFixPNG #############################
    * by Kush M. (http://jquery.khurshid.com)
    */

	/**
	 * helper variables and function
	 */
	$.ifixpng = function(customPixel) {
		$.ifixpng.pixel = customPixel;
	};
	
	$.ifixpng.getPixel = function() {
		return $.ifixpng.pixel || 'assets/images/pixel.gif';
	};
	
	var hack = {
		ltie7  : $.browser.msie && $.browser.version < 7,
		filter : function(src) {
			return "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='"+src+"')";
		}
	};
	
	/**
	 * Applies ie png hack to selected dom elements
	 *
	 * $('img[@src$=.png]').ifixpng();
	 * @desc apply hack to all images with png extensions
	 *
	 * $('#panel, img[@src$=.png]').ifixpng();
	 * @desc apply hack to element #panel and all images with png extensions
	 *
	 * @name ifixpng
	 */
	 
	$.fn.ifixpng = hack.ltie7 ? function() {
		return this.each(function() {
			var $$ = $(this);
			// in case rewriting urls
			var base = $('base').attr('href');
			if (base) {
				// remove anything after the last '/'
				base = base.replace(/\/[^\/]+$/,'/');
			}
			if ($$.is('img') || $$.is('input:image')) { // hack image tags present in dom
				if ($$.attr('src')) {
					if ($$.attr('src').match(/.*\.png([?].*)?$/i)) { // make sure it is png image
						// use source tag value if set 
						var source = (base && $$.attr('src').search(/^(\/|http:)/i)) ? base + $$.attr('src') : $$.attr('src');
						// apply filter
						$$.css({filter:hack.filter(source), width:$$.width(), height:$$.height()})
						  .attr({src:$.ifixpng.getPixel()})
						  .positionFix();
					}
				}
			} else { // hack png css properties present inside css
				var image = $$.css('backgroundImage');
				if (image.match(/^url\(["']?(.*\.png([?].*)?)["']?\)$/i)) {
					image = RegExp.$1;
					image = (base && image.substring(0,1)!='/') ? base + image : image;
					$$.css({backgroundImage:'none', filter:hack.filter(image)})
					  .children()
					  .children()
					  .positionFix();
				}
			}
		});
	} : function() { return this; };
	
	/**
	 * Removes any png hack that may have been applied previously
	 *
	 * $('img[@src$=.png]').iunfixpng();
	 * @desc revert hack on all images with png extensions
	 *
	 * $('#panel, img[@src$=.png]').iunfixpng();
	 * @desc revert hack on element #panel and all images with png extensions
	 *
	 * @name iunfixpng
	 */
	 
	$.fn.iunfixpng = hack.ltie7 ? function() {
		return this.each(function() {
			var $$ = $(this);
			var src = $$.css('filter');
			if (src.match(/src=["']?(.*\.png([?].*)?)["']?/i)) { // get img source from filter
				src = RegExp.$1;
				if ($$.is('img') || $$.is('input')) {
					$$.attr({src:src}).css({filter:''});
				} else {
					$$.css({filter:'', background:'url('+src+')'});
				}
			}
		});
	} : function() { return this; };
	
	/**
	 * positions selected item relatively
	 */
	 
	$.fn.positionFix = function() {
		return this.each(function() {
			var $$ = $(this);
			var position = $$.css('position');
			if (position != 'absolute' && position != 'relative') {
				$$.css({position:'relative'});
			}
		});
	};

})(jQuery);

/* ############################################# */

$(document).ready(function(){
	//googleAnalytics();

	Site.start();
});

/* Code is poetry */