function CustomNode() {}
CustomNode.posRelative = function(node) {
  var left = parseInt(node.style.left.substr(0, node.style.left.length-2), 10);
  var top  = parseInt(node.style.top.substr(0, node.style.top.length-2), 10);
  return new Point(left, top);
}

CustomNode.nodeName = function(node) {
  return node.nodeName.toLowerCase();
}

CustomNode.posAbsolute = function(node) {
    var curleft = curtop = 0;

    if (node.offsetParent) {
	curleft = node.offsetLeft;
	curtop = node.offsetTop;
	var elt = node.offsetParent;
	while (elt) {
	    curleft += elt.offsetLeft;
	    curtop += elt.offsetTop;
	    elt = elt.offsetParent;
	}
    }
    //alert(curleft+" "+curtop);

    //Debug.warning(document.getElementById('test').scrollLeft);
    var elt = node;
    while (elt && elt!=document.body) {
	curleft -= elt.scrollLeft;
	curtop -= elt.scrollTop;
	elt = elt.parentNode;
    }

    return new Point(curleft, curtop);
}

CustomNode.posAbsoluteRightBottom = function(node) {
    var pos = CustomNode.posAbsolute(node);
    var right = pos.x() + node.offsetWidth;
    var bottom = pos.y() + node.offsetHeight;
    
    return new Point(right, bottom);
}

CustomNode.width = function(node) { return node.offsetWidth; }
CustomNode.height = function(node) { return node.offsetHeight; }

CustomNode.contains = function(node, pos) {
    var posElt = CustomNode.posAbsolute(node);
    if (pos.x()<posElt.x()) return false;
    if (pos.x()>posElt.x()+node.offsetWidth) return false;
    if (pos.y()<posElt.y()) return false;
    if (pos.y()>posElt.y()+node.offsetHeight) return false;
    return true;
}

CustomNode.enterTop = function(node, pos) {
    var posElt = CustomNode.posAbsolute(node);
    if (pos.y()-posElt.y()<posElt.y()+node.offsetHeight-pos.y()) return true;
    return false;
}
CustomNode.enterBottom = function(node, pos) {
    return !CustomNode.enterTop(node, pos);
}

CustomNode.swapChilds = function(child1, child2) {
    var parent = child1.parentNode;
    if (parent!=child2.parentNode) {
	Debug.error("Node.swapChilds sur deux nodes qui n'ont pas le même parent");
	return;
    }

    if (!child1.nextSibling) {
	//Debug.infos("child1.nextSibling==null");
	parent.replaceChild(child1, child2);
	parent.appendChild(child2);

    } else if (!child2.nextSibling) {
	//Debug.infos("child2.nextSibling==null");
	parent.replaceChild(child2, child1);
	parent.appendChild(child1);

    } else {
	var insertBefore = child1.nextSibling;
	if (insertBefore==child2) {
	    insertBefore = child2.nextSibling;
	    parent.replaceChild(child2, child1);
	    parent.insertBefore(child1, insertBefore);

	} else {
	    parent.replaceChild(child1, child2);
	    parent.insertBefore(child2, insertBefore);
	}
    }
}
CustomNode.removeChilds = function(node) {
    while (node.firstChild) node.removeChild(node.firstChild);
}
function Mouse() { }

Mouse.pos = function(evt) {
    var evt = evt?evt:window.event?window.event:null; if(!evt) { return null;}

    var x, y;
    if (evt.pageX) {
	x = evt.pageX;
	y = evt.pageY;
    } else {
	x = evt.clientX + document.documentElement.scrollLeft;
	y = evt.clientY + document.documentElement.scrollTop;
    }
    //Debug.warning(x+" "+y);    
    return new Point(x, y);
}

Mouse.rightClick = function(evt) {
    if ((!document.all && evt.which==3) || 
	(document.all && window.event.button==2)) return true;
    return false;
}

function Point(x, y) {
  this._x = x;
  this._y = y;

  this.x = function() { return this._x; }
  this.y = function() { return this._y; }
}

