﻿//+++++++++++++++++++++++++++++++++++++++++++++++++
// 	2009, Calendar, Kee js framework
//	Andrey [Kee] Peskov, warhuman[at]mail.ru
// 	You free to use this code, but 
//	please leave this copy-info intact
//+++++++++++++++++++++++++++++++++++++++++++++++++
// ! require kee.tool.js !
//+++++++++++++++++++++++++++++++++++++++++++++++++
// [usage] onClick = kee.cl.ON(this,'textfield_id')  
// sender: clicked button  
// responserid: id of text-field to response 
//+++++++++++++++++++++++++++++++++++++++++++++++++

if(!kee){ var kee = {}; }
if(!kee.tool) {	alert("no kee.tool!"); }
if(!kee.cl){	
kee.cl = {}; 
kee.cl.v = {};
kee.cl.v.modulemark="kee-cl-module";
kee.cl.v.mainholderid="main";
kee.cl.v.monthholderid="month";
kee.cl.v.yearholderid="year";
kee.cl.v.hourholderid="hour";
kee.cl.v.minuteholderid="minute";
kee.cl.v.resultholderid="result";
kee.cl.v.sender={};
kee.cl.v.responser={};

kee.cl.conf ={};
kee.cl.conf.startMonday = 1; //0:sunday,1:monday
kee.cl.conf.showWeeks = 1; //0:hide,1:show 
kee.cl.conf.monthNames = new	Array("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");
kee.cl.conf.dayNames = (kee.cl.conf.startMonday == 1)?new Array("Пн","Вт","Ср","Чт","Пт","Сб","Вс"):new Array("Вс","Пн","Вт","Ср","Чт","Пт","Сб");
kee.cl.conf.dateformat = "dd.mm.yyyy hh:mn";

kee.cl.msg = {};
kee.cl.msg.weekHead="N";

kee.cl.now = {};
kee.cl.now.init = kee.cl.now.fulldate = new	Date();
kee.cl.now.day = kee.cl.now.fulldate.getDate();
kee.cl.now.month = kee.cl.now.fulldate.getMonth();
kee.cl.now.year = kee.cl.now.fulldate.getFullYear();
kee.cl.now.hour = kee.cl.now.fulldate.getHours();
kee.cl.now.minute = kee.cl.now.fulldate.getMinutes();

}

