﻿/////////////////////////////////////////////////////////////////////////////////
// Cossette base lib
/////////////////////////////////////////////////////////////////////////////////
var Cossette = Cossette || {
	globals: {},
	initiated: false,
	init: function(){
		var self = this;
		if(self.initiated || typeof jQuery == 'undefined')
			return;
		self.initiated = true;
	}
};

/*--- Cossette.Extensions (executes on load) ------*/
Cossette.Extensions = Cossette.Extensions || {};
Cossette.Extensions.Arrays = function(){
	if (typeof Array.prototype.indexOf == 'undefined'){
		Array.prototype.indexOf = function(obj) {
			for (var i = 0; i < this.length; i++)
				if (this[i] == obj) { return i; }
			return -1;
		};
	}
}();

Object.isArray = function(object){
	return (object != null && typeof object == 'object' && object.length != undefined);
};
String.isNullOrEmpty = function(string){
	return typeof string == 'undefined' || string === null || string === '';
};

/* Fields object
 * Utiliser pour storer les informations en/fr
------------------------------------------------------------------ */
Cossette.Fields = function(fields){
	var self = this;
	self._fields = fields || {};
};

Cossette.Fields.prototype.g =
Cossette.Fields.prototype.get = function(name, culture){
	var self = this;
	culture = culture || (Cossette.Context != undefined ? Cossette.Context.culture : 'fr');
	return typeof self._fields[name] == 'object'
			? self._fields[name][culture]
			: self._fields[name];
};

Cossette.Fields.prototype.s =
Cossette.Fields.prototype.set = function(name, value, culture){
	var self = this;
	culture = culture || (Cossette.Context != undefined ? Cossette.Context.culture : 'fr');
	if(typeof self._fields[name] == 'object'){
		self._fields[name][culture] = value;		
	}
	else 
		self._fields[name] = value;
};

Cossette.Fields.prototype.all = function() {
	var self = this;
	return self._fields;
};

/*--- Cossette.Keys (mapping of some keys' name with their value) ------*/
Cossette.Keys = {
	LEFT:37,
	UP:38,
	DOWN:40,
	RIGHT:39,
	ENTER:13,
	BACKSPACE:8
};

/*--- Cossette.Utility ------*/
Cossette.Utility = {
	parseDateAndTime: function(format, value){
		var d = $.datepicker.parseDate(format, value);
		var t = value.substr(value.indexOf('T') + 1);
		var h = new Number(t.substring(0,2));
		var m = new Number(t.substring(2,2));
		d.setHours(h);
		d.setMinutes(m);
		return d;
	},
	extend: function(){
		var results = {};
		for (var i=0, l=arguments.length; i < l; i++)
			for (var prop in arguments[i])
				results[prop] = arguments[i][prop];
		return results;
	},
	isArray: function(){
		return (typeof object == 'object' && object.length != undefined);
	},
	supportCSSProperty: function(propName, element) {
		element = element || document.documentElement;
		var prefixes = ['Moz', 'Webkit', 'Khtml', 'O', 'Ms'];
		var style = element.style,
				prefixed;

		// test standard property first
		if (typeof style[propName] == 'string') return true;

		// capitalize
		propName = propName.charAt(0).toUpperCase() + propName.slice(1);

		// test vendor specific properties
		for (var i=0, l=prefixes.length; i<l; i++) {
			prefixed = prefixes[i] + propName;
			if (typeof style[prefixed] == 'string') return true;
		}
		return false;
	}
};

/*--- Cossette.Config ------*/
Cossette.Config = {
	cultureParam: 'l',
	serviceURI: '',
	resourcesPath: 'resources/',
	assetsPath: 'assets/',
	dbName: 'Cossette',
	useDatabase:false
};

/*--- Cossette.Context ------*/
Cossette.Context = {
  culture: 'fr', /* en | fr */
	path: '', /* application path */
	UA: null, /* user agent components */
	isIOS: function(){
		var rx = /(iPad|iPhone)/i;
		return rx.test(navigator.platform);
	}
};