Point.prototype.debug = function() { 
    return "x="+this._x+" y="+this._y; 
}

Point.prototype.inside = function(elt) {
    var pos = CustomNode.posAbsolute(elt);
    
    var ml = 0;
    var mr = 0;
    var mt = 0;
    var mb = 0;
    if (elt.style.marginLeft) ml = parseInt(elt.style.marginLeft.substr(0, elt.style.marginLeft.length-2), 10);
    if (elt.style.marginRight) mr = parseInt(elt.style.marginRight.substr(0, elt.style.marginRight.length-2), 10);
    if (elt.style.marginTop) mt = parseInt(elt.style.marginTop.substr(0, elt.style.marginTop.length-2), 10);
    if (elt.style.marginBottom) mb = parseInt(elt.style.marginBottom.substr(0, elt.style.marginBottom.length-2), 10);

    debug2(elt.nodeName+" "+elt.style.marginTop);

    if (this._x<pos.x()-ml) return false;
    if (this._x>pos.x()+elt.offsetWidth+mr) return false;
    if (this._y<pos.y()-mt) return false;
    if (this._y>pos.y()+elt.offsetHeight+mb) return false;

    debug("mouse inside : " + elt.id +" :"+this.debug()+" "+pos.debug()+" w="+elt.offsetWidth+" h="+elt.offsetHeight);
    return true;
}

function Tools() { }

Tools.getTargetEvent = function(evt) {
    var target;
    var event = evt || window.event;
    if (event.target) target = event.target;
    else target = event.srcElement;
    
    return target;
}
Tools.toggleDisplayElement = function(eltName) {
    var elt = document.getElementById(eltName);
    if (elt==null) {
	alert("L'element "+eltName+" n'existe pas");
	return false;
    }

    if (elt.style.display=="none") elt.style.display = "block";
    else elt.style.display = "none";
    
    return false;
}

Tools.sizeOctets = function(numOctets) {
    var size, unit;
    if (numOctets>1048576) {
	size = Tools.arrondi(numOctets/1048576., 2);
	unit = 'Mo';
    } else if (numOctets>1024) {
	size = Tools.arrondi(numOctets/1024., 2);
	unit = 'Ko';
    } else {
	size = numOctets;
	unit = 'O';
    }
    
    return size + " " + unit;
}
Tools.arrondi = function(nombre, precision) {
    var coef = Math.pow(10, precision);
    nombre = Math.round(nombre*coef) / coef;
    return nombre;
}

Tools.urlParameters = function(url) {
    var pos = url.indexOf('?');
    if (pos==-1 || pos==url.length) return new Array();
    var paramsStr = url.substring(pos+1, url.length);

    var args  = paramsStr.split('&');

    var params = new Array();
    for (var i=0;i<args.length;i++) {
	pos = args[i].indexOf('=');
	if (pos<1) continue;

	var name = args[i].substring(0, pos);
	var value = "";
	if (pos+1<args[i].length) value = args[i].substring(pos+1, args[i].length);

	params[name] = value;
    }

    return params;
}
Tools.forceReloadAntiHackImage = function(idImg) {
    var img = document.getElementById(idImg);
    if (img==null) return;

    var pos = img.src.indexOf('?');
    if (pos==-1) {
	img.src += '?new='+Math.random();
	return;
    }

    var array = Tools.urlParameters(img.src);
    array['new'] = Math.random();

    img.src = img.src.substring(0, pos+1);
    var first = true;
    for (key in array) {
	if (first) first = false;
	else img.src += '&';
	img.src += key+'='+array[key];
    }
}

Tools.isInteger = function(str) {
    var i = parseInt(str, 10);
    if (i!=str) return false;
    return true;
}

Tools.secsToHuman = function(secs) {
    var h = Math.floor(secs/3600);
    var m = Math.floor((secs-h*3600)/60);
    var s = secs - h*3600 - m*60;
    if (s>30) m++;

    if (h>0) return h+"h " + m+"mn";
    else if (m>0) return m+"mn";
    else return "< 1mn";
}
// document.domain sous IE retourne... rien
Tools.domainNameFromUrl = function() { return document.location.href.match(/:\/\/(.[^/]+)/)[1]; }

