/*
 - Description
	Plugin for jQuery. Populate html with a json data source.
 - Author
	Alexandre Caprais
 - Licence
	GNU Lesser General Public License
*/
jQuery.fn.fill = function(obj, options) {
	function browseJSON(obj, element) {
		// no object
		if(obj == undefined) {
		}
		// branch
		else if (obj.constructor == Object) {
			for(var prop in obj){
				var child = jQuery("."+prop, element).length > 0 ? jQuery("."+prop, element) : jQuery("#"+prop, element);
				browseJSON(obj[prop], child);
			}
		}
		// array
		else if(obj.constructor == Array) {
			//get a copy of last element to duplicate it later
			var original = $(element).eq($(element).length -1).clone();
			//use html elements which already exists
			var JsonField = 0;
			for(iExist = 0; iExist < $(element).length; iExist++) {
				JsonField < obj.length ? $(element).eq(iExist).fill(obj[JsonField]) : $(element).eq(iExist).remove();
				JsonField++;
			}
			
			if(obj.length - $(element).length > 0) {
				//create new html elements with original and sort fill by last
				JsonField = obj.length - 1;
				for(iCreate = 0; iCreate < obj.length - $(element).length; iCreate++) {
					original.clone().insertAfter($(element).eq($(element).length-1)).fill(obj[JsonField]);
					JsonField--;
				}
			}
		}
		// data only
		else {
			$(element).html(obj);
		}
	}
	
	this.each(function() {
		browseJSON(obj, this);
	});
return this;
}


/*
 - Description
	Plugin for jQuery. Populate html with a json data source.
 - Author
	Alexandre Caprais
 - Licence
	GNU Lesser General Public License
*/
jQuery.fn.fill = function(obj, options) {
	function browseJSON(obj, element) {
		// no object
		if(obj == undefined) {
		}
		// branch
		else if (obj.constructor == Object) {
			for(var prop in obj){
				var child = jQuery("."+prop, element).length > 0 ? jQuery("."+prop, element) : jQuery("#"+prop, element);
				browseJSON(obj[prop], child);
			}
		}
		// array
		else if(obj.constructor == Array) {
			//get a copy of last element to duplicate it later
			var original = $(element).eq($(element).length -1).clone();
			//use html elements which already exists
			var JsonField = 0;
			for(iExist = 0; iExist < $(element).length; iExist++) {
				JsonField < obj.length ? $(element).eq(iExist).fill(obj[JsonField]) : $(element).eq(iExist).remove();
				JsonField++;
			}
			
			if(obj.length - $(element).length > 0) {
				//create new html elements with original and sort fill by last
				JsonField = obj.length - 1;
				for(iCreate = 0; iCreate < obj.length - $(element).length; iCreate++) {
					original.clone().insertAfter($(element).eq($(element).length-1)).fill(obj[JsonField]);
					JsonField--;
				}
			}
		}
		// data only
		else {
			$(element).html(obj);
		}
	}
	
	this.each(function() {
		browseJSON(obj, this);
	});
return this;
}


/*
 - Description
 	Plugin for jQuery. Populate html with a json data source.
 - Author
 	Alexandre Caprais
 - Licence
 	GNU Lesser General Public License
*/

jQuery.fn.fill = function(obj, options) {
	function browseJSON(obj, element) {
		// prepare
		var path = path || '';
		// no object
		if(obj == undefined) {
		}
		// branch
		else if (obj.constructor == Object) {
			for(var prop in obj){
				var child = jQuery.makeArray(jQuery("."+prop, element)).length > 0 ? jQuery("."+prop, element) : jQuery("#"+prop, element);
				browseJSON(obj[prop], jQuery(child, element));
			}
		}
		// array
		else if(obj.constructor == Array) {
			var arr = jQuery.makeArray(element);
			//how many duplicate
			var nbToCreate = obj.length - arr.length;
			var i = 0;
			for(var iExist = 0; iExist < arr.length; iExist++) {
				if(i < obj.length) {
					$(element).eq(iExist).fill(obj[i]);
				}
				i++;
			}
			//fill started by last
			i = obj.length - 1;
			for(var iCreate = 0; iCreate < nbToCreate; iCreate++) {
				//duplicate the last
				$(arr[arr.length - 1]).clone(true).insertAfter(arr[arr.length - 1]).fill(obj[i]);
				i--;
			}
      // remove extra elements
      var i=0;
      $(arr[arr.length - 1]).parent().children().each(function(){
        if(i>=obj.length){
          $(this).remove();
        }
        i++;
      });
		}
		// data only
		else {
			$(element).html(obj);
		}
	}
	
	this.each(function() {
		browseJSON(obj, this);
	});
return this;
}
/*
 - Description
 	Plugin for jQuery. Populate html with a json data source.
 - Author
 	Alexandre Caprais
 - Licence
 	GNU Lesser General Public License
*/

jQuery.fn.fill = function(obj, options) {
	function browseJSON(obj, element) {
		// prepare
		var path = path || '';
		// no object
		if(obj == undefined) {
		}
		// branch
		else if (obj.constructor == Object) {
			for(var prop in obj){
				var child = jQuery.makeArray(jQuery("."+prop, element)).length > 0 ? jQuery("."+prop, element) : jQuery("#"+prop, element);
				browseJSON(obj[prop], jQuery(child, element));
			}
		}
		// array
		else if(obj.constructor == Array) {
			var arr = jQuery.makeArray(element);
      var classList = $(arr[0]).attr('class');
      var weakFilter = '';
      if (typeof classList != 'undefined')
      {
        weakFilter = String(classList).replace(/ /g,'.');
        if (weakFilter[0] != '.')
          weakFilter = '.' + weakFilter;
      }

			//how many duplicate
			var nbToCreate = obj.length - arr.length;
			var i = 0;
			for(var iExist = 0; iExist < arr.length; iExist++) {
				if(i < obj.length) {
					$(element).eq(iExist).fill(obj[i]);
				}
				i++;
			}
			//fill started by last
			i = obj.length - 1;
			for(var iCreate = 0; iCreate < nbToCreate; iCreate++) {
				//duplicate the last
				$(arr[arr.length - 1]).clone(true).insertAfter(arr[arr.length - 1]).fill(obj[i]);
				i--;
			}
      // remove extra elements
      var i=0;
      $(arr[arr.length - 1]).parent().children().filter(weakFilter).each(function(){
        if(i>=obj.length){
          $(this).remove();
        }
        i++;
      });
		}
		// data only
		else {
			$(element).html(obj);
		}
	}
	
	this.each(function() {
		browseJSON(obj, this);
	});
return this;
}
