/*function replaceString(string String, from String, to String) : replaces from with to in string*/
function replaceString(string, from, to)
{
	var i = string.indexOf(from);
	if (i == -1)
		return string;  //base case
	else
		return(string.substring(0,i-1) + to + replaceString(string.substring(i+1,string.length-1),from,to));
}

/*function trim (string String) : removes extra space(s) behind and in front of a string*/
function trim(v)
{
	len = v.length;
	if (len>0)
	{
		while (v.length>0 && v.substr(0,1)==' ')
			v = v.substr(1);
		while (v.length>0 && v.substr(v.length-1)==' ')
			v = v.substr(0,v.length-1);
	}
	return v
}

/*function isdigit (number Integer) : checks whether a number consists of digits (1~9) only*/
function isdigit(v)
{
	if (isNaN(v))
		return false;
	else
	{
		vstr = v.toString();
		if (vstr.indexOf(".")!=-1)
			return false;
		if (vstr.indexOf("-")!=-1)
			return false;
		if (vstr.indexOf("+")!=-1)
			return false;
	}
	return true;
}

/*function isint (number Integer) : checks whether a number is a valid integer*/
function isint(v)
{
	if (isNaN(v))
		return false;
	else
	{
		vstr = v.toString();
		if (vstr.indexOf(".")!=-1)
			return false;
		if (vstr.indexOf("+")!=-1)
			return false;
	}
	return true;
}

/*function isvdate (date String) : checks whether a date string is validate*/
function isvdate(v)
{
	var datepattern=/^\d{4}\/\d{1,2}\/\d{1,2}$|^\d{1,2}\/\d{1,2}\/\d{4}$/
	if (datepattern.test(v))
	{
		vstr = v.toString();
		pos1 = vstr.indexOf("/");
		if (pos1==4)								//format: yyyy/mm/dd
		{
			y = vstr.substr(0,pos1);
			pos2 = vstr.indexOf("/",pos1+1);
			m = vstr.substring(5,pos2);
			d = vstr.substr(pos2+1);
		}
		else										//format: mm/dd/yyyy
		{
			pos2 = vstr.indexOf("/",pos1+1);
			m = vstr.substr(0,pos1);
			d = vstr.substr(pos1+1,pos2-pos1-1);
			y = vstr.substr(pos2+1);
		}
		if (y>0 && m>0 && m<13 && d>0 && d<32)
		{
			maxday = lastdayof(y,m);
			if (d>maxday)
				return false;
			else
				return true;
		}
		else
			return false;
	}
	else
		return false;
}

/*function lastdayof (year Integer,month Integer) : returns the last day of a month*/
function lastdayof(y,m)
{
	if (m==2)
	{
		if ((y%4 == 0) && (!((y%100 == 0) && (y%400 != 0))))
			return 29
		else
			return 28
	}
	else if ((m<=7 && m%2!=0) || (m>=8 && m%2==0))
		return 31
	else 
		return 30
}

/*function dateadd (interval Character,number Integer,date Datetime) : returns a date to which a specified time interval has been added*/
function dateadd(s,v,d)
{
	var d2 = null;
	d1 = new Date(d);
	d1y = d1.getFullYear();
	d1m = d1.getMonth();
	d1d = d1.getDate();
	if (s=="d")
		d2 = new Date(d1y,d1m,d1d+v);
	else if (s=="m")
		d2 = new Date(d1y,d1m+v,d1d);
	else if (s=="y")
		d2 = new Date(d1y+v,d1m,d1d);
	return d2;
}

/*function datediff (interval Character,date1 Datetime,date2 Datetime) : returns the time difference between the two given dates*/
function datediff (s,v1,v2)
{
	divSec = 1000;
	divMin = 60 * 1000;
	divHrs = 60 * 60 * 1000;
	divDay = 24 * 60 * 60 * 1000;
	d1 = new Date(v1);
	d2 = new Date(v2);
	s = s.toLowerCase();
	datedifference = Math.abs(d1-d2);
	if (s=="s")
		return datedifference/divSec;
	else if (s=="m")
		return datedifference/divMin;
	else if (s=="h")
		return datedifference/divHrs;
	else
		return datedifference/divDay;
}

/*function formatdate (format String,date Datetime) : formats the date using the specified formatting options*/
function formatdate(f,d)
{
	var d1 = new Date(d)
	var d1y = d1.getFullYear();
	var d1m = d1.getMonth() + 1;
	var d1d = d1.getDate();
	switch(f)
	{
		case "yyyy/mm/dd":
			return d1y.toString() + "/" + d1m.toString() + "/" + d1d.toString();
		case "mm/dd/yyyy":
			return d1m.toString() + "/" + d1d.toString() + "/" + d1y.toString();
		case "dd/mm/yyyy":
			return d1d.toString() + "/" + d1m.toString() + "/" + d1y.toString();
		case "mm/dd":
			return d1m.toString() + "/" + d1d.toString()
		default:
			return d1m.toString() + "/" + d1d.toString() + "/" + d1y.toString();
	}
}