function FrameOnload() { }
FrameOnload._obj = null;

FrameOnload.createIfNotExists = function() {
    var iframe = null;
    iframe = document.getElementById('iframeForm');
    if (iframe!=null) return iframe;

    if (browser.ie()) iframe = document.createElement('<iframe name="iframeForm" id="iframeForm" src="" style="display: none; width: 0px; height: 0px; margin: 0; padding: 0; border: 0;" onload="FrameOnload.onload();"></iframe>');
    else {
	iframe = document.createElement('iframe');
	iframe.name = "iframeForm";
	iframe.id = "iframeForm";
	iframe.src = "";
	iframe.style.width = "0px";
	iframe.style.height = "0px";
	iframe.style.display = "none";
	iframe.style.margin = "0px";
	iframe.style.padding = "0px";
	iframe.style.border = "0px solid black";
	iframe.onload = FrameOnload.onload;
    }
    document.body.appendChild(iframe);

    return iframe;
}
FrameOnload.setObj = function(obj) { 
    FrameOnload.createIfNotExists();
    FrameOnload._obj = obj; 
    return true;
}
FrameOnload.obj = function() { return FrameOnload._obj; }
FrameOnload.onload = function() {
    if (FrameOnload._obj==null) return;

    var iframe = document.getElementById('iframeForm');

    /*
    var str = "";
    var iframes = document.getElementsByTagName('iframe');
    for (var i=0;i<iframes.length;i++) str += iframes[i].name+" ";
    alert(str);
    */

    var doc = iframe.contentDocument;
    if (doc==null) doc = iframe.contentWindow.document;
    if (doc!=null) {
	var textareas = doc.getElementsByTagName('textarea');
	//alert(doc.body.innerHTML);

	if (textareas.length==0) {
	    FrameOnload._obj = null;
	    iframe.src = "";
            alert("Erreur du serveur, réponse non conforme...");
	    return;
	    if (!FrameOnload._obj.isPdf) {
		alert("Erreur du serveur, réponse non conforme...");
		return;
	    } else return;
	}
	rep = textareas[0].value;       
	var a = Ajax.jsonDecode(textareas[0].value);
	if (a!=null) FrameOnload._obj.onFormResponse(a);

    } else alert('ouups, doc=null');

    FrameOnload._obj = null;
    iframe.src = "";
}

String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g,'');
} 
String.prototype.evalScripts = function() {
  resultat = this.match(/<script[^>]*>([\s\S]*?)<\/script>/g);
  if (!resultat) return;

  for (i=0;i<resultat.length;++i) {
      var res = resultat[i].replace(/<script[^>]*>([\s\S]*)<\/script>/, '$1');
      //alert(res);
      eval(res);
  }
}
    
function Rect(posLeftTop, posRightBottom) {
    this._leftTop = posLeftTop;
    this._rightBottom = posRightBottom;
}

Rect.prototype.contains = function(pos) {
    if (pos.x()<this._leftTop.x()) return false;
    if (pos.x()>this._rightBottom.x()) return false;
    if (pos.y()<this._leftTop.y()) return false;
    if (pos.y()>this._rightBottom.y()) return false;
    return true;
}

var browser = new Browser();
function Browser() {
    this._browser = navigator.appName;
    this._version = parseFloat(navigator.appVersion);
	
    this._name = "inconnu";
    if (this._browser=='Microsoft Internet Explorer') this._name = 'ie';
    else if (navigator.userAgent.toLowerCase().indexOf('opera')!=-1) this._name = 'opera';
    else this._name = 'mozilla';
    
    this.name = function() { return this._name; }
    this.ie = function() { if (this._name=="ie") return true; return false; }

    this.bodyOfIframe = function(iframe) {
	if (iframe==null) return null;

	var doc;
	if (iframe.contentDocument) doc = iframe.contentDocument; // For NS6
	else if (iframe.contentWindow) doc = iframe.contentWindow.document; // For IE5.5 and IE6
	else if (iframe.document) doc = iframe.document; // For IE5
	else return null;
	    
	return doc.body;
    }
}
Browser.prototype.width = function() {
    if (browser.ie()) return document.body.offsetWidth;
    else return window.innerWidth;
    return 0;
}
Browser.prototype.height = function() {
    if (browser.ie()) return document.body.offsetHeight;
    else return window.innerHeight;
    return 0;
}