/*--- Cossette.Url ------*/
Cossette.Url = {
	location: function(uri, params) {
		document.location = this.uri(uri, params);
  },
	pathname: function(keepExtension){
		if (typeof keepExtension == 'undefined') 
			keepExtension = true;
		var p = location.pathname;
		var i, ei = -1;
		if((i = p.lastIndexOf('/')) > -1)
			p = p.substr(i + 1);
		if(!keepExtension)
			if((ei = p.lastIndexOf('.')) > -1)
				p = p.substr(0, ei);
		return p;
	},
	/* params: 'clear' pour vider les querystrings */
	uri: function(uri, params) {
		if (typeof (params) == 'undefined' || params == null)
			return uri;
		else {
			var urlparts = uri.split('?');
			if (typeof (params) == 'string' && params == 'clear')
				return urlparts[0];
			else if (urlparts.length > 1) {
				var kv = urlparts[1].split('&');
				var q = {};
				for (var p=0, l=kv.length; p<l; p++) {
					var t = kv[p].split('=');
					q[t[0]] = t[1];
				}
				return urlparts[0] + '?' + $.param($.extend(q, params));
			}
			else
				return urlparts[0] + '?' + $.param(params);
		}
	},
	encodeArray: function(array, sep){
		if(!array.length)
			return '';
		var q = '';
		if(typeof sep == 'undefined')
			sep = ';';
		for(var i=0, l=array.length; i<l; i++)
			q += array[i] + sep;
		return q;
	},
	params: function(name) {
		var urlparams = location.search;
		var params = null;
		var singleValue = typeof (name) != 'undefined';
		if (urlparams.length > 1) {
			params = {};
			urlparams = urlparams.substr(1);
			var kv = urlparams.split('&');
			for (var p in kv) {
				var t = kv[p].split('=');
				if (singleValue && t[0] == name) return t[1];
				else params[t[0]] = t[1];
			}
		}
		return singleValue ? null : params;
	},
	img: function(path){
		return Cossette.Context.path + Cossette.Config.resourcesPath + 'img/' + path;
	}
};

/////////////////////////////////////////////////////////////////////////////////
// Cossette Social (wrappers for some social plugins)
/////////////////////////////////////////////////////////////////////////////////
Cossette.Social = {};

/* Facebook
-------------------------------------------- */
Cossette.Social.Facebook = {
	onLogin: function(p) { },
	onLogout: function(p) { },
	onLike: function(p) { }
};

Cossette.Social.Facebook.init = function(parse){
	if(typeof parse == 'undefined')
		parse = false;
		
	FB.init({
		status: true, // check login status
		cookie: true, // enable cookies to allow the server to access the session
		xfbml: parse	// parse XFBML
	});
	
	FB.Event.subscribe('edge.create', Cossette.Social.Facebook.onLike);
};

Cossette.Social.Facebook.load = function(parseOnLoad, callback){
	
	var root = document.getElementById('fb-root');
	if(!root){
		root = document.createElement('div');
		root.id = 'fb-root';
		document.body.appendChild(root);
	}
	
	var e = document.createElement('script');
	e.async = true;
	e.src = document.location.protocol + '//connect.facebook.net/' + (Cossette.Context.culture == 'en' ? 'en_US' : 'fr_CA') + '/all.js#xfbml=1';
	document.getElementById('fb-root').appendChild(e);
	
	window.fbAsyncInit = function() { 
		Cossette.Social.Facebook.init(false); 
		if(typeof callback == 'function')
			callback();
	};
};

Cossette.Social.Facebook.parse = function(domElement){
	var self = this;
	
	var element = typeof domElement == 'undefined'
		 ? document.body
		 : typeof domElement == 'string'
			? document.getElementById(domElement)
			: domElement;
			
	var cb = function(){
		if(Cossette.Utility.isArray(element))
			for(var i in element)
				FB.XFBML.parse(element[i]);
		else
			FB.XFBML.parse(element);
	};
	
	if(typeof FB == 'undefined')
		Cossette.Social.Facebook.load(false, cb);
	else
		cb();
};

Cossette.Social.Facebook.LikeButton = function(domElement){
		throw 'todo';
};