/****** Date Picker Function Group ******/
var CalendarWindow,DateStringFormat,DesObjName,PostDatePickCode;

/*function getobj (object_id String) : retrieves element of a given id*/
function getobj(obj)
{
	if (typeof(obj)=="object")
		return obj;
	else if (document.all(obj)!=null)
		return document.all(obj);
	else
		return eval(obj);
}

/*function setdatevalue (year Integer,month Integer,day Integer) : outputs date string to designating object*/
function setdatevalue(y,m,d)
{
	if (DesObjName!=null)
	{
		var datestr="";
		m++;
		if (typeof(DateStringFormat)=="string")
			DateStringFormat = DateStringFormat.toLowerCase();
		datestr = formatdate(DateStringFormat,y + "/" + m + "/" + d)
		obj = getobj(DesObjName);
		obj.value = datestr;
		if (PostDatePickCode!=null && PostDatePickCode!='')
			window.execScript(PostDatePickCode);
	}
	CalendarWindow.close();
}

/*function buildcalendar (year Integer,month Integer) : builds calendar*/
function buildcalendar(y,m)
{
	CalendarWindow.document.open()
	
	var thisday = new Date()
	var thisdayD = thisday.getDate()

	var curday = new Date(y,m,1)
	var curY = curday.getFullYear()
	var curM = curday.getMonth()
	var curD = curday.getDate()
	var curW = curday.getDay()
	var lDay = new Date(curY,curM,lastdayof(curY,curM+1))
	var lDayD = lDay.getDate()

	var sameflag
	if (thisday.getYear()==curY && thisday.getMonth()==curM)
		sameflag = true
	else
		sameflag = false

	var i,k

	var titlestr = "<title>"
	titlestr += "Date Picker"
	titlestr += "</title>"
	
	var stylestr = "<style>"
	stylestr += ".normal{FONT-WEIGHT: normal;FONT-SIZE: 11px;COLOR: black;FONT-FAMILY: 'Sans Serif', Tahoma, Helvetica, Arial, Verdana;cursor:hand;text-align:center}"
	stylestr += ".normalbold{FONT-WEIGHT: bold;FONT-SIZE: 11px;COLOR: black;FONT-FAMILY: 'Sans Serif', Tahoma, Helvetica, Arial, Verdana}"
	/*
	stylestr += ".title{font-size:14px;vertical-align:middle;text-align:center;font-weight:bold;color:white;background-color:#a39afd}"
	stylestr += ".th_wkday{width:24px;font-size:12px;text-align:center}"
	stylestr += ".th_wkend{width:24px;font-size:12px;text-align:center;color:red}"
	stylestr += ".th_wkend2{width:24px;font-size:12px;text-align:center;color:blue}"
	stylestr += ".normal{font-size:16px;text-align:center;cursor:hand}"
	stylestr += ".thisday{font-size:16px;text-align:center;cursor:hand;color:red}"
	stylestr += ".button{font-size:12px}"
	stylestr += ".button2{font-size:12px;border-width:1px;background-color:#48f9d1}"
	*/
	stylestr += "</style>"
	
	var scriptstr = "<" + "script defer>\n"
	scriptstr += "function rebuild(v)\n"
	scriptstr += "{tmpY=parseInt(ysel.value);\n"
	scriptstr += "tmpM=parseInt(msel.value);\n" 
	scriptstr += "if (v==0)\n"
	scriptstr += "{tmpM=tmpM-1;\n"
	scriptstr += "if (tmpM<0)\n"
	scriptstr += "{tmpM=11;\n"
	scriptstr += "tmpY=tmpY-1;}}\n"
	scriptstr += "else\n"
	scriptstr += "{tmpM=tmpM+1;\n"
	scriptstr += "if (tmpM>11)\n"
	scriptstr += "{tmpM=0;\n"
	scriptstr += "tmpY=tmpY+1;}}\n"
	scriptstr += "window.opener.buildcalendar(tmpY,tmpM);}\n"
	scriptstr += "<" + "/script>\n"
	
	var mName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	var yselstr = ""
	for (i=curY-50;i<=curY+50;i++)
	{
		if (i==curY)
			yselstr += "<option value=" + i + " selected>" + i + "</option>"
		else
			yselstr += "<option value=" + i + ">" + i + "</option>"
	}
	var mselstr = ""
	for (i=0;i<12;i++)
	{
		if (i==curM)
			mselstr += "<option value=" + i + " selected>" + (parseInt(i)+1) + "</option>"
		else
			mselstr += "<option value=" + i + ">" + (parseInt(i)+1) + "</option>"
	}
	var funcstr = "<td width=50% align=right><select class=normalbold id=ysel onchange='window.opener.buildcalendar(ysel.value,msel.value);'>" + yselstr + "</select></td><td width=50% align=left><select class=normalbold id=msel onchange='window.opener.buildcalendar(ysel.value,msel.value);'>" + mselstr + "</select></td>"
	funcstr = "<table border=0 cellspacing=0 cellpadding=2 width=210><tr>" + funcstr + "</tr></table>"

	var tablestr = "<tr><td colspan=7 class=normalbold align=center><button onclick=rebuild(0) class=normalbold id=button1 name=button1>Prev</button>&nbsp&nbsp&nbsp" + mName[curM] + " " + curY + "&nbsp&nbsp&nbsp<button onclick=rebuild(1) class=normalbold id=button1 name=button1>Next</button></td></tr>"
	tablestr = tablestr + "<th class=normalbold style=\"color:red;width:24px\">Sun</th><th class=normalbold style=\"width:24px\">Mon</th><th class=normalbold style=\"width:24px\">Tue</th><th class=normalbold style=\"width:24px\">Wed</th><th class=normalbold style=\"width:24px\">Thu</th><th class=normalbold style=\"width:24px\">Fri</th><th class=normalbold style=\"color:red;width:24px\">Sat</th>"
	tablestr = tablestr + "<tr>"
	for (i=0;i<curW;i++)
	{
		tablestr = tablestr + "<td style=\"width:24px;height:24px\">&nbsp</td>"
	}
	i = 1
	k = curW
	while (i<=lDayD)
	{
		if (k==0)
			tablestr = tablestr + "<tr>"
		if (sameflag && i==thisdayD)
			tablestr = tablestr + "<td class=normal style=\"color:blue;width:24px;height:24px\" onclick='window.opener.setdatevalue(" + curY + "," + curM + "," + i + ");'>" + i + "</td>"
		else
			tablestr = tablestr + "<td class=normal style=\"width:24px;height:24px\" onclick='window.opener.setdatevalue(" + curY + "," + curM + "," + i + ");'>" + i + "</td>"
		if (k==6 && i!=lDay)
			tablestr = tablestr + "</tr>"
		if (k==6)
			k = 0
		else
			k++;
		i = i + 1
	}
	if (k!=0)
	{
		for (i=k;i<=6;i++)
		{
			tablestr = tablestr + "<td style=\"width:24px;height:24px\">&nbsp</td>"
		}
	}
	tablestr = tablestr + "</tr>"
	tablestr = "<table border=1 cellspacing=0 cellpadding=2>" + tablestr + "</table>"

	htmlstr = titlestr + stylestr + scriptstr + funcstr + tablestr
	
	CalendarWindow.document.write(htmlstr)
	CalendarWindow.document.close()
}