kee.cl.ON = function(sender,responserid){
	kee.cl.preparedate(responserid);

	var hh = kee.cl.holder(kee.cl.v.hourholderid).contents(kee.cl.hourBody(kee.cl.now.hour)); //hours
	var mn = kee.cl.holder(kee.cl.v.minuteholderid).contents(kee.cl.minuteBody(kee.cl.now.minute)); //minutes
	var res = kee.cl.holder(kee.cl.v.resultholderid).contents(kee.cl.resultBody());
	var m = kee.cl.holder(kee.cl.v.mainholderid).setattributes({sender:sender,responser:kee.tool.o(responserid)},"params")
	.poseby(sender).selectorby(kee.cl.now.fulldate)
	.showbind(hh).showbind(mn) //bind hours, minutes containers
	.showbind(res) //bind result
	.toggleshow();
	
	var mpose = kee.tool.position(m);
	hh.pose(mpose.x+mpose.w-1, mpose.y-mpose.h).setattributes({width:"120px"},"style");
	mn.poseby(hh).setattributes({width:"120px"},"style");
	res.poseby(mn).setattributes({width:"120px"},"style");
	kee.cl.result = kee.cl.resultBody;
}
kee.cl.preparedate = function(obid) {
	var obj = document.getElementById(obid);
	if(!obj) return;
	
	var fulldate = new Date();
	if (obj.value != "") {	(obj.value).toString()._findDate(fulldate); }
	
	kee.cl.now.fulldate = fulldate;	
	kee.cl.now.day = fulldate.getDate();
	kee.cl.now.month = fulldate.getMonth();
	kee.cl.now.year = fulldate.getFullYear();
	kee.cl.now.hour = fulldate.getHours();
	kee.cl.now.minute = fulldate.getMinutes();
}
kee.cl.hourBody = function(hour,fresh){
		var h = hour||kee.cl.now.hour;
		if (fresh) {
			h = kee.cl.now.hour + hour;
			if(h>23){h=0;} 
			if(h<0){h=23;}
			kee.cl.now.hour = h;
		}
		var str ="<table cellpadding=0 cellspacing=1 border=0 width=100% class=kee-cl-tab>";
		str +="<caption class=kee-cl-header>часы</caption>";
		str += "<tr>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.hourBody(-6,true);'> << </a></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.hourBody(-1,true);'> < </a></td>";
		str += "<td><b>" + kee.tool.dig(h,true) + "</b></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.hourBody(1,true);'> > </a></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.hourBody(6,true);'> >> </a></td>";
		str += "</tr></table>";
	
		if (fresh) { 
				kee.cl.holder(kee.cl.v.hourholderid).contents(str); 
				kee.cl.holder(kee.cl.v.resultholderid).contents(kee.cl.result());			
		}
		else{	return str;	}
}
kee.cl.minuteBody = function(minute,fresh){
		var m = minute||kee.cl.now.minute;
		if (fresh) {
			m = kee.cl.now.minute + minute;
			if(m>59){m=0;} 
			if(m<0){m=59;}
			kee.cl.now.minute = m;
		}
		var str ="<table cellpadding=0 cellspacing=1 border=0 width=100% class=kee-cl-tab>";
		str +="<caption class=kee-cl-header>минуты</caption>";
		str += "<tr>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.minuteBody(-15,true);'> << </a></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.minuteBody(-1,true);'> < </a></td>";
		str += "<td><b>" + kee.tool.dig(m,true) + "</b></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.minuteBody(1,true);'> > </a></td>";
		str += "<td><a href='javascript:void(0);' onclick='kee.cl.minuteBody(15,true);'> >> </a></td>";
		str += "</tr></table>";

		if (fresh) { 
				kee.cl.holder(kee.cl.v.minuteholderid).contents(str); 
				kee.cl.holder(kee.cl.v.resultholderid).contents(kee.cl.result());			
		}
		else{ return str;	}
}
kee.cl.yearBody=function(year){
		var y = year||kee.cl.now.year;
		return "<a href='javascript:void(0);' onclick='kee.cl.yearON(this);'>" + y + "</a>";
}
kee.cl.monthBody = function(month){
		var m = month||kee.cl.now.month;
		return "<a href='javascript:void(0);' onclick='kee.cl.monthON(this);'>" + kee.cl.conf.monthNames[kee.tool.dig(m)] + "</a>";
}
kee.cl.resultBody = function(){
	var str ="<table border=0 cellpadding=0 cellspacing=1 class=kee-cl-tab width=100%>";
	str += "<tr><td colspan=2 class='kee-cl-result'>" + kee.cl.formatdateout(kee.cl.conf.dateformat) + "</td></tr>";
	str += "<tr><td><a href='javascript:void(0);' onclick='kee.cl.holder(kee.cl.v.mainholderid).OK(true);' >OK</a></td>";
	str += "<td><a href='javascript:void(0);' onclick='kee.cl.holder(kee.cl.v.mainholderid).OK(false);' > X </a></td></tr>";
	str += "</table>";
	return str;
}
kee.cl.calendarBody = function(fulldate) {
		var	startDate =	new	Date(kee.cl.now.year,kee.cl.now.month,1)
		var	endDate	= new Date(kee.cl.now.year,kee.cl.now.month+1,1);
		endDate	= new Date (endDate	- (24*60*60*1000));
	
		var numDaysInMonth = endDate.getDate();
		var currentDate	= 0;
		var currentDayNum = startDate.getDay() - kee.cl.conf.startMonday
		if (currentDayNum<0) currentDayNum = 6;

		var dateNow = fulldate;

		var str =	"<tr>";
		if (kee.cl.conf.showWeeks == 1)	{ str += "<td><b>" + kee.cl.msg.weekHead + "</b></td>"; 	}
		for	(i=0; i<7; i++)	{	str += "<td align='center'><B>"+ kee.cl.conf.dayNames[i]+"</B></td>"; 	}
		str +="</tr><tr>";
		if (kee.cl.conf.showWeeks == 1){	str += "<td align='center'>" + kee.cl.weekNumber(startDate) + "</td>"	}
		for	( var i=1; i<=currentDayNum;i++ ){	str += "<td>&nbsp;</td>" }
		for	( currentDate = 1; currentDate <= numDaysInMonth; currentDate++ )	{

			currentDayNum++;
			var stl = "";
			if(currentDate == kee.cl.now.init.getDate() && kee.cl.now.month == kee.cl.now.init.getMonth() && kee.cl.now.year == kee.cl.now.init.getFullYear()) { stl = "kee-cl-now"; } 
			if (kee.cl.conf.startMonday ==  1) { if((currentDayNum % 7 == 6) || (currentDayNum % 7 == 0)) { stl = "kee-cl-weekend"; }	} 
			else { if((currentDayNum % 7 == 1) || (currentDayNum % 7 == 0)) { stl = "kee-cl-weekend"; } }
			str += "<td>";
			str += "<a class='" + stl + "' href='javascript:void(0);' onclick='kee.cl.holder(kee.cl.v.mainholderid).selector(" + currentDate + ",null,null);'>" + currentDate + "</a>";
			str += "</td>";

			if ((currentDayNum + kee.cl.conf.startMonday) % 7 == kee.cl.conf.startMonday) { 
				str += "</tr><tr>"; 
				if ((kee.cl.conf.showWeeks == 1)&&(currentDate < numDaysInMonth)){
						str += "<td>" + (kee.cl.weekNumber(new Date(kee.cl.now.year,kee.cl.now.month,currentDate+1))) + "</td>";
				}
			}

		}//for
		
		if(currentDayNum % 7 > 0) { for	( var i = currentDayNum % 7; i<7; i++ ){	str += "<td>&nbsp;</td>";  } }
		str+="</tr>";
		return str;
}
kee.cl.holder=function(hname,z){
  if (!hname) return {};
  if (!this.objs) {this.objs=[];}
  if (!this.objs[""+hname]) {
	  var ob = document.createElement("div");
	  ob.className = 'kee-cl';
	  ob.style.position = "absolute";  
	  ob.style.display = "none";  
	  ob.style.left = "1px";  
	  ob.style.top = "1px"; 
   	document.body.appendChild(ob);
   	ob.params = {mark:"kee-cl"};
   	ob.showbinds = [];
   	ob.contents = function(str){
   		this.innerHTML = str;
   		return this;
   	}
   	ob.pose = function(l,t){
   		this.style.left = l + "px"; 
		  this.style.top = t + "px";  
		  return this;
   	}
   	ob.poseby = function(senderobj){
   		if (!senderobj) {return this;}
   		var pos = kee.tool.position(senderobj)
   		this.pose(pos.x,pos.y);
		  return this;
   	}
   	ob.toggleshow = function(gotoMode){
   		var v = !this.showed();
   		if(gotoMode){ 
   			gotoMode=(gotoMode.toString().toLowerCase()=='true')?true:false; 
   			v = gotoMode;
   		}
   		if (v == this.showed()) { return this; }
   		this.style.display = (v==true)?"":"none";
   		for (var i=0;i < this.showbinds.length;i++){
   			this.showbinds[i].style.display = (v==true)?"":"none"; 
   		}
   		return this;
   	}
   	ob.showbind = function(obj){
   		obj.style.display = (this.showed())?"none":"";
   		this.showbinds.push(obj);
   		return this;
   	}
   	ob.setattributes = function(attr_obj, attrprefix) {
   		var ob = (!attrprefix)?this:this[""+attrprefix];
   		for (i in attr_obj) { ob[""+i] = attr_obj[""+i]; 		}
   		return this;
   	}
   	ob.selector = function(d,m,y) {
			if(kee.cl.holder(kee.cl.v.yearholderid).showed()) { kee.cl.holder(kee.cl.v.yearholderid).toggleshow(); }
  		if(kee.cl.holder(kee.cl.v.monthholderid).showed()) { kee.cl.holder(kee.cl.v.monthholderid).toggleshow(); }
 	  	
 	  	y=y||-1; m=m||-1; d=d||-1; 
 	  	if(y>-1){ kee.cl.now.year = kee.tool.dig(y); }	
 	  	if(m>-1){ kee.cl.now.month = kee.tool.dig(m); } 
 	  	if(d>-1){ kee.cl.now.day = kee.tool.dig(d); }		
	   	kee.cl.holder(kee.cl.v.mainholderid).contents(kee.cl.cbuild());
	   	kee.cl.holder(kee.cl.v.resultholderid).contents(kee.cl.resultBody());
	   	return this;
   	}
   	ob.selectorby = function(dat){
   		if(!dat){ dat = kee.cl.now.fulldate };
			var d = dat.getDate();
			var m = dat.getMonth();
			var y = dat.getFullYear();
			return this.selector(d,m,y);
   	}
		ob.OK = function(confirmed) {
 	 		if (this.showed()) this.toggleshow();
 	 	 	if (confirmed){ this.params.responser.value = kee.cl.formatdateout(kee.cl.conf.dateformat); }
 	 		return this;
		}
   	ob.showed = function(){return (this.style.display=="none")?false:true;}
   	this.objs[""+hname] = ob;
  }
  var zz = new Number(z)||0;
	this.objs[""+hname].style.zIndex = 10000 + zz;
	return this.objs[""+hname];
}
kee.cl.cbuild = function(){
	var str = "<table width=170 cellpadding=0 cellspacing=1 border=0 class=kee-cl-tab>";
	str += "<caption class=kee-cl-header>";
	str += "<table cellpadding=0 cellspacing=1 border=0 width=100%><tr>";
	str += "<td width=50%>" + kee.cl.monthBody(kee.cl.now.month) + "</td>";
	str += "<td>" + kee.cl.yearBody(kee.cl.now.year) 	+ "</td>";
	str += "</tr></table>";
	str += "</caption>";
	str += kee.cl.calendarBody(kee.cl.now.fulldate) + "</table>";
	return str;
}
kee.cl.monthON = function(sender) {
	if(kee.cl.holder(kee.cl.v.yearholderid).showed()) { kee.cl.holder(kee.cl.v.yearholderid).toggleshow(); }
	var str = "";
	for (var i=0;i<kee.cl.conf.monthNames.length;i++) { 
		str += "<div><a href='javascript:void(0);' class='" + ((i == kee.tool.dig(kee.cl.now.month))?"kee-cl-drop-selected":"kee-cl-drop") + "' "
		str += " onclick='kee.tool.parents(this,2).selector(null," + i + ",null)'>" + kee.cl.conf.monthNames[i] + "</a></div>"; 
	}
	kee.cl.holder(kee.cl.v.monthholderid)
	.setattributes({width:"100px"},"style")
	.poseby(sender).contents(str).toggleshow();
}
kee.cl.yearON = function(sender, positionyear) {
	if(kee.cl.holder(kee.cl.v.monthholderid).showed()) { kee.cl.holder(kee.cl.v.monthholderid).toggleshow(); }
	var yoffset = 3;
	var yy = positionyear||kee.cl.now.year;
	var str = "";
	str += "<div><a href='javascript:void(0);' class='kee-cl-drop-button' onclick='kee.cl.yearON(null," + (yy + yoffset) + ")'> + </a></div>";
		for	(var i=(yy + yoffset); i>=(yy - yoffset); i--) {
				var cls = (i==kee.cl.now.year)?"kee-cl-drop-selected":"kee-cl-drop";
				str += "<div><a href='javascript:void(0);' class='" + cls + "' onclick='kee.tool.parents(this,2).selector(null,null," + i + ");'><b>" + i + "</b></a></div>"
		}
	str += "<div><a href='javascript:void(0);' class='kee-cl-drop-button' onclick='kee.cl.yearON(null," + (yy - yoffset) + ")'> - </a></div>";
	if(!sender){ kee.cl.holder(kee.cl.v.yearholderid).contents(str).toggleshow(true);	}
	else{	
		var o = kee.cl.holder(kee.cl.v.yearholderid)
		.setattributes({width:"80px"},"style")
		.poseby(sender).contents(str).toggleshow(); 
	}
}
kee.cl.formatdateout = function(format){
	var str  = format;
	var splitter = (str.indexOf(".")!=-1)?".":(str.indexOf("/")!=-1)?"/":(str.indexOf("-")!=-1)?"-":" ";
	str = str.replace(splitter,"[]");
	str = str.replace	("mn",kee.tool.dig(kee.cl.now.minute,true));
	str = str.replace	("hh",kee.tool.dig(kee.cl.now.hour,true));
	str = str.replace("dd",kee.tool.dig(kee.cl.now.day,true));
	str = str.replace("d",kee.tool.dig(kee.cl.now.day));
	str = str.replace("[]mmm[]"," " + kee.cl.conf.monthNames[kee.cl.now.month] + " ");
	str = str.replace("[]mmm"," " + kee.cl.conf.monthNames[kee.cl.now.month]);
	str = str.replace("mmm[]",kee.cl.conf.monthNames[kee.cl.now.month] + " ");
	str = str.replace("mmm",kee.cl.conf.monthNames[kee.cl.now.month]);
	str = str.replace	("mm",kee.tool.dig(kee.cl.now.month+1,true));
	str = str.replace	("m",kee.tool.dig(kee.cl.now.month+1));
	str = str.replace ("yyyy",kee.tool.dig(kee.cl.now.year));
	str = str.replace ("yy",kee.tool.dig((kee.cl.now.year).toString().substring(2,4)));
	return str.replace ("[]",splitter);
}
kee.cl.weekNumber=function(dat){
		//var Year = kee.cl.takeYear(today);
		var Year = dat.getFullYear();
		var Month = dat.getMonth();
		var Day = dat.getDate();
		var now = Date.UTC(Year,Month,Day+1,0,0,0);
		var then = Date.UTC(Year,0,1,0,0,0);
		
		var first = new Date();
		first.setYear(Year);
		first.setMonth(0);
		first.setDate(1);
		
		var corr = first.getDay();
		if (corr > 3) { corr -= 4; } else { corr += 3; }
		return Math.round((((now-then)/86400000)+ corr)/7);
}
kee.cl.takeFullYear = function(dat)	{
		var x = dat.getYear();
		var y = x % 100;
		y += (y < 38) ? 2000 : 1900;
		return y;
}
kee.cl.result;

