/**
 * @author sjoubert
 */

(function($){  
   
	$.fn.extend({   
           
		qr: function (options) {

			// Options par défaut
			var defaults = {
				qr : '',					// nom de la qr
				params : '',				// paramètres de la qr
				callback : null,			// nom de la méthode à appeler après l'exécution de la qr
				callback_params: null		// paramètres de la méthode à appeler après l'exécution de la qr
			};

			// Utilisation des options si elles existent
			var options =  $.extend(defaults, options);

			this.each(function() {
				// Parcours de tous les noeuds sur lesquels la qr est appelée

				// Appel de la qr avec les paramètres en entrée
				if (options.qr) {
					var xml = $.ajax({
							url: 'http://www.theoffspringsession.com/asynchronous/qr-' + options.qr + '.php5',
							type: 'GET',
							data:  options.params ? options.params : '',
							dataType: 'xml',
							async: false
						}).responseXML;

					// Traitement des résultats
					return traiter(this, xml, options);
				}
				else {
					return qr.prototype.notifier('failed', 'Bad qr name...');
				}
			});



			function traiter (object, xml, options) {

				// Récupération des résultats de la qr
				var retour 	= xml && $(xml).find('retour:first').length > 0 ? $(xml).find('retour:first').text() : 'bad_qr_construction';
				var message = xml && $(xml).find('message:first').length > 0 ? $(xml).find('message:first').text() : 'bad_qr_construction';

				// Gestion du code retour
				if (retour == '000') {
					// La qr s'est exécutée correctement

					switch (object.type) {
						// Mise à jour des données en fonction du type du noeud

						case 'select-one':
							// On cache la combo à mettre à jour
							$(object).fadeOut('fast', function() {

								// On supprime les éléments déjà présents dans la combo
								$(this).html('');

								// Récupération des données de la combobox
								var combo =  $(xml).find('combobox:first');

								// Options de la combo
								var collection = $(combo).find('collection:first').children();

								for (var i = 0 ; i < collection.length ; i++) {

									// Récupération de  l'élément en cours
									var element = $(collection[i]);

									// Ajout de l'élément dans la combo
									$(this).append(new Option(element.text(), element.attr('value')));
								}

								// On affiche la combo mise  à jour
								$(this).fadeIn('normal');
							});
							break;

						case 'text':
						case 'textarea':
							$(object).val( $(xml).find('libelle:first').text() );
							break;

						default:
							// Type non reconnu, on ne fait rien, on attend la méthode callback
							break;
					}

					if (options.callback) {
						// Appel de la méthode de callback
						return options.callback_params ? options.callback(xml, options.callback_params) : options.callback(xml);
					}
					else {
						// On appelle pas de méthode
						return this;
					}
				}
				else {
					// La qr a renvoyé une anomalie
					// Notification utilisateur
					return qr.prototype.notifier('failed', message);
				}
			}



         }
     });  
       
})(jQuery);
function qr() {}

qr.prototype.notifier = function(css, message, callback) {

	// Création du calque de notification
	$('body').prepend($('<div class="wrapper_notification" onClick="javascript: $(\'.wrapper_notification\').remove();"></div>'));

	// Ajout du message dans le wrapper
	$('.wrapper_notification').html(message);

	// Ajout de la classe css de message d'erreur
	$('.wrapper_notification').addClass(css);

	// Ajustement de la notification sur toute la largeur de l'écran
	$('.wrapper_notification').width('99.9%');

	// Affichage de la notification
	$('.wrapper_notification').fadeIn('normal', function() {
		$('.wrapper_notification').animate({ opacity: 1 }, 2500, '', function() {
			$('.wrapper_notification').fadeOut('slow', function() {
				// Suppression du calque de notification
				$('.wrapper_notification').remove();
				if (callback) {
					// Si une fonction doit être appelée à la fin de la notification
					return callback();
				}
			});
		});
	});

	return this;
}