/* Twitter
-------------------------------------------- */
Cossette.Social.Twitter = {};
Cossette.Social.Twitter.TweetButton = function(selector, params){
	if(typeof selector == 'string')
		selector = $(selector);
	
	var opts = Cossette.Utility.extend(Cossette.Social.Twitter.TweetButton.DefaultsOptions, params);
	
	if(opts.culture == '')
		opts.culture = Cossette.Context.culture;
	
	selector.attr({
		'href': 'http://twitter.com/share',
		'class': 'twitter-share-button',
		'data-count': opts.type,
		'data-lang': opts.culture
	}).text('Tweet');
	
	if(opts.tweetText != '')
		selector.attr({'data-text': opts.tweetText});
	if(opts.tweetUrl != '')
		selector.attr({'data-url': opts.tweetUrl});
	
	if(typeof window.twttr != 'object'){
		var e = document.createElement('script');
		e.src = 'http://platform.twitter.com/widgets.js';
		document.body.appendChild(e);
	}
	
};

Cossette.Social.Twitter.TweetButton.Type = {
	VERTICAL:'vertical', /* 65px x 62px */ 
	HORIZONTAL:'horizontal', /* 110px x 20px */
	NO_COUNT:'none' /* 65px x 20px */
};

Cossette.Social.Twitter.TweetButton.DefaultsOptions = {
	type: Cossette.Social.Twitter.TweetButton.Type.NO_COUNT,
	tweetText:'',
	tweetUrl:'',
	culture:'',
	mentionedAccount: '',
	relatedAccount:'',
	relatedAccountDescription:''
};

/* Vimeo
-------------------------------------------- */
Cossette.Social.Vimeo = {
	playerUrl: 'http://player.vimeo.com/video/'
};
Cossette.Social.Vimeo.API = {};
Cossette.Social.Vimeo.API.OEmbed = {
	videoUrl: function(format, videoUrl) {
		return 'http://vimeo.com/api/oembed.' + format + '?url=' + encodeURIComponent(videoUrl);
	},
	getVideoByUrl: function(args, callback) {
		var opts = { videoUrl: '', format: 'json', width: '' };
		opts = $.extend(opts, args);
		// Tell Vimeo what function to call
		var callbackName = 'Vimeo_OEmbedAPI_' + opts.videoUrl.substr(opts.videoUrl.lastIndexOf('/') + 1) + '_' + (new Date()).getTime();
		window[callbackName] = callback;
		// Put together the URL
		var url = this.videoUrl(opts.format, opts.videoUrl) + '&js_api=1&callback=' + callbackName + (opts.width != '' ? '&width=' + opts.width : '');
		var js = document.createElement('script');
		js.setAttribute('type', 'text/javascript');
		js.setAttribute('src', url);
		document.getElementsByTagName('head').item(0).appendChild(js);
	}
};

/* Youtube
-------------------------------------------- */
Cossette.Social.Youtube = {};

Cossette.Social.Youtube.API = {};

Cossette.Social.Youtube.API.load = function(callback){
	if(!('YT' in document)){
		var tag = document.createElement('script');
      tag.src = "http://www.youtube.com/player_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
	
		window.onYouTubePlayerAPIReady = function(event) {
		  if (typeof callback == 'function')
				callback();
		}
	
	} else if(typeof callback == 'function'){
		callback();
	}
		
};

Cossette.Social.Youtube.Player = function(opts){
	var self = this;
	
	self.opts = $.extend({}, Cossette.Social.Youtube.Player.DefaultOptions, opts);
	self.player = null;
	self.playerStartedOnce = false;
	Cossette.Social.Youtube.API.load(function(){
		self._render();
	});
};

Cossette.Social.Youtube.Player.DefaultOptions = {
	node: null,
	height: '390',
	width: '640',
	videoId: null,
	events: {}
};

Cossette.Social.Youtube.Player.prototype._render = function(){
	var self = this;
	self.player = new YT.Player(self.opts.node, {
		'height': self.opts.height,
		'width': self.opts.width,
		'videoId': self.opts.videoId,
		'events': {
			'onStateChange': function(event){
				if(event.data == YT.PlayerState.PLAYING)
					self.onPlay(event);
				else if (event.data == YT.PlayerState.ENDED)
					self.onEnd(event);
				else if (event.data == YT.PlayerState.PAUSED && self.playerStartedOnce)
					self.onPause(event);
				else if (event.data == YT.PlayerState.BUFFERING)
					self.onBuffering(event);
				//else if (event.data == YT.PlayerState.CUED)
				//self.onCued(event);
			}
		}
	});
};

