///   Start 
function rangepickerCP (instancename, first_day_of_week, months_before, months_after,isNonDynamic,activeDaysArr,boldDaysArr,isOnlyFuture,maxDateAhaed,leftFix) {
	var dstart;
	var dend;
	var dshow;
	var showstart;
	var showend;
	var select_active=0;
	if (isNonDynamic == null)
	{
	    isNonDynamic = false;
	}
	if (isOnlyFuture==null)
	{
	    isOnlyFuture = false;
	}
	this.isOnlyFuture = isOnlyFuture;
	this.activeDaysArr = activeDaysArr;
	this.maxDateAhead = maxDateAhaed;
	if (leftFix==null)
	{
	    leftFix = 0;
	}
	this.leftFix = leftFix;
	if (this.maxDateAhead)
	{
	    this.maxDT = new Date(this.maxDateAhead.GetYearForShow(), this.maxDateAhead.GetMonthForShow(), this.maxDateAhead.GetDateForShow());
	}
	this.boldDaysArr = boldDaysArr;
    this.IsInActiveDaysArr = function(obj)
    {
        var ret =true;
        if (this.isOnlyFuture)
        {
            var dt = new Date();
            var dtDateOnly =new Date(dt.getFullYear(), dt.getMonth(), dt.getDate());
            if (obj<dtDateOnly)
            {
                return false;
            }
            
            if (this.maxDateAhead)
            {
                if (obj>this.maxDT)
                {
                    return false;
                }
            }
            
        }
        if (this.activeDaysArr!=null)
        {
            ret = false;
            var len = this.activeDaysArr.length;
            for (var idx=0;idx<len;idx++)
            {
                if (this.activeDaysArr[idx].IsEqualToJSDate(obj))
                {
                    return true;
                }
            }
            return false;
        }
        return ret;
    }
	this.SetActiveDaysArr = function (activeDaysArr)
	{
	    this.activeDaysArr = activeDaysArr;
	    this.show_cal();
	}
	
    this.IsInBoldDaysArr = function(obj)
    {
        var ret =false;
        if (this.boldDaysArr!=null)
        {
            var len = this.boldDaysArr.length;
            for (var idx=0;idx<len;idx++)
            {
                if (this.boldDaysArr[idx].IsEqualToJSDate(obj))
                {
                    return true;
                }
            }
        }
        return ret;
    }
    
	this.SetBoldDaysArr = function (boldDaysArr)
	{
	    this.boldDaysArr = boldDaysArr;
	    this.show_cal();
	}
	
	//init row of weekdays according to 1st day of week
	var days = ['S','M','T','W','T','F','S'];
		var txtweekdays = '';
	for (var wkd=0; wkd<7; wkd++) {
		txtweekdays += '<th class="weekday">' + days[(wkd+first_day_of_week)%7] + '</th>';
	}			
    	
	this.to_year = document.getElementById(instancename + '_to_year');
	this.to_month = document.getElementById(instancename + '_to_month');
	this.to_day = document.getElementById(instancename + '_to_day');

	this.from_year = document.getElementById(instancename + '_from_year');
	this.from_month = document.getElementById(instancename + '_from_month');
	this.from_day = document.getElementById(instancename + '_from_day');

    this.isNonDynamic = isNonDynamic;

	//init calendar from field values or set to today's date
	this.init_cal = function () {
		//get values from form fields or set to this date
		dend = new Date();
		dshow = new Date(dend.getFullYear(),dend.getMonth(),dend.getDate()) ;
		//get values from form fields or set to end date
		dstart = new Date(dend.getFullYear(),dend.getMonth(),dend.getDate()) ;

		this.to_year.value = dend.getFullYear();
		this.to_month.value = dend.getMonth()+1;
		this.to_day.value = dend.getDate();

		this.from_year.value = dstart.getFullYear();
		this.from_month.value = dstart.getMonth()+1;
		this.from_day.value = dstart.getDate();
		this.show_cal();
	}

	//return date object from date string, given as 'YYYY,mm,dd'
	function split_date(str_date) {
		var dateary = str_date.split(',');
		var dt = new Date(dateary[0],dateary[1],dateary[2]);
		return dt;
	}

	// monday first day of week
	function dayofweek(d) {
		//return (d.getDay()+6) % 7; //ISO-week
		var ret = (d.getDay()-first_day_of_week) % 7;
		return ret;
	}

	//set start and/or end dates in range on onclick events
	this.set_range = function (date_start, date_end) {
		if (!date_end) {
			if (select_active==0) {
				dstart = split_date(date_start);
				dend = split_date(date_start);
				select_active = 1;
			} else {
				dtmp = split_date(date_start);
				if (dtmp>=dstart) {
					dend = dtmp;
				} else {
					dend = dstart;
					dstart = dtmp;
				}
				select_active = 0;

				//set new show month only if full selection is not visible in current view
				if (dstart<showstart) {
					dshow = new Date(dend.getFullYear(),dend.getMonth(),1) ;
				}
			}
		} else {
			select_active = 0;
			dstart = split_date(date_start);
			dend = split_date(date_end);
			//set new show month only if full selection is not visible in current view
			if (dstart<showstart) {
				dshow = new Date(dend.getFullYear(),dend.getMonth(),1) ;
			}
		}
		this.show_cal();

		//set the date values in the form fields
		this.to_year.value = dend.getFullYear();
		this.to_month.value = dend.getMonth()+1;
		this.to_day.value = dend.getDate();

		this.from_year.value = dstart.getFullYear();
		this.from_month.value = dstart.getMonth()+1;
		this.from_day.value = dstart.getDate();
	}
	if (first_day_of_week==1) {
		//get week number (european). Credits to Ferry van Schaik (ferryvs@teq.nl)
		this.getweek = function (year,month,day) {
			var when = new Date(year,month,day);
			var newYear = new Date(year,0,1);
			var modDay = newYear.getDay();
			if (modDay == 0) modDay=6; else modDay--;

			var daynum = ((Date.UTC(year,when.getMonth(),when.getDate(),0,0,0) - Date.UTC(year,0,1,0,0,0)) /1000/60/60/24) + 1;

			if (modDay < 4 ) {
				var weeknum = Math.floor((daynum+modDay-1)/7)+1;
			} else {
				var weeknum = Math.floor((daynum+modDay-1)/7);
				if (weeknum == 0) {
					year--;
					var prevNewYear = new Date(year,0,1);
					var prevmodDay = prevNewYear.getDay();
					if (prevmodDay == 0) prevmodDay = 6; else prevmodDay--;
					if (prevmodDay < 4) weeknum = 53; else weeknum = 52;
				}
			}

			return + weeknum;
		}
	} else {
		this.getweek = function (year,month,day) {
		    var when = new Date(year,month,day);
		    var newYear = new Date(year,0,1);
		    var stDayOff =  first_day_of_week - newYear.getDay();
		    if (stDayOff<0)
		    {
		       stDayOff+=7;
		    }
		    newYear.setDate(newYear.getDate() + stDayOff);
		    var offset = 7 + 1 - newYear.getDay();
		    if (offset == 8) offset = 1;
		    var daynum = ((Date.UTC(year,when.getMonth(),when.getDate(),0,0,0) - Date.UTC(year,0,1,0,0,0)) /1000/60/60/24) + 1;
		    var weeknum = Math.floor((daynum-offset+7)/7);
		    if (weeknum == 0) {
			year--;
			var prevNewYear = new Date(year,0,1);
			var prevOffset = 7 + 1 - prevNewYear.getDay();
			if (prevOffset == 2 || prevOffset == 8) weeknum = 53; else weeknum = 52;
		    }
		    return weeknum;
		}
	}

	//change displayed month
	this.show_month = function (month) {
		dshow.setMonth(month, 1);
		this.show_cal();
	}
	//go to start of range
	this.to_dstart = function() {
		dshow.setFullYear(dstart.getFullYear(),dstart.getMonth(),1);
		this.show_cal();
	}
	//go to end of range
	this.to_dend = function() {
		dshow.setFullYear(dend.getFullYear(),dend.getMonth(),1);
		this.show_cal();
	}

	//show calendar(s)
	this.show_cal = function () {

		//show year, select full year
		var tmpT1 = dshow.getFullYear() +',0,1';
		var tmpT2 = (dshow.getFullYear()+1) +',0,0';
		var htxt = '';/*<table><tr><th colspan="8"><a style="float:left" href="#" onclick="'+
			instancename+'.set_range(\''+tmpT1+'\',\''+tmpT2+'\');return false;'+
			'">' + (dshow.getFullYear()) + '</a></th></tr></table>'*/

		showstart = new Date(dshow.getFullYear(), dshow.getMonth()-months_before, 1);
		showstart.setDate(1-dayofweek(showstart));
		showend = new Date(dshow.getFullYear(), dshow.getMonth()+months_after+1, 1);
		showend.setDate(7-dayofweek(showend));
		//show three months at a time
		for (var dm=-months_before; dm<=months_after; dm++) {

			tmpT1 = dshow.getFullYear() +',' + (dshow.getMonth()+dm)+ ',1';
			tmpT2 = dshow.getFullYear() +',' + (dshow.getMonth()+1+dm) + ',0';

			//setup calendar grid, whole month selector
			
			var d1 = new Date(dshow.getFullYear(), dshow.getMonth()+dm, 1);
			
			var this_month = d1.getMonth();
			var dt = new DateTimeObj();
			var this_month_str = dt.MONTH_NAMES[this_month] + ' ' +d1.getFullYear().toString().substring(2,4);;
			
        var stl = '';
        /*if (!this.isNonDynamic)
        {*/
		    if (dm==-months_before)
		    {
		        //htxt += '<div class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()-1)+');return false;"><img src="images/RangePickerBack.gif" onmouseout = "this.src='+"'images/RangePickerBack.gif'"+'"  onmouseover = "this.src='+"'images/RangePickerBackHover.gif'"+'" border="0" width="15px" height="15px"></div>';
			    stl = 'position:relative;left:-5px';
			}
			else
			{
			  htxt += "";
			  var lft = (dm+months_before-1)*7+2;
			  stl = 'position:relative;left:'+lft+'px';
			}
		    htxt += '<table style="width:150px;float:left;'+stl+'">';
		    htxt += '<tr>';//<th class="weekEmpty" >';
			//htxt+='</th>';
			if (this.isNonDynamic)
			{
			    htxt += '<td><div class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()-1)+');return false;"><img src="Images/RangePickerBack.gif" onmouseout = "this.src='+"'Images/RangePickerBack.gif'"+'"  onmouseover = "this.src='+"'Images/RangePickerBackHover.gif'"+'" border="0" width="15px" height="15px"></div></td>';
			    htxt += '<th colspan="5"><div class="monthHeader" style="background:#DDDDDD; height:15px; width:124px">'+(this_month_str)+'</a></th>';
			    htxt += '<td><div style="position:relative;left:'+this.leftFix+'px" class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()+1)+');return false;"><img src="Images/RangePickerNext.gif" onmouseout = "this.src='+"'Images/RangePickerNext.gif'"+'"  onmouseover = "this.src='+"'Images/RangePickerNextHover.gif'"+'"border="0" width="15px" height="15px"><br style="clear:both" /></div></td></tr>';
			}
			else
			{
			    htxt += '<td><div class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()-1)+');return false;"><img src="Images/RangePickerBack.gif" onmouseout = "this.src='+"'Images/RangePickerBack.gif'"+'"  onmouseover = "this.src='+"'Images/RangePickerBackHover.gif'"+'" border="0" width="15px" height="15px"></div></td>';
			    htxt += '<th colspan="5"><div class="monthHeader" style="background:#DDDDDD; height:15px; width:124px">'+(this_month_str)+'</div></th>';
			    htxt += '<td><div style="position:relative;left:'+this.leftFix+'px" class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()+1)+');return false;"><img src="Images/RangePickerNext.gif" onmouseout = "this.src='+"'Images/RangePickerNext.gif'"+'"  onmouseover = "this.src='+"'Images/RangePickerNextHover.gif'"+'"border="0" width="15px" height="15px"><br style="clear:both" /></div></td></tr>';
			}
		
        /*}
        else
        {
			htxt += '<table  style="float:left"><tr><th colspan="8" ><div class="monthHeader">'+(this_month_str)+'</div></th></tr>';
        }*/	
			htxt += '<tr><th class="weekEmpty"></th></tr><tr>' + txtweekdays + '</tr>';
			d1.setDate(1-dayofweek(d1));
            while (d1.getMonth() == this_month)
            {
                d1.setTime(d1.getTime() - 7*DAY_IN_MILISECONDS);                    
            }
			var weekno = this.getweek(d1.getFullYear(),d1.getMonth(), d1.getDate());
            /*
			//link to selected range
			if (dm==-months_before && dstart<d1) {
				if (dend<d1) {
					htxt += '<tr><th></th><td colspan="7" class="sel1"><a href="#" onclick="'+instancename+'.to_dend();return false;">&lt</a></td></tr>';
				} else {
					htxt += '<tr><th></th><td colspan="7" class="sel1"><a href="#" onclick="'+instancename+'.to_dstart();return false;">&lt</a></td></tr>';
				}
			}
			*/
			//show weeks - till first week in new month
			for (var w=0; (w<2 || d1.getMonth()==this_month);w++) {

				if (weekno>52) {
					weekno = 1;

				}
				//week selector
                if (!this.isNonDynamic)
                {
				    htxt += '<tr><th class="weekSel"  onmouseover="this.className='+"'weekSelHover'"+'"  onmouseout="this.className='+"'weekSel'"+'" onclick="'+
					    instancename+'.set_range(\''+(d1.getFullYear()+','+d1.getMonth()+','+d1.getDate())+'\',\''+(d1.getFullYear()+','+d1.getMonth()+','+(6+d1.getDate()))+'\');return false;'+
					    '"></th>';
                 }
               else
                {
				    htxt += '<tr>';//<th class="weekSel"></th>';
                }
				//show weekdays
				for (var d=0; d<7; d++) {
				    var tdstyle = '';
				    if ((d1>=dstart) && (d1<=dend))
				    {
				      if (select_active==1)
				      {
				         tdstyle = 'sel2';
				      }
				      else
				      {
				         if ((d1.getMonth()==this_month))
				         {
				            tdstyle = 'sel1';
				         }
				         else
				         {
				            tdstyle = 'noMonthSel';
				         }
				      }
				    }
				    else
				    {
				         if ((d1.getMonth()==this_month))
				         {
				         }
				         else
				         {
				            tdstyle = 'noMonth';
				         }
				    }
					var astyle = (d1.getMonth()==this_month)?'':tdstyle+'a_sm';
                    var dateStr = d1.getDate();
                    if (this.IsInActiveDaysArr(d1))
                    {
                        if (!this.isNonDynamic)
                        {
					        htxt += '<td class="'+tdstyle+'" style="cursor:pointer;" onmouseover="this.className='+"'hover'"+'"  onmouseout="this.className='+"'"+tdstyle+"'"+'" onclick="'+
						        instancename+'.set_range(\''+(d1.getFullYear()+','+d1.getMonth()+','+d1.getDate())+'\',\'\');return false;'+
						        '">' + (dateStr) + '</td>';
					    }
					    else
					    {
					        htxt += '<td class="'+tdstyle+'" style="cursor:pointer;" onmouseover="this.className='+"'hover'"+'"  onmouseout="this.className='+"'"+tdstyle+"'"+'" onclick="'+
						        instancename+'.DateClickedInner(\''+(d1.getFullYear()+','+d1.getMonth()+','+d1.getDate())+'\',\'\');return false;'+
						        '">' + (dateStr) + '</td>';
					    }
					}
					else
					{
					        htxt += '<td class="inactiveDay">'+(dateStr) + '</div></b></td>';
					}
					d1.setDate(d1.getDate()+1);
				}
				htxt += '</tr>';
				weekno++;
			}
			//link to selected range