/*function adjustY (height Integer) : adjusts window position vertically*/
function adjustY(fheight)
{
	sheight = window.screen.height-195;
	sy = event.screenY;
	tmpY = sy + fheight/2;
	if (tmpY>sheight)
		return sheight-fheight/2;
	else
		return sy;
}

/*function adjustX (width Integer) : adjusts window position horizontally*/
function adjustX(fwidth)
{
	swidth = window.screen.width;
	sx = event.screenX;
	tmpX = sx + fwidth;
	if (tmpX>swidth)
		return sx-fwidth-15;
	else
		return sx;
}

/*function showcalendar () : displays calendar*/
function showcalendar()
{
	(arguments[0]==null || arguments[0]=='') ? DesObjName=null : DesObjName=arguments[0];
	(arguments[1]==null || arguments[1]=='') ? DateStringFormat=null : DateStringFormat=arguments[1];
	(arguments[2]==null || arguments[2]=='') ? PostDatePickCode=null : PostDatePickCode=arguments[2];
	(arguments[3]==null || arguments[3]=='') ? DefaultYearMonth=null : DefaultYearMonth=arguments[3];

	if (CalendarWindow!=null && typeof(CalendarWindow)=="object" && !CalendarWindow.closed)
		CalendarWindow.focus();
	else
	{
		CalendarWindow = window.open("", "Calendar", "width=230,height=250,status=no,resizable=no,top=" + adjustY(250) + ",left=" + adjustX(230));
		CalendarWindow.opener = self;
	
		var today;
		if (DefaultYearMonth==null)
			today = new Date();
		else
			today = new Date(DefaultYearMonth);
		today_yr = today.getFullYear();
		today_mo = today.getMonth();
		buildcalendar(today_yr,today_mo);
	}
}