Cossette.Social.Youtube.Player.prototype.onPlay = function(){
	var self = this;
	self.playerStartedOnce = true;
	if(typeof self.opts.events.onPlay == 'function')
		self.opts.events.onPlay();
};

Cossette.Social.Youtube.Player.prototype.onEnd = function(){
	var self = this;
	if(typeof self.opts.events.onEnd == 'function')
		self.opts.events.onEnd();
};

Cossette.Social.Youtube.Player.prototype.onBuffering = function(){
	var self = this;
	if(typeof self.opts.events.onBuffering == 'function')
		self.opts.events.onBuffering();
};

Cossette.Social.Youtube.Player.prototype.onPause = function(){
	var self = this;
	if(typeof self.opts.events.onPause == 'function')
		self.opts.events.onPause();
};

/////////////////////////////////////////////////////////////////////////////////
// K7 Tracking
/////////////////////////////////////////////////////////////////////////////////
var K7 = K7 || {};
K7.Tracking = {};
K7.GA =
K7.Tracking.GoogleAnalytics = {	
	METHOD: { PAGEVIEW: '_trackPageview', EVENT: '_trackEvent', LINK: '_link', CUSTOMVAR: '_setCustomVar' },
	_tracker: undefined,
	enabled: false,
	log: false,
	alert: false,
	config: { async:true },
	init: function(uaccount, extraVars, trackDefaultPageview){
		var self = K7.GA;

		if(self.config.async && typeof window._gaq == 'undefined'){
			if(typeof uaccount == 'undefined')
				throw "Google Analytics UA undefined";
				
			// initial push
			window._gaq = window._gaq || [];
			window._gaq.push(['_setAccount', uaccount]);
			if(Object.isArray(extraVars))
				for(var i = 0; i < extraVars.length; i++)
					window._gaq.push(extraVars[i]);
			
			if(trackDefaultPageview)
				window._gaq.push(['_trackPageview']);

		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

		} else if(!self.config.async && typeof window._gat == 'undefined'){
			throw 'Not yet implemented.';
		}

		self._tracker = self.config.async
			? window._gaq : window._gat._createTracker(uaccount);
	},
	
	/*
		when method == METHOD.PAGEVIEW, no params are required
		when method == METHOD.EVENT, params should be an array with the following indexes :
		[0] = category (required)
			The name you supply for the group of objects you want to track.
		[1] = action (required)
			A string that is uniquely paired with each category, and commonly used to define the type of user interaction for the web object.
		[2] = label (optional)
			An optional string to provide additional dimensions to the event data.
		[3] = value (optional)
			An integer that you can use to provide numerical data about the user event.

		more details : http://code.google.com/intl/en/apis/analytics/docs/tracking/eventTrackerGuide.html
	*/
	track: function(method, params){
		var self = K7.GA;
		
		if(typeof self._tracker.q == 'undefined')
			self._tracker = window._gaq;
		
		var action = typeof method != 'string'
			? self.METHOD.PAGEVIEW : method;
		var opts = typeof params == 'undefined' 
			? method : params;
		
		var pusharray = [action];
		for (var i = 0; i < opts.length; i++)
			pusharray.push(opts[i]);
		
		if(self.log && typeof console != 'undefined')
			console.log('will track method : ', action, ' with options : ', opts);
		else if(self.log || self.alert)
			alert('will track method : ' + action + ' with options : ' + opts);

		if(self.enabled && typeof self._tracker == 'object'){
			if(!self.config.async) self._tracker[action](opts); 
			else self._tracker.push(pusharray);
		}
	},

	link: function(link){
		this.track(K7.GA.METHOD.LINK, typeof link == 'string' ? link : link.href);
		return false;
	},

	pageview: function(){
		this.track(K7.GA.METHOD.PAGEVIEW, arguments);
	},

	event: function(){
		this.track(K7.GA.METHOD.EVENT, arguments);
	}
};