//+++++++++++++++++++++++++++++++++++++++++++++++++
// TIME ITERATOR
//+++++++++++++++++++++++++++++++++++++++++++++++++
kee.cl.prepareiterator = function(rid) {
	var obj = document.getElementById(rid);
	if(!obj) return;
	var s = (obj.value).toString().toLowerCase().replace(" ","");
	if (s != "") { kee.cl.itr = s.split(","); }
}
kee.cl.TIMEON = function(sender, responserid) {
	kee.cl.itr = []; 
	kee.cl.itrnow = -1; 
	kee.cl.prepareiterator(responserid);

	var hh = kee.cl.holder(kee.cl.v.hourholderid).contents(kee.cl.hourBody(kee.cl.now.hour)); //hours
	var mn = kee.cl.holder(kee.cl.v.minuteholderid).contents(kee.cl.minuteBody(kee.cl.now.minute)); //minutes
	var res = kee.cl.holder("itrresult").contents(kee.cl.timeonResultBody());
	var m = kee.cl.holder("itrmain").setattributes({sender:sender,responser:kee.tool.o(responserid)},"params")
	.poseby(sender)
	.setattributes({width:"120px"},"style")
	.contents(kee.cl.timeonBody())
	.showbind(hh).showbind(mn) 
	.showbind(res) 
	.toggleshow();
	
	var mpose = kee.tool.position(m);
	hh.pose(mpose.x+mpose.w-1, mpose.y-mpose.h).setattributes({width:"120px"},"style")
	mn.poseby(hh).setattributes({width:"120px"},"style")
	res.poseby(mn).setattributes({width:"120px"},"style")
	
	kee.cl.result = kee.cl.timeonResultBody;
}
kee.cl.timeonBody = function() {
	var str ="";
	str += "<table cellpadding=0 cellspacing=0 border=0 width='100%' class='kee-cl-tab'><tr><td>";
	str += "<select multiple='multiple' style='width:80px;height:132px' onchange='kee.cl.itrnow = this.selectedIndex;'>";
	for (var i = 0; i<kee.cl.itr.length; i++) {str += "<option value=" + i + ">" + kee.cl.itr[i] + "</option>";}
	str += "</select>";
	str += "</td><td valign=top>";
	str += "<div><a href='javascript:void(0);' onclick='kee.cl.timeonAdd()'><<<</a></div>";
	str += "<div><a href='javascript:void(0);' onclick='kee.cl.timeonRemove()'> X </a></div>";
	str += "</td></tr></table>";
	return str;
}
kee.cl.timeonResultBody = function() {
	var str ="";
	str += "<table cellpadding=0 cellspacing=0 border=0 width='100%' class='kee-cl-tab'><tr><td>";
	str += "<a href='javascript:void(0);' onclick='kee.cl.timeonResult(true)'>  OK  </a>";
	str += "</td><td>";
	str += "<a href='javascript:void(0);' onclick='kee.cl.timeonResult(false)'> X </a>";
	str += "</td></tr></table>";
	return str;
}
kee.cl.timeonAdd = function(){
	var itm = kee.tool.dig(kee.cl.now.hour,true) + ":" + kee.tool.dig(kee.cl.now.minute,true);	
	for (var i = 0; i<kee.cl.itr.length; i++) {
		if (kee.cl.itr[i] == itm) return;
	}
	kee.cl.itr.push(itm);
	kee.cl.itr.sort();
	kee.cl.itrnow = -1;
	kee.cl.holder("itrmain").contents(kee.cl.timeonBody());	
}
kee.cl.timeonRemove = function(){
	if (kee.cl.itrnow < 0) return;
	kee.cl.itr = kee.cl.itr._spliceid(kee.cl.itrnow);
	kee.cl.itr.sort();
	kee.cl.itrnow = -1;
	kee.cl.holder("itrmain").contents(kee.cl.timeonBody());	
}
kee.cl.timeonResult = function(confirmed){
	var h = kee.cl.holder("itrmain");
	h.toggleshow(false);
	if(confirmed){
		h.params.responser.value = kee.cl.itr.join(",");
	}
	kee.cl.itr = [];
}


