/**
	the script only works on "input [type=text]"
**/
// don't declare anything out here in the global namespace
(
function($)
{ // create private scope (inside you can use $ instead of jQuery)
	// functions and vars declared here are effectively 'singletons'.  there will be only a single
    // instance of them.  so this is a good place to declare any immutable items or stateless
    // functions.  for example:
	var today = new Date(); // used in defaults
    var months = 'January,February,March,April,May,June,July,August,September,October,November,December'.split(',');
	var monthlengths = '31,28,31,30,31,30,31,31,30,31,30,31'.split(',');
  	var dateRegEx = /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/;
	var yearRegEx = /^\d{4,4}$/;
    // next, declare the plugin function
    $.fn.simpleDatepicker = function(options)
	{
		// functions and vars declared here are created each time your plugn function is invoked
        // you could probably refactor your 'build', 'load_month', etc, functions to be passed
        // the DOM element from below
		var opts = jQuery.extend({}, jQuery.fn.simpleDatepicker.defaults, options);
		// replaces a date string with a date object in opts.startdate and opts.enddate, if one exists
		// populates two new properties with a ready-to-use year: opts.startyear and opts.endyear
		setupYearRange();
		/** extracts and setup a valid year range from the opts object **/
		function setupYearRange ()
		{
			var startyear, endyear;  
			if (opts.startdate.constructor == Date)
			{
				startyear = opts.startdate.getFullYear();
			}
			else if(opts.startdate)
			{
				if(yearRegEx.test(opts.startdate))
				{
					startyear = opts.startdate;
				}
				else if(dateRegEx.test(opts.startdate))
				{
					opts.startdate = new Date(opts.startdate);
					startyear = opts.startdate.getFullYear();
				}
				else
				{
					startyear = today.getFullYear();
				}
			}
			else
			{
				startyear = today.getFullYear();
			}
			opts.startyear = startyear;
			if(opts.enddate.constructor == Date)
			{
				endyear = opts.enddate.getFullYear();
			}
			else if(opts.enddate)
			{
				if(yearRegEx.test(opts.enddate))
				{
					endyear = opts.enddate;
				}
				else if(dateRegEx.test(opts.enddate))
				{
					opts.enddate = new Date(opts.enddate);
					endyear = opts.enddate.getFullYear();
				}
				else
				{
					endyear = today.getFullYear();
				}
			}
			else
			{
				endyear = today.getFullYear();
			}
			opts.endyear = endyear;	
		}
		/** HTML factory for the actual datepicker table element **/
		// has to read the year range so it can setup the correct years in our HTML <select>
		function newDatepickerHTML()
		{
			var years = [];
			// process year range into an array
			for (var i = 0; i <= opts.endyear - opts.startyear; i ++) years[i] = opts.startyear + i;
			// build the table structure
			var table = jQuery('<table class="datepicker" cellpadding="0" cellspacing="0"></table>');
			table.append('<thead></thead>');
			table.append('<tfoot></tfoot>');
			table.append('<tbody></tbody>');
			// month select field
			var monthselect = '<select id="month" name="month" calss="month">';
			for (var i in months) monthselect += '<option value="'+i+'">'+months[i]+'</option>';
			monthselect += '</select>';
			// year select field
			var yearselect = '<select name="year" calss="year">';
			for (var i in years) yearselect += '<option>'+years[i]+'</option>';
			yearselect += '</select>';
			jQuery("thead",table).append('<tr class="controls"><th colspan="7"><span class="prevMonth">&laquo;</span>&nbsp;'+monthselect+yearselect+'&nbsp;<span class="nextMonth">&raquo;</span></th></tr>');
			jQuery("thead",table).append('<tr class="days"><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>');
			jQuery("tfoot",table).append('<tr><td colspan="2"><span class="today">today</span></td><td colspan="3">&nbsp;</td><td colspan="2"></td></tr>');
			for(var i=0;i<6;i++) jQuery("tbody",table).append('<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>');
			return table;
		}
		/** get the real position of the input (well, anything really) **/
		//http://www.quirksmode.org/js/findpos.html
		function findPosition(obj)
		{
			var curleft = curtop = 0;
			if(obj.offsetParent)
			{
				do
				{ 
					curleft += obj.offsetLeft;
					curtop += obj.offsetTop;
				}
				while (obj = obj.offsetParent);
				return [curleft,curtop];
			}
			else
			{
				return false;
			}
		}
		/** load the initial date and handle all date-navigation **/
		// initial calendar load (e is null)
		// prevMonth & nextMonth buttons
		// onchange for the select fields
		function loadMonth (e, el, datepicker, chosendate)
		{
			// reference our years for the nextMonth and prevMonth buttons
			var mo = jQuery("select[name=month]", datepicker).get(0).selectedIndex;
			var yr = jQuery("select[name=year]", datepicker).get(0).selectedIndex;
			var yrs = jQuery("select[name=year] option", datepicker).get().length;
			// first try to process buttons that may change the month we're on
			if (e && jQuery(e.target).hasClass('prevMonth'))
			{
				if (0 == mo && yr)
				{
					yr -= 1; mo = 11;
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = 11;
					jQuery("select[name=year]", datepicker).get(0).selectedIndex = yr;
				}
				else
				{
					mo -= 1;
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = mo;
				}
			}
			else if(e && jQuery(e.target).hasClass('nextMonth'))
			{
				if(11 == mo && yr + 1 < yrs)
				{
					yr += 1; mo = 0;
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = 0;
					jQuery("select[name=year]", datepicker).get(0).selectedIndex = yr;
				}
				else
				{ 
					mo += 1;
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = mo;
				}
			}
			// maybe hide buttons
			if (0 == mo && !yr) jQuery("span.prevMonth", datepicker).hide(); 
			else jQuery("span.prevMonth", datepicker).show(); 
			if (yr + 1 == yrs && 11 == mo) jQuery("span.nextMonth", datepicker).hide(); 
			else jQuery("span.nextMonth", datepicker).show();
			// clear the old cells
			var cells = jQuery("tbody td", datepicker).unbind().empty().removeClass('date');
			// figure out what month and year to load
			var m = jQuery("select[name=month]", datepicker).val();
			var y = jQuery("select[name=year]", datepicker).val();
			var d = new Date(y, m, 1);
			var startindex = d.getDay();
			var numdays = monthlengths[m];
			// http://en.wikipedia.org/wiki/Leap_year
			if (1 == m && ((y%4 == 0 && y%100 != 0) || y%400 == 0)) numdays = 29;
			// test for end dates (instead of just a year range)
			if (opts.startdate.constructor == Date)
			{
				var startMonth = opts.startdate.getMonth();
				var startDate = opts.startdate.getDate();
			}
			if (opts.enddate.constructor == Date)
			{
				var endMonth = opts.enddate.getMonth();
				var endDate = opts.enddate.getDate();
			}
			// walk through the index and populate each cell, binding events too
			for (var i = 0; i < numdays; i++)
			{
				var cell = jQuery(cells.get(i+startindex)).removeClass('chosen');
				// test that the date falls within a range, if we have a range
				if((yr||((!startDate&&!startMonth)||((i+1>=startDate&&mo==startMonth)||mo>startMonth)))&&(yr+1<yrs||((!endDate&& !endMonth) || ((i+1 <= endDate && mo == endMonth) || mo < endMonth))))
				{
					cell
						.text(i+1)
						.addClass('date')
						.hover(
							function () { jQuery(this).addClass('over'); },
							function () { jQuery(this).removeClass('over'); })
						.click(
						function ()
						{
							var chosenDateObj = new Date(jQuery("select[name=year]", datepicker).val(), jQuery("select[name=month]", datepicker).val(), jQuery(this).text());
							closeIt(el, datepicker, chosenDateObj);
						}
						);
					// highlight the previous chosen date
					if (i+1==chosendate.getDate()&&m==chosendate.getMonth()&&y==chosendate.getFullYear())cell.addClass('chosen');
				}
			}
		}
		/** closes the datepicker **/
		// sets the currently matched input element's value to the date, if one is available
		// remove the table element from the DOM
		// indicate that there is no datepicker for the currently matched input element
		function getNextDate(today)
	  	{ 
			var d = today.getDate();
			var m = today.getMonth();
			var y = today.getFullYear();
			return new Date(y, m, d+1);
  	    }
		function getNextStrDate(today)
		{
			today=today.split('-');
			return today[0]+'-'+today[1]+'-'+String(parseInt(today[2])+1);
		}
		function compair_date(ear_date,lat_date)
		{
			ear_date=ear_date.split('-');
			lat_date=lat_date.split('-');
			if(ear_date==null||ear_date=='')
			{
				return true;
			}
			if(parseInt(ear_date[0])>parseInt(lat_date[0]))
			{
				return false;
			}
			if(parseInt(ear_date[1])>parseInt(lat_date[1]))
			{
				return false;
			}
			if(parseInt(ear_date[2])>parseInt(lat_date[2]))
			{
				return false;
			}
			return true;
		}
		function compaire_date(ear_date,lat_date)
		{
			ear_date=ear_date.split('-');
			lat_date=lat_date.split('-');
			if(ear_date==null||ear_date=='')
			{
				return true;
			}
			if(parseInt(ear_date[0])<parseInt(lat_date[0]))
			{
				return true;
			}
			if(parseInt(ear_date[1])<parseInt(lat_date[1]))
			{
				return true;
			}
			if(parseInt(ear_date[2])<=parseInt(lat_date[2]))
			{
				return true;
			}
			return false;
		}
		function closeIt (el, datepicker, dateObj)
		{ 
			if (dateObj && dateObj.constructor == Date)
			{
				//this variable to but end_date plus 1 from start_date
				var first_day=dateObj;
				//compaire today && selection date
				var date_final=jQuery.fn.simpleDatepicker.formatOutput(dateObj);
				var t1=jQuery.fn.simpleDatepicker.formatOutput(new Date());
				var year=t1.split('-');
				var temp =jQuery.fn.simpleDatepicker.formatOutput(dateObj);
				temp=temp.split('-');
				if(year[0]==temp[0])
				{
					if((parseInt(year[1])>parseInt(temp[1]))||(parseInt(year[1])==parseInt(temp[1])&&parseInt(year[2])>parseInt(temp[2])))
					{
						date_final=t1;
						first_day=new Date();
						
					}
				}
				if(jQuery(el).attr('id')=='start_date'&&compaire_date(document.getElementById('end_date').value,date_final))
				{
					document.getElementById('end_date').value=jQuery.fn.simpleDatepicker.formatOutput(getNextDate(first_day));
				}
				else if(jQuery(el).attr('id')=='offer_start_date'&&compaire_date(document.getElementById('offer_end_date').value,date_final))
				{
					document.getElementById('offer_end_date').value=
					 jQuery.fn.simpleDatepicker.formatOutput(getNextDate(first_day));
				}
				else if(jQuery(el).attr('id')=='from_date'&&compaire_date(document.getElementById('to_date').value,date_final))
				{
					document.getElementById('to_date').value=
					 jQuery.fn.simpleDatepicker.formatOutput(getNextDate(first_day));
				}
				el.val(date_final);
				if(jQuery(el).attr('id')=='end_date'&&compair_date(date_final,document.getElementById('start_date').value))
				{
					 document.getElementById('end_date').value=getNextStrDate(document.getElementById('start_date').value);
				}
				else if(jQuery(el).attr('id')=='offer_end_date'&&compair_date(date_final,document.getElementById('offer_start_date').value))
				{
					 document.getElementById('offer_end_date').value=getNextStrDate(document.getElementById('offer_start_date').value);
				}
				else if(jQuery(el).attr('id')=='to_date'&&compair_date(date_final,document.getElementById('from_date').value))
				{
					 document.getElementById('to_date').value=getNextStrDate(document.getElementById('from_date').value);
				}
			}
			datepicker.remove();
			datepicker = null;
			jQuery.data(el.get(0), "simpleDatepicker", { hasDatepicker : false });
			if(document.getElementById('ReleaseDate').value != '' && document.getElementById('arrestDate').value != '')
			{
				ReleaseDate = document.getElementById('ReleaseDate').value.split('-');
				var d2 = parseInt(ReleaseDate[2]);
				var m2 = parseInt(ReleaseDate[1]);
				var y2 = parseInt(ReleaseDate[0]);
				arrestDate = document.getElementById('arrestDate').value.split('-');
				var d1 = parseInt(arrestDate[2]);
				var m1 = parseInt(arrestDate[1]);
				var y1 = parseInt(arrestDate[0]);
				if (!(Date.parse(arrestDate) > Date.parse(ReleaseDate)))
				{
					document.getElementById('time').value = days_between(new Date(y2,m2,d2),new Date(y1,m1,d1));
				}
			}
		}
		function daysInMonth(month, year) 
		{
    		return new Date(year, month, 0).getDate();
        }
		function days_between(date1, date2)
		{
			// The number of milliseconds in one day
			var ONE_DAY = 1000 * 60 * 60 * 24
			// Convert both dates to milliseconds
			var date1_ms = date1.getTime()
			var date2_ms = date2.getTime()
			// Calculate the difference in milliseconds
			var difference_ms = Math.abs(date1_ms - date2_ms)
			// Convert back to days and return
			return Math.round(difference_ms/ONE_DAY)
		}
		function date()
		{
			alert(document.getElementById("start_dat").value);
		}
		function get_date(Sdate)
		{
			Sdate=Sdate.split('-');
			var d = parseInt(Sdate[2]);
			var m = parseInt(Sdate[1])-1;
			var y = parseInt(Sdate[0]);
			return new Date(y, m, d);
		}
        // iterate the matched nodeset
        return this.each(function()
		{
            // functions and vars declared here are created for each matched element. so if
            // your functions need to manage or access per-node state you can defined them
            // here and use $this to get at the DOM element
			if ( jQuery(this).is('input') && 'text' == jQuery(this).attr('type'))
			{
				var datepicker; 
				jQuery.data(jQuery(this).get(0), "simpleDatepicker", { hasDatepicker : false });
				// open a datepicker on the click event
				jQuery(this).click(function (ev)
				{
					var $this = jQuery(ev.target);
					if (false == jQuery.data($this.get(0), "simpleDatepicker").hasDatepicker)
					{
						// store data telling us there is already a datepicker
						jQuery.data($this.get(0), "simpleDatepicker", { hasDatepicker : true });
						// validate the form's initial content for a date
						var initialDate = $this.val();
						if (jQuery($this).attr('value'))
						{
							var chosendate = get_date(jQuery($this).attr('value'));
						}
						else if(initialDate && dateRegEx.test(initialDate))
						{
							var chosendate = new Date(initialDate);
						}
						else if(opts.chosendate.constructor == Date)
						{
							var chosendate = opts.chosendate;
						}
						else if(opts.chosendate)
						{
							var chosendate = new Date(opts.chosendate);
						}
						else
						{
							var chosendate = today;
						}
						// insert the datepicker in the DOM
						datepicker = newDatepickerHTML();
						jQuery("body").prepend(datepicker);
						// position the datepicker
						var elPos = findPosition($this.get(0));
						var x = (parseInt(opts.x) ? parseInt(opts.x) : 0) + elPos[0];
						var y = (parseInt(opts.y) ? parseInt(opts.y) : 0) + elPos[1];
						jQuery(datepicker).css({ position: 'absolute', left: x, top: y });
						// bind events to the table controls
						jQuery("span", datepicker).css("cursor","pointer");
						jQuery("select", datepicker).bind('change', function(){loadMonth(null,$this,datepicker,chosendate);});
						jQuery("span.prevMonth",datepicker).click(function (e){loadMonth(e,$this,datepicker,chosendate);});
						jQuery("span.nextMonth",datepicker).click(function(e){loadMonth(e,$this,datepicker,chosendate);});
						jQuery("span.today",datepicker).click(function(){closeIt($this,datepicker,new Date());});
						$(document).bind('mousedown.table.datepicker', function(e)
						{
							var clicked=$(e.target); // get the element clicked                 
							if( clicked.is('table.datepicker')||clicked.parents().is('table.datepicker'))
							{
								// click safe!
							}
							else
							{
								// outside click
								closeIt($this, datepicker);
							}
						});
						// set the initial values for the month and year select fields
						// and load the first month
						jQuery("select[name=month]",datepicker).get(0).selectedIndex=chosendate.getMonth();
						jQuery("select[name=year]",datepicker).get(0).selectedIndex=Math.max(0,chosendate.getFullYear()-opts.startyear);
						loadMonth(null, $this, datepicker, chosendate);
					}
				});
			}
		});
	};
    // finally, I like to expose default plugin options as public so they can be manipulated.  one
    // way to do this is to add a property to the already-public plugin fn
	jQuery.fn.simpleDatepicker.formatOutput = function (dateObj)
	{
		return (dateObj.getFullYear() ) + "-" + (dateObj.getMonth()+1) + "-" + dateObj.getDate();	
	};
	jQuery.fn.simpleDatepicker.defaults=
	{
		// date string matching /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/
		chosendate : today,
		// date string matching /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/
		// or four digit year
		startdate : today.getFullYear(), 
		enddate : today.getFullYear() + 1,
		// offset from the top left corner of the input element
		x : 18, // must be in px
		y : 18 // must be in px
	};
})(jQuery);