/****** Row Re-arrange Function Group ******/
/*function moverow () : moves a table row to another position*/
function moverow()
{
	(arguments[0]==null || arguments[0]=='') ? obj=null : obj=arguments[0];
	(arguments[1]==null || arguments[1]=='') ? TableId=null : TableId=arguments[1];	

	if (obj!=null)
	{
		if (TableId!=null)
			tableobj = getobj(TableId);
		else
		{
			tableobj = obj.parentElement;
			while (tableobj!=null && tableobj.tagName!="TABLE")
				tableobj = tableobj.parentElement;
		}
		if (tableobj!=null)
		{
			maxlen = tableobj.rows.length;
			if (TableId!=null)
			{
				for (i=0;i<maxlen;i++)
				{
					if (tableobj.rows(i).contains(obj))
					{
						trobj = tableobj.rows(i);
						break;
					}
				}
			}
			else
			{
				trobj = obj.parentElement;
				while (trobj!=null && trobj.tagName!="TR")
					trobj = trobj.parentElement;
			}
			currentIndex = trobj.rowIndex;
			nextIndex = obj.value;
			if (currentIndex!=nextIndex)
			{
				tableobj.moveRow(currentIndex,nextIndex);
				startpos = (currentIndex<nextIndex) ? currentIndex-1 : nextIndex-1
				obj2 = document.all(obj.id);
				for (i=startpos;i<obj2.length;i++)
				{
					if (obj2(i)!=null)
						obj2(i).value=i+1;
				}
			}
		}
	}
}

/*function moveup () : moves up a table row*/
function moveup()
{
	(arguments[0]==null || arguments[0]=='') ? obj=null : obj=arguments[0];
	(arguments[1]==null || arguments[1]=='') ? TableId=null : TableId=arguments[1];	
	(arguments[2]==null || arguments[2]=='') ? FieldToUpdate=null : FieldToUpdate=arguments[2];

	if (obj!=null)
	{
		if (TableId!=null)
			tableobj = getobj(TableId);
		else
		{
			tableobj = obj.parentElement;
			while (tableobj!=null && tableobj.tagName!="TABLE")
				tableobj = tableobj.parentElement;
		}
		if (tableobj!=null)
		{
			maxlen = tableobj.rows.length;
			if (TableId!=null)
			{
				for (i=0;i<maxlen;i++)
				{
					if (tableobj.rows(i).contains(obj))
					{
						trobj = tableobj.rows(i);
						break;
					}
				}
			}
			else
			{
				trobj = obj.parentElement;
				while (trobj!=null && trobj.tagName!="TR")
					trobj = trobj.parentElement;
			}
			currentIndex = trobj.rowIndex;
			nextIndex = (currentIndex-1)<=1 ? 1 : currentIndex-1;
			tableobj.moveRow(currentIndex,nextIndex);
			if (FieldToUpdate!=null && currentIndex!=nextIndex)
			{
				obj2 = getobj(FieldToUpdate);
				startpos = (currentIndex<nextIndex) ? currentIndex-1 : nextIndex-1
				for (i=startpos;i<=startpos+1;i++)
				{
					if (obj2(i)!=null)
						obj2(i).value=i+1;
				}
			}
		}
	}
}

/*function movedown () : moves down a table row*/
function movedown()
{
	(arguments[0]==null || arguments[0]=='') ? obj=null : obj=arguments[0];
	(arguments[1]==null || arguments[1]=='') ? TableId=null : TableId=arguments[1];	
	(arguments[2]==null || arguments[2]=='') ? FieldToUpdate=null : FieldToUpdate=arguments[2];

	if (obj!=null)
	{
		if (TableId!=null)
			tableobj = getobj(TableId);
		else
		{
			tableobj = obj.parentElement;
			while (tableobj!=null && tableobj.tagName!="TABLE")
				tableobj = tableobj.parentElement
		}
		if (tableobj!=null)
		{
			maxlen = tableobj.rows.length;
			if (TableId!=null)
			{
				for (i=0;i<maxlen;i++)
				{
					if (tableobj.rows(i).contains(obj))
					{
						trobj = tableobj.rows(i);
						break;
					}
				}
			}
			else
			{
				trobj = obj.parentElement;
				while (trobj!=null && trobj.tagName!="TR")
					trobj = trobj.parentElement
			}
			currentIndex = trobj.rowIndex;
			nextIndex = (currentIndex+1)>=maxlen ? maxlen-1 : currentIndex+1;
			tableobj.moveRow(currentIndex,nextIndex);
			if (FieldToUpdate!=null && currentIndex!=nextIndex)
			{
				obj2 = getobj(FieldToUpdate);
				startpos = (currentIndex<nextIndex) ? currentIndex-1 : nextIndex-1
				for (i=startpos;i<=startpos+1;i++)
				{
					if (obj2(i)!=null)
						obj2(i).value=i+1;
				}
			}
		}
	}
}