Date.fromMySQL = function(str) {
    if ( (typeof str)!="string") return new Date(1970, 0, 1);

    var annee = parseInt(str.substr(0, 4), 10);
    var mois = parseInt(str.substr(5, 2), 10)-1;
    var jour = parseInt(str.substr(8, 2), 10);
    var heures = parseInt(str.substr(11, 2), 10);
    var minutes = parseInt(str.substr(14, 2), 10);
    var secondes = parseInt(str.substr(17, 2), 10);
    
    return new Date(annee,mois,jour,heures,minutes,secondes);
}
Date.prototype.dateOrDatetimeFr = function() {
    var annee = this.getYear();
    var mois = this.getMonth();
    var jour = this.getDate();
    var heures = this.getHours();
    var minutes = this.getMinutes();
    var secondes = this.getSeconds();
    
    var isToday = true;
    var date = new Date();
    if (date.getYear()!=annee || date.getMonth()!=mois || date.getDate()!=jour) isToday = false;

    annee += 1900;
    mois += 1;

    mois = (mois<10) ? '0'+mois : mois;
    jour = (jour<10) ? '0'+jour : jour;
    heures = (heures<10) ? '0'+heures : heures;
    minutes = (minutes<10) ? '0'+minutes : minutes;
    secondes = (secondes<10) ? '0'+secondes : secondes;

    var str = heures+":"+minutes;
    if (!isToday) str = jour+"/"+mois+"/"+annee+" "+str;

    return str;
}

function Debug() {}
Debug.appendLI = function(messg, color) {
    var ul = document.getElementById('debug');
    if (ul==null) {
	var ul = document.createElement('ul');
	ul.id = 'debug';
	document.body.appendChild(ul);
    }

    var li = document.createElement('li');
    li.innerHTML = messg;

    li.style.color = color;

    ul.appendChild(li);

    return li;
}

Debug.error   = function(messg) { Debug.appendLI(messg, "red"); }
Debug.alert   = function(messg) { Debug.appendLI(messg, "red"); }
Debug.warning = function(messg) { Debug.appendLI(messg, "orange"); }
Debug.infos   = function(messg) { Debug.appendLI(messg, "green"); }

function OnLoad() {}
OnLoad.funcs = new Array();
OnLoad.add = function(func) {
    if (OnLoad.funcs.length==0) window.onload = OnLoad.onload;
    OnLoad.funcs.push(func);
}
OnLoad.onload = function() {
    for (var i=0;i<OnLoad.funcs.length;i++) OnLoad.funcs[i]();
}

function OnUnload() {}
OnUnload.funcs = new Array();
OnUnload.add = function(func) {
    if (OnUnload.funcs.length==0) window.onunload = OnUnload.onunload;
    OnUnload.funcs.push(func);
}
OnUnload.onunload = function() {
    for (var i=0;i<OnUnload.funcs.length;i++) OnUnload.funcs[i]();
}
   
function Popup() {}
Popup.standard = "toolbar=0,location=0,directories=0,menuBar=0,scrollbars=1,resizable=1";
Popup.open = function(url, nom, width, height, params) {
    var p;
    if (!params) p = Popup.standard;
    else p = params;
    
    p += ",width="+width;
    p += ",height="+height;
    window.open(url, nom, p);
}

function Cookie() {}

Cookie.write = function(nom, valeur) {
    var now = new Date() ;
    var expires = new Date() ;
    expires.setTime( now.getTime() + 365*24*3600*1000 );
    
    document.cookie = nom+"="+encodeURI(valeur)+"; expires="+expires.toGMTString();
}
    
