/*—~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ T O O L   F U N C T I O N.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ J Q U E R Y.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	//~~~~~~~~~~~~~ JQUERY-UI DATE/TIME PICKER — FRENCH TRANSLATION.
	jQuery(function($) {
		if (jQuery.ui) {
			// Date.
			$.datepicker.regional['fr'] = {
				closeText: 'Fermer',
				prevText: '&#x3c;Préc',
				nextText: 'Suiv&#x3e;',
				currentText: 'Maintenant',
				monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
				monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],
				dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
				dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
				dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
				dateFormat: 'dd/mm/yy', firstDay: 1,
				isRTL: false			
			};
			$.datepicker.setDefaults($.datepicker.regional['fr']);
			$.datepicker.setDefaults({dateFormat: 'yy-mm-dd'});
			// Time.
			$.timepicker.regional['fr'] = {
				timeOnlyTitle: 'Choisissez l’heure',
				timeText: 'Horaire',
				hourText: 'Heures',
				minuteText: 'Minutes',
				secondText: 'Secondes',
				currentText: 'Maintenant',
				closeText: 'Fermer',
				ampm: false
			};
			$.timepicker.setDefaults($.timepicker.regional['fr']);
			$.timepicker.setDefaults({timeFormat: 'hh:mm:ss'});
		}
	});

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — FIND TEXT NODES.
	(function($) {
		$.fn.textNodes = function() {
			var ret = [];
			this.each(function() {
				var fn = arguments.callee;
				$(this).contents().each(function() {
					if ( this.nodeType == 3)
						ret.push(this);
					else
						fn.apply($(this))
				});
			});
			return $(ret);
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — FORM TO OBJECT.
	(function($) {
		$.fn.serializeObject = function() {
			var o = {};
			var a = this.serializeArray();
			$.each(a, function() {
				if (o[this.name]) {
					if (!o[this.name].push) {
						o[this.name] = [o[this.name]];
					}
					o[this.name].push(this.value || '');
				} else {
					o[this.name] = this.value || '';
				}
			});
			return o;
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — EQUALIZE ELEMENTS HEIGHTS.
	(function ($) {
		$.fn.equalHeight = function() {
			var height = 0,
			highest = 0,
			reset = $.browser.msie ? '1%' : 'auto';
			return this.css('height', reset).each(function() {
				height = Math.max(height, this.offsetHeight);
				if (height > highest)  highest = height;
			}).css('height', height).each(function() {
				var h = this.offsetHeight;
				if (h > height)  $(this).css('height', height-(h-height));
			});
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — EQUALIZE CHILDREN HEIGHTS.
	(function($) {
		$.fn.equalHeightChildren = function(px) {
			$(this).each(function() {
				var currentTallest = 0;
				$(this).children().each(function(i) {
					if ($(this).height() > currentTallest)  currentTallest = $(this).height();
				});
				if (!px || !Number.prototype.pxToEm) currentTallest = currentTallest.pxToEm();
				if ($.browser.msie && $.browser.version == 6.0)  $(this).children().css({'height': currentTallest});
				$(this).children().css({'min-height': currentTallest}); 
			});
			return this;
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — ELEMENTS SMALLEST/BIGGEST.
	(function($) {
		$.fn.tallest = function()       { return this._extremities({aspect:'height', max:true })[0] };
		$.fn.tallestSize = function()   { return this._extremities({aspect:'height', max:true })[1] };
		$.fn.shortest = function()      { return this._extremities({aspect:'height', max:false})[0] };
		$.fn.shortestSize = function()  { return this._extremities({aspect:'height', max:false})[1] };
		$.fn.widest = function()        { return this._extremities({aspect:'width',  max:true })[0] };
		$.fn.widestSize = function()    { return this._extremities({aspect:'width',  max:true })[1] };
		$.fn.thinnest = function()      { return this._extremities({aspect:'width',  max:false})[0] };
		$.fn.thinnestSize = function()  { return this._extremities({aspect:'width',  max:false})[1] };
		$.fn._extremities = function(options) {
			var defaults = {
				aspect : 'height',
				max : true
			};
			options = $.extend(defaults, options);	
			if (this.length < 2)  return [this, this[options.aspect]()];
			var bestIndex = 0,
			bestSize = this.eq(0)[options.aspect](),
			thisSize;
			for (var i=1; i<this.length; ++i) {
				thisSize = this.eq(i)[options.aspect]();
				if ((options.max && thisSize > bestSize) || (!options.max && thisSize < bestSize)) {
					bestSize = thisSize;
					bestIndex = i;
				}
			}
			return [this.eq(bestIndex), bestSize];
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — ELEMENTS DIMENSION SUM.
	(function($) {
		$.fn.sumWidth  = function() { return this.sum('width')  };
		$.fn.sumHeight = function() { return this.sum('height') };
		$.fn.sum = function(aspect) {
			var sum = 0;
			$(this).each(function() {
				sum += (aspect=='height') ? $(this).outerHeight(true) : $(this).outerWidth(true);
			});
			return sum;
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — CENTER ELEMENT.
	(function($) {
		$.fn.extend({
			center: function(options) {
				var options = $.extend({ // Default values
					inside: window,  // element, center into window
					transition: 0,  // millisecond, transition time
					shiftX: 0,
					shiftY: 0,
					minX: 0,  // pixel, minimum left element value
					minY: 0,  // pixel, minimum top element value
					withScrolling: true,  // booleen, take care of the scrollbar (scrollTop)
					vertical: true,  // booleen, center vertical
					horizontal: true  // booleen, center horizontal
				}, options);
				return this.each(function() {
					var props = {position:'absolute'};
					if (options.vertical) {
						var top = ($(options.inside).height() - $(this).outerHeight()) / 2;
						if (options.withScrolling) top += $(options.inside).scrollTop() || 0;
						top = (top+options.shiftY > options.minY ? top+options.shiftY : options.minY);
						$.extend(props, {top: top+'px'});
					}
					if (options.horizontal) {
						var left = ($(options.inside).width() - $(this).outerWidth()) / 2;
						if (options.withScrolling) left += $(options.inside).scrollLeft() || 0;
						left = (left+options.shiftX > options.minX ? left+options.shiftX : options.minX);
						$.extend(props, {left: left+'px'});
					}
					if (options.transition > 0) $(this).animate(props, options.transition);
					else $(this).css(props);
					return $(this);
				});
			}
		});
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — SCROLLBAR WIDTH.
	(function($) {
		$.scrollbarWidth = function() {
			if (!$._scrollbarWidth) {
				var $body = $('body');
				var w = $body.css('overflow', 'hidden').width();
				$body.css('overflow', 'scroll');
				w -= $body.width();
				if (!w) w = $body.width()-$body[0].clientWidth;
				$body.css('overflow', '');
				$._scrollbarWidth = w;
			}
			return $._scrollbarWidth;
		};
	})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — EASING.
	jQuery.easing.jswing=jQuery.easing.swing;jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(e,f,a,h,g){return jQuery.easing[jQuery.easing.def](e,f,a,h,g)},easeInQuad:function(e,f,a,h,g){return h*(f/=g)*f+a},easeOutQuad:function(e,f,a,h,g){return -h*(f/=g)*(f-2)+a},easeInOutQuad:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f+a}return -h/2*((--f)*(f-2)-1)+a},easeInCubic:function(e,f,a,h,g){return h*(f/=g)*f*f+a},easeOutCubic:function(e,f,a,h,g){return h*((f=f/g-1)*f*f+1)+a},easeInOutCubic:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f+a}return h/2*((f-=2)*f*f+2)+a},easeInQuart:function(e,f,a,h,g){return h*(f/=g)*f*f*f+a},easeOutQuart:function(e,f,a,h,g){return -h*((f=f/g-1)*f*f*f-1)+a},easeInOutQuart:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f+a}return -h/2*((f-=2)*f*f*f-2)+a},easeInQuint:function(e,f,a,h,g){return h*(f/=g)*f*f*f*f+a},easeOutQuint:function(e,f,a,h,g){return h*((f=f/g-1)*f*f*f*f+1)+a},easeInOutQuint:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f*f+a}return h/2*((f-=2)*f*f*f*f+2)+a},easeInSine:function(e,f,a,h,g){return -h*Math.cos(f/g*(Math.PI/2))+h+a},easeOutSine:function(e,f,a,h,g){return h*Math.sin(f/g*(Math.PI/2))+a},easeInOutSine:function(e,f,a,h,g){return -h/2*(Math.cos(Math.PI*f/g)-1)+a},easeInExpo:function(e,f,a,h,g){return(f==0)?a:h*Math.pow(2,10*(f/g-1))+a},easeOutExpo:function(e,f,a,h,g){return(f==g)?a+h:h*(-Math.pow(2,-10*f/g)+1)+a},easeInOutExpo:function(e,f,a,h,g){if(f==0){return a}if(f==g){return a+h}if((f/=g/2)<1){return h/2*Math.pow(2,10*(f-1))+a}return h/2*(-Math.pow(2,-10*--f)+2)+a},easeInCirc:function(e,f,a,h,g){return -h*(Math.sqrt(1-(f/=g)*f)-1)+a},easeOutCirc:function(e,f,a,h,g){return h*Math.sqrt(1-(f=f/g-1)*f)+a},easeInOutCirc:function(e,f,a,h,g){if((f/=g/2)<1){return -h/2*(Math.sqrt(1-f*f)-1)+a}return h/2*(Math.sqrt(1-(f-=2)*f)+1)+a},easeInElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k)==1){return e+l}if(!j){j=k*0.3}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}return -(g*Math.pow(2,10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j))+e},easeOutElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k)==1){return e+l}if(!j){j=k*0.3}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}return g*Math.pow(2,-10*h)*Math.sin((h*k-i)*(2*Math.PI)/j)+l+e},easeInOutElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k/2)==2){return e+l}if(!j){j=k*(0.3*1.5)}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}if(h<1){return -0.5*(g*Math.pow(2,10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j))+e}return g*Math.pow(2,-10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j)*0.5+l+e},easeInBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}return i*(f/=h)*f*((g+1)*f-g)+a},easeOutBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}return i*((f=f/h-1)*f*((g+1)*f+g)+1)+a},easeInOutBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}if((f/=h/2)<1){return i/2*(f*f*(((g*=(1.525))+1)*f-g))+a}return i/2*((f-=2)*f*(((g*=(1.525))+1)*f+g)+2)+a},easeInBounce:function(e,f,a,h,g){return h-jQuery.easing.easeOutBounce(e,g-f,0,h,g)+a},easeOutBounce:function(e,f,a,h,g){if((f/=g)<(1/2.75)){return h*(7.5625*f*f)+a}else{if(f<(2/2.75)){return h*(7.5625*(f-=(1.5/2.75))*f+0.75)+a}else{if(f<(2.5/2.75)){return h*(7.5625*(f-=(2.25/2.75))*f+0.9375)+a}else{return h*(7.5625*(f-=(2.625/2.75))*f+0.984375)+a}}}},easeInOutBounce:function(e,f,a,h,g){if(f<g/2){return jQuery.easing.easeInBounce(e,f*2,0,h,g)*0.5+a}return jQuery.easing.easeOutBounce(e,f*2-g,0,h,g)*0.5+h*0.5+a}});

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — TIMERS.
	jQuery.fn.extend({everyTime:function(a,b,c,d){return this.each(function(){jQuery.timer.add(this,a,b,c,d)})},oneTime:function(a,b,c){return this.each(function(){jQuery.timer.add(this,a,b,c,1)})},stopTime:function(a,b){return this.each(function(){jQuery.timer.remove(this,a,b)})}});jQuery.extend({timer:{global:[],guid:1,dataKey:"jQuery.timer",regex:/^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,powers:{ms:1,cs:10,ds:100,s:1000,das:10000,hs:100000,ks:1000000},timeParse:function(c){if(c==undefined||c==null){return null}var a=this.regex.exec(jQuery.trim(c.toString()));if(a[2]){var b=parseFloat(a[1]);var d=this.powers[a[2]]||1;return b*d}else{return c}},add:function(d,b,c,f,h){var a=0;if(jQuery.isFunction(c)){if(!h){h=f}f=c;c=b}b=jQuery.timer.timeParse(b);if(typeof b!="number"||isNaN(b)||b<0){return}if(typeof h!="number"||isNaN(h)||h<0){h=0}h=h||0;var g=jQuery.data(d,this.dataKey)||jQuery.data(d,this.dataKey,{});if(!g[c]){g[c]={}}f.timerID=f.timerID||this.guid++;var e=function(){if((++a>h&&h!==0)||f.call(d,a)===false){jQuery.timer.remove(d,c,f)}};e.timerID=f.timerID;if(!g[c][f.timerID]){g[c][f.timerID]=window.setInterval(e,b)}this.global.push(d)},remove:function(c,b,d){var e=jQuery.data(c,this.dataKey),a;if(e){if(!b){for(b in e){this.remove(c,b,d)}}else{if(e[b]){if(d){if(d.timerID){window.clearInterval(e[b][d.timerID]);delete e[b][d.timerID]}}else{for(var d in e[b]){window.clearInterval(e[b][d]);delete e[b][d]}}for(a in e[b]){break}if(!a){a=null;delete e[b]}}}for(a in e){break}if(!a){jQuery.removeData(c,this.dataKey)}}}}});jQuery(window).bind("unload",function(){jQuery.each(jQuery.timer.global,function(a,b){jQuery.timer.remove(b)})});

	//~~~~~~~~~ JQUERY EXTEND — ANIMATE – BACKGROUND-IMAGE POSITION.
	(function(b){if(!document.defaultView||!document.defaultView.getComputedStyle){var d=b.curCSS;b.curCSS=function(g,e,h){if(e==="background-position"){e="backgroundPosition"}if(e!=="backgroundPosition"||!g.currentStyle||g.currentStyle[e]){return d.apply(this,arguments)}var f=g.style;if(!h&&f&&f[e]){return f[e]}return d(g,"backgroundPositionX",h)+" "+d(g,"backgroundPositionY",h)}}var c=b.fn.animate;b.fn.animate=function(e){if("background-position" in e){e.backgroundPosition=e["background-position"];delete e["background-position"]}if("backgroundPosition" in e){e.backgroundPosition="("+e.backgroundPosition}return c.apply(this,arguments)};function a(f){f=f.replace(/left|top/g,"0px");f=f.replace(/right|bottom/g,"100%");f=f.replace(/([0-9\.]+)(\s|\)|$)/g,"$1px$2");var e=f.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);return[parseFloat(e[1],10),e[2],parseFloat(e[3],10),e[4]]}b.fx.step.backgroundPosition=function(f){if(!f.bgPosReady){var h=b.curCSS(f.elem,"backgroundPosition");if(!h){h="0px 0px"}h=a(h);f.start=[h[0],h[2]];var e=a(f.end);f.end=[e[0],e[2]];f.unit=[e[1],e[3]];f.bgPosReady=true}var g=[];g[0]=((f.end[0]-f.start[0])*f.pos)+f.start[0]+f.unit[0];g[1]=((f.end[1]-f.start[1])*f.pos)+f.start[1]+f.unit[1];f.elem.style.backgroundPosition=g[0]+" "+g[1]}})(jQuery);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JQUERY EXTEND — JSON – ENCODE.
	(function($){var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};$.toJSON=typeof JSON==="object"&&JSON.stringify?JSON.stringify:function(o){if(o===null){return"null"}var type=typeof o;if(type==="undefined"){return undefined}if(type==="number"||type==="boolean"){return""+o}if(type==="string"){return $.quoteString(o)}if(type==="object"){if(typeof o.toJSON==="function"){return $.toJSON(o.toJSON())}if(o.constructor===Date){var month=o.getUTCMonth()+1,day=o.getUTCDate(),year=o.getUTCFullYear(),hours=o.getUTCHours(),minutes=o.getUTCMinutes(),seconds=o.getUTCSeconds(),milli=o.getUTCMilliseconds();if(month<10){month="0"+month}if(day<10){day="0"+day}if(hours<10){hours="0"+hours}if(minutes<10){minutes="0"+minutes}if(seconds<10){seconds="0"+seconds}if(milli<100){milli="0"+milli}if(milli<10){milli="0"+milli}return'"'+year+"-"+month+"-"+day+"T"+hours+":"+minutes+":"+seconds+"."+milli+'Z"'}if(o.constructor===Array){var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i])||"null")}return"["+ret.join(",")+"]"}var name,val,pairs=[];for(var k in o){type=typeof k;if(type==="number"){name='"'+k+'"'}else{if(type==="string"){name=$.quoteString(k)}else{continue}}type=typeof o[k];if(type==="function"||type==="undefined"){continue}val=$.toJSON(o[k]);pairs.push(name+":"+val)}return"{"+pairs.join(",")+"}"}};$.evalJSON=typeof JSON==="object"&&JSON.parse?JSON.parse:function(src){return eval("("+src+")")};$.secureEvalJSON=typeof JSON==="object"&&JSON.parse?JSON.parse:function(src){var filtered=src.replace(/\\["\\\/bfnrtu]/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"");if(/^[\],:{}\s]*$/.test(filtered)){return eval("("+src+")")}else{throw new SyntaxError("Error parsing JSON, source is not valid.")}};$.quoteString=function(string){if(string.match(escapeable)){return'"'+string.replace(escapeable,function(a){var c=meta[a];if(typeof c==="string"){return c}c=a.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"'}return'"'+string+'"'}})(jQuery);



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ P E R S O N A L   T O O L S.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TAB / RETURN.
	function tab(t) {
		var r = t || 1;
		return new Array(t+1).join("\t");
	}
	function rn(r) {
		var r = r || 1;
		return new Array(r+1).join("\r\n");
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VAR DUMP.
	function varDump(arr, level) {
		var dumped_text = '';
		if (!level) level = 0;
		var level_padding = '';
		for (var j=0;j<level+1;j++) level_padding += '    ';
		if (typeof(arr) == 'object') {
			for(var item in arr) {
				var value = arr[item];
				if (typeof(value) == 'object') {
					dumped_text += level_padding + "'" + item + "' ...\n";
					dumped_text += varDump(value,level+1);
				} else {
					dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
				}
			}
		} else {
			dumped_text = '===>'+arr+'<===('+typeof(arr)+')';
		}
		return dumped_text;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EMAIL ADDRESS VALIDITY.
	function emailCheck(str) {
		var regExp = /^\w([-_.]?\w)*@\w([-_.]?\w)*\.([a-zA-Z]{2,4})$/;
		return (regExp.test(str));
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ URL-REWRITING.
	function urlRewriting(str, cut) {
		str = (cut) ? stringCut(str, cut) : str;
		str = str.replace(/\s/g, " ");
		str = str.replace(/['’‘´'\`]+/g, "'");
		str = str.replace(/[«»“”\"<{\(\[\]\)}>–—•]+/g, "");
		str = str.replace(/\&/g, "and");
		str = str.replace(/œ/g, "oe");
		str = htmlEntities(str, "HTML_ENTITIES", "ENT_NOQUOTES");
		str = str.replace(/&([a-z])[a-z]+;/gi, "$1");
		str = str.toLowerCase();
		str = str.replace(/\b[a-z]?\'/g, "-");
		str = str.replace(/[^0-9a-z]+/g, "-");
		return trim(str, "-");
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IS EMPTY VARIABLE.
	function empty(variable) {
		var key;
		if (variable === "" || variable === 0 || variable === "0" || variable === null || variable === false || variable == "undefined" || typeof variable == "undefined")
			return true;
		if (typeof variable == 'object') {
			for (key in variable)
				return false;
			return true;
		}
		return false;
	}


	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ARRAY – IN.
	function in_array(needle, haystack, argStrict) {
		var key = '',
		strict = !! argStrict;
		if (strict) {
			for (key in haystack) {
				if (haystack[key] === needle)
					return true;
			}
		} else {
			for (key in haystack) {
				if (haystack[key] == needle)
					return true;
				}
		}
		return false;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ARRAY – IMPLODE.
	function implode(glue, pieces) {
		var i='', retVal='', tGlue='';
		if (arguments.length === 1) {
			pieces = glue;
			glue = '';
		}
		if (typeof(pieces) === 'object') {
			if (pieces instanceof Array)
				return pieces.join(glue);
			else {
				for (i in pieces) {
					retVal += tGlue + pieces[i];
					tGlue = glue;
				}
				return retVal;
			}
		}
		else
			return pieces;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – EXPLODE.
	function explode(delimiter, string, limit) {
		var emptyArray = {0: ''};
		if (arguments.length < 2 || typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined')
			return null;
		if (delimiter === '' || delimiter === false || delimiter === null )
			return false;
		if (typeof delimiter == 'function' || typeof delimiter == 'object' || typeof string == 'function' || typeof string == 'object')
			return emptyArray;
		if (delimiter === true)
			delimiter = '1';
		if (!limit)
			return string.toString().split(delimiter.toString());
		else {
			var splitted = string.toString().split(delimiter.toString());
			var partA = splitted.splice(0, limit - 1);
			var partB = splitted.join(delimiter.toString());
			partA.push(partB);
			return partA;
		}
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – CUT.
	function strCut(str, len, more) {
		if (str.length > len) {
			if (str.match(/\s/)) {
				while (str.substr(len, 1) != ' ')
					len--;
			}
			str = str.substr(0, len)+(more ? more : '');
		}
		return str;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – UNSHIFT.
	function strUnshift(str, fill, len) {
		for (var i=str.length; i<len; i++)
			str = fill+str;
		return str;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – UCFIRST.
	function strUcfirst(str) {
		return str.charAt(0).toUpperCase()+str.substr(1);
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – UCWORDS.
	function strUcwords(str) {
		return (str).replace(/^(.)|\s(.)/g, function ($1) {
			return $1.toUpperCase();
		});
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – CAMEL CASE.
	function strCamelCase(str) {
		str = trim(str.toLowerCase());
		return str.replace(/([^0-9a-zA-Z])(\w)/g, function(t,a,b) { return b.toUpperCase(); });
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – TRIM.
	function trim(str, charlist) {
		var whitespace, l=0, i=0;
		str += '';
		if (!charlist) {
			whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
		} else {
			charlist += '';
			whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
		}
		l = str.length;
		for (i=0; i<l; i++) {
			if (whitespace.indexOf(str.charAt(i)) === -1) {
				str = str.substring(i);
				break;
			}
		}
		l = str.length;
		for (i=l-1; i>=0; i--) {
			if (whitespace.indexOf(str.charAt(i)) === -1) {
				str = str.substring(0, i + 1);
				break;
			}
		}
		return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING – UCFIRST.
	function utf8Decode(str) {
		var arr=[], i=0, ac=0, c1=0, c2=0, c3=0;
		str += '';
		while (i < str.length) {
			c1 = str.charCodeAt(i);
			if (c1 < 128) {
				arr[ac++] = String.fromCharCode(c1);
				i++;
			} else if ((c1 > 191) && (c1 < 224)) {
				c2 = str.charCodeAt(i+1);
				arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
				i += 2;
			} else {
				c2 = str.charCodeAt(i+1);
				c3 = str.charCodeAt(i+2);
				arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return arr.join('');
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NUMBER – MTRAND.
	 Math.mtrand = function(min, max) {
		var argc = arguments.length;
		if (argc === 0) {
			min = 0;
			max = 2147483647;
		} else if (argc === 1) {
			throw new Error('Warning: mt_rand() expects exactly 2 parameters, 1 given');
		}
		return Math.floor(Math.random() * (max-min+1)) + min;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DATE-TIME CLOCK.
	function clockCompute() {
		tagObj = $('span#dateCurrent');
		if (!tagObj.date) {
			tagObj.date = trim(tagObj.text().replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:\-\_\.\s])+/g, " ")).split(" ");
			tagObj.dateHours = parseFloat(tagObj.date[0]);
			tagObj.dateMinutes = parseFloat(tagObj.date[1]);
			tagObj.dateSeconds = parseFloat(tagObj.date[2]);
		}
		tagObj.dateSeconds += 1;
		if (tagObj.dateSeconds == 60) {
			tagObj.dateSeconds = 0;
			tagObj.dateMinutes += 1;
			if (tagObj.dateMinutes == 60) {
				tagObj.dateMinutes = 0;
				tagObj.dateHours = (tagObj.dateHours == 24) ? 0 : (tagObj.dateHours+1);
			}
		}
		tagObj.text(strUnshift(tagObj.dateHours.toString(),'0',2)+"."+strUnshift(tagObj.dateMinutes.toString(),'0',2)+"."+strUnshift(tagObj.dateSeconds.toString(),'0',2)+" _ "+tagObj.date[3]+"."+tagObj.date[4]+"."+tagObj.date[5]);
	}