//			if (dm==months_after && dend>d1) {
//				if (dstart>d1) {
//					htxt += '<tr><th></th><td colspan="7" class="sel1"><a href="#" onclick="'+instancename+'.to_dstart();return false;">&gt</a></td></tr>';
//				} else {
//					htxt += '<tr><th></th><td colspan="7" class="sel1"><a href="#" onclick="'+instancename+'.to_dend();return false;">&gt</a></td></tr>';
//				}
//			}

			htxt += '</table>';
		}

//        if (!this.isNonDynamic)
//        {
	//	    htxt += '<div style="position:relative;left:'+this.leftFix+'px" class="chgmonthCP" onclick="'+instancename+'.show_month('+(dshow.getMonth()+1)+');return false;"><img src="images/RangePickerNext.gif" onmouseout = "this.src='+"'images/RangePickerNext.gif'"+'"  onmouseover = "this.src='+"'images/RangePickerNextHover.gif'"+'"border="0" width="15px" height="15px"><br style="clear:both" /></div>';
//        }
		//display in div
		document.getElementById(instancename + '_div').innerHTML = htxt;
	}
	this.init_cal();

    function FormatDateForRange(dt)
    {
       var ret = dt.GetFullYearForShow() +','+ (dt.GetMonthForShow()) + ',' +dt.GetDateForShow();
       return ret;

    }
	this.SetDateRangeSelector = function (stDate,enDate) 
	{ 
	    var start =FormatDateForRange(stDate);
	    var end = FormatDateForRange(enDate);
	    this.set_range (start,end);
    }

	this.GetStartDate = function (timeZoneObj) 
	{
	    return new DateTimeObj(parseInt(this.from_year.value),
	                           parseInt(this.from_month.value-1),
	                           parseInt(this.from_day.value),
	                           0,
	                           0,
	                           0,
	                           timeZoneObj,
	                           true).GetDateOnlyDateTime();
    }

	this.GetEndDate = function (timeZoneObj) 
	{
	    return new DateTimeObj(parseInt(this.to_year.value),
	                           parseInt(this.to_month.value-1),
	                           parseInt(this.to_day.value),
	                           0,
	                           0,
	                           0,
	                           timeZoneObj,
	                           true).GetDateOnlyDateTime();
    }
    
    this.DateClickedInner = function (dtStr)
    {
       this.set_range (dtStr,dtStr);
       if (this.DateClicked!=null)
       {
            this.DateClicked();
       }
    }

}