Cookie.load = function(name) {
    if (!document.cookie) return "";

    var index = document.cookie.indexOf(name);
    if (index==-1) return "";

    var nDeb = document.cookie.indexOf("=", index) + 1;
    var nFin = document.cookie.indexOf(";", index);

    if (nFin==-1) nFin = document.cookie.length;
    return decodeURI(document.cookie.substring(nDeb, nFin));
}

/**
 * {
 *   event: [
 *     {
 *     'sender':obj,
 *     'receivers': [
 *        { 
 *          'receiver':receiver,
 *          'funcs': [func1, func2...]
 *        },
 *        ...
 *        ]
 *     },
 *     ...
 *    ]
 * }
 */

HEvent = function() {}
HEvent.listeners = {};
/**
 * si func est null, alors receiver est en fait une fonction
 * sinon receiver est une instance d'un objet et func la méthode à exécuter
 */
HEvent.addListener = function(objSender, event, receiver, func) {
    if (!func) {
	func = receiver;
	receiver = null;
    }

    if (!HEvent.listeners[event]) HEvent.listeners[event] = [];
    var array = HEvent.listeners[event];

    var obj = null;
    for (var i=0;i<array.length;i++) if (array[i]['sender']==objSender) { obj = array[i]; break; }

    if (obj==null) {
	array.push( {'sender':objSender, 'receivers':[{'receiver':receiver, 'funcs':[func]}]} );
	return;
    }

    var receivers = obj['receivers'];
    obj = null;
    for (var i=0;i<receivers.length;i++) if (receivers[i]['receiver']==receiver) { obj = receivers[i]; break; }

    if (obj==null) {
	receivers.push( {'receiver':receiver, 'funcs':[func]} );
	return;
    }

    obj['funcs'].push(func);
}

HEvent.removeListener = function(objSender, event, receiver, func) {
    if (!func) {
	func = receiver;
	receiver = null;
    }

    if (!HEvent.listeners[event]) return;
    var senders = HEvent.listeners[event];
    for (var i=0;i<senders.length;i++) if (senders[i]['sender']==objSender) {

	    var sender = senders[i];
	    var receivers = sender['receivers'];
	    for (var j=0;j<receivers.length;j++) if (receivers[j]['receiver']==receiver) {
		    var funcs = receivers[j]['funcs'];
		    for (var k=0;k<funcs.length;k++) if (funcs[k]==func) { funcs.splice(k, 1); break; }
		}

	    break;
	}
}

HEvent.trigger = function(objSender, event) {
    if (!HEvent.listeners[event]) return;

    var args = [];
    for (var i=2;i<arguments.length;i++) args.push(arguments[i]);

    var senders = HEvent.listeners[event];
    for (var i=0;i<senders.length;i++) {
	if (senders[i]['sender']==objSender) {
	    var receivers = senders[i]['receivers'];
	    for (var j=0;j<receivers.length;j++) {
		var receiver = receivers[j]['receiver'];
		var funcs = receivers[j]['funcs'];

		for (var k=0;k<funcs.length;k++) {
		    if (receiver==null) funcs[k].apply(null, args);
		    else funcs[k].apply(receiver, args);
		}
	    }
	}
    }
}

window.onresize = function() {
    var w = 0;
    var h = 0;

    if (browser.ie()) {
	w = document.body.offsetWidth;
	h = document.body.offsetHeight;

    } else {
	w = window.innerWidth;
	h = window.innerHeight;
    }

    HEvent.trigger(window, "resized");
}

UTF8 = {
    encode: function(s){
	for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
	    s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
	    );
	return s.join("");
    },
    decode: function(s){
	for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
	    ((a = s[i][c](0)) & 0x80) &&
		(s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
		 o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
	    );
	return s.join("");
    }
};

/*
 * Date Format 1.2.3
 * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
 * MIT license
 *
 * Includes enhancements by Scott Trenda <scott.trenda.net>
 * and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */

var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date;
		if (isNaN(date)) throw SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};