//protoss
String.prototype._findDate = function(outdate){
	return this.toString().toLowerCase()._findTime(outdate)._findLetterMonth(outdate)._findVariantDate(outdate);
}
String.prototype._findTime = function(outdate){
	if(!outdate) { outdate = new Date(); }
	var out = this;
	var m = this.match(/([^\s\.\-\/ ][\d\:]+[^\s\.\-\/ ])/ig);
	var tms = [];

	for (var i=0;i<m.length;i++){
		if (m[i].indexOf(":")!=-1) {
			out = out.replace(m[i],"")
			var mm = m[i].replace(" ","").split(":")||[];
			for(var ii=0;ii<mm.length;ii++){
				tms.push(mm[ii]);	
			}
		}
	}
	outdate.setHours( 	(!tms[0])? outdate.getHours() : tms[0].toString().toDig() );
	outdate.setMinutes( (!tms[1])? outdate.getMinutes() : tms[1].toString().toDig() );
	outdate.setSeconds( (!tms[2])? outdate.getSeconds() : tms[2].toString().toDig() );
	return out._trim();
}
String.prototype._findLetterMonth = function(outdate){
	if(!outdate) { outdate = new Date(); }
	var out = this._trim();
	var mnth = [["янв","jan"],["фев","feb"],["мар","mar"],["апр","apr"],["ма","ma"],["июн","jun"],["июл","jul"],["авг","aug"],["сен","sep"],["окт","okt"],["ноя","nov"],["дек","dec"]];
	var w = out.match(/\w+/ig);
	var finded = false;
	for(var i=0;i<w.length;i++){
		if((w[i].length > 0) && (w[i].toString().toDig() == 0)) {
			//possible literal month
			for (var ii=0; ii<mnth.length; ii++) {
				if( (w[i].indexOf(mnth[ii][0])!=-1) || (w[i].indexOf(mnth[ii][1])!=-1) ) {
					outdate.setMonth(ii);
					out=out.replace(w[i],ii);
					return out;	
				}
			}
			out=out.replace(w[i],"");
		}
	}	
	return out;
}
String.prototype._findVariantDate = function(outdate){
	if(!outdate) { outdate = new Date(); }
	var s = this;
	s.replace(","," ");
	var splitters = [".", "/", "-", " "];
	var splitter = "";
	for (var i =0; i<splitters.length; i++){
		if (this.indexOf(splitters[i])!=-1) { splitter = splitters[i]; break; }
	}
	if (splitter == "") return this;
	var dt = s.split(splitter);
	var dt2 = dt._copy();

	var haveY = false;	var haveM = false;	var haveD = false;
	var t = 0;
	var dd = {d:0, m:0, y:0};
	
	for(var i=0; i<dt.length; i++) {
		t = dt[i].toString().toDig();
		if (dt[i].length > 0 && t == 0) {
			//ignored
		} else {
			if (t.toString().length == 4) { 
				//length == 4: its year!
				if(!haveY) { dd.y = t; s = s.replace(dt[i],""); haveY = true; dt2 = dt2._splice(dt[i]); i = 0;  }
			}	else if (t > 31) {	
				//> 31: its year! cant be day, cant be month
				if (!haveY) { dd.y = (((t<70)?"19":"20")+ t).toDig(); haveY = true; dt2 = dt2._splice(dt[i]); i = 0;}
				s = s.replace(dt[i],""); 
			} else if (t > 12) {
					//can be day, year, can't be month. if have year, its day
					if(haveY == true) {	dd.d = t; haveD = true; s = s.replace(dt[i],""); dt2 = dt2._splice(dt[i]); i = 0; } 
			} else {
					// can be anything, but if have Day and have Year - its month
					if(haveD ==  true && haveY == true) {
						dd.m = t;
						s = s.replace(dt[i],"");
						haveM = true;
						dt2 = dt2._splice(dt[i]);
					}	
			}
		//alert(dt[i] +  " ::: " + dd.d +  " : " + dd.m +  " : " + dd.y )
		}
	}//for
	
	// mm/dd/yy 	// m-d-y 	// dd.mm.yy 	// dd mm yy 
	dt = dt2;
	for(var i=0; i<dt.length; i++) {
		if (splitter == "/" || splitter == "-") {
			if(!haveM) { dd.m = dt[i].toDig(); haveM = true; s = s.replace(dt[i],""); }
			else if(!haveD) { dd.d = dt[i].toDig(); haveD = true; s = s.replace(dt[i],""); }
			else if(!haveY) { t = dt[i].toDig(); dd.y = (((t<70)?"19":"20")+ t).toDig(); haveY = true; s = s.replace(dt[i],"");  }
		} else if (splitter == ".") {
			if(!haveD) { dd.d = dt[i].toDig(); haveD = true; s = s.replace(dt[i],""); }
			else if(!haveM) { dd.m = dt[i].toDig(); haveM = true; s = s.replace(dt[i],""); }
			else if(!haveY) { t = dt[i].toDig(); dd.y = (((t<70)?"19":"20")+ t).toDig(); haveY = true; s = s.replace(dt[i],"");  }
		} else if (splitter == " ") {
			if(!haveD && dt.length > 2) { dd.d = dt[i].toDig(); haveD = true; s = s.replace(dt[i],""); }
			else if(!haveM) { dd.m = dt[i].toDig(); haveM = true; s = s.replace(dt[i],""); }
			else if(!haveY) { t = dt[i].toDig(); dd.y = (((t<70)?"19":"20")+ t).toDig(); haveY = true; s = s.replace(dt[i],"");  }
		}
	//alert(dt[i] +  " ::: " + dd.d +  " : " + dd.m +  " : " + dd.y )
	}
	
	if(dd.d > 0) { outdate.setDate(dd.d); }
	if(dd.m > 0) { outdate.setMonth(dd.m - 1); }
	if(dd.y > 0) { outdate.setFullYear(dd.y); }
	return s; 
}

