wp/wp-content/plugins/portfolio/datepicker/datepicker.js
author ymh <ymh.work@gmail.com>
Mon, 08 Jun 2015 16:11:51 +0000
changeset 4 346c88efed21
parent 0 d970ebf37754
permissions -rw-r--r--
add blog-copier plugin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
	the script only works on "input [type=text]"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
**/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
// don't declare anything out here in the global namespace
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
(function($) { // create private scope (inside you can use $ instead of jQuery)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    // functions and vars declared here are effectively 'singletons'.  there will be only a single
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    // instance of them.  so this is a good place to declare any immutable items or stateless
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    // functions.  for example:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
	var today = new Date(); // used in defaults
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    var months = 'January,February,March,April,May,June,July,August,September,October,November,December'.split(',');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
	var monthlengths = '31,28,31,30,31,30,31,31,30,31,30,31'.split(',');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
  	var dateRegEx = /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
	var yearRegEx = /^\d{4,4}$/;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    // next, declare the plugin function
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    $.fn.simpleDatepicker = function(options) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        // functions and vars declared here are created each time your plugn function is invoked
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        // you could probably refactor your 'build', 'load_month', etc, functions to be passed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        // the DOM element from below
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
		var opts = jQuery.extend({}, jQuery.fn.simpleDatepicker.defaults, options);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		// replaces a date string with a date object in opts.startdate and opts.enddate, if one exists
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		// populates two new properties with a ready-to-use year: opts.startyear and opts.endyear
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
		setupYearRange();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		/** extracts and setup a valid year range from the opts object **/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		function setupYearRange () {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
			var startyear, endyear;  
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
			if (opts.startdate.constructor == Date) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
				startyear = opts.startdate.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
			} else if (opts.startdate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
				if (yearRegEx.test(opts.startdate)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
				startyear = opts.startdate;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
				} else if (dateRegEx.test(opts.startdate)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
					opts.startdate = new Date(opts.startdate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
					startyear = opts.startdate.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
				startyear = today.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
				startyear = today.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
			opts.startyear = startyear;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
			if (opts.enddate.constructor == Date) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
				endyear = opts.enddate.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
			} else if (opts.enddate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
				if (yearRegEx.test(opts.enddate)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
					endyear = opts.enddate;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
				} else if (dateRegEx.test(opts.enddate)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
					opts.enddate = new Date(opts.enddate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
					endyear = opts.enddate.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
					endyear = today.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
				endyear = today.getFullYear();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
			opts.endyear = endyear;	
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
		/** HTML factory for the actual datepicker table element **/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
		// has to read the year range so it can setup the correct years in our HTML <select>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
		function newDatepickerHTML () {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
			var years = [];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
			// process year range into an array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			for (var i = 0; i <= opts.endyear - opts.startyear; i ++) years[i] = opts.startyear + i;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
	
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
			// build the table structure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			var table = jQuery('<table class="datepicker" cellpadding="0" cellspacing="0"></table>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
			table.append('<thead></thead>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
			table.append('<tfoot></tfoot>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			table.append('<tbody></tbody>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
				// month select field
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
				var monthselect = '<select name="month">';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
				for (var i in months) monthselect += '<option value="'+i+'">'+months[i]+'</option>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
				monthselect += '</select>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
				// year select field
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
				var yearselect = '<select name="year">';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
				for (var i in years) yearselect += '<option>'+years[i]+'</option>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
				yearselect += '</select>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
			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>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
			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>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
			jQuery("tfoot",table).append('<tr><td colspan="2"><span class="today">today</span></td><td colspan="3">&nbsp;</td><td colspan="2"><span class="close">close</span></td></tr>');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
			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>');	
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
			return table;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
		/** get the real position of the input (well, anything really) **/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
		//http://www.quirksmode.org/js/findpos.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
		function findPosition (obj) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
			var curleft = curtop = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			if (obj.offsetParent) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
				do { 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
					curleft += obj.offsetLeft;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
					curtop += obj.offsetTop;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
				} while (obj = obj.offsetParent);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
				return [curleft,curtop];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
		/** load the initial date and handle all date-navigation **/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
		// initial calendar load (e is null)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
		// prevMonth & nextMonth buttons
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
		// onchange for the select fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
		function loadMonth (e, el, datepicker, chosendate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
			// reference our years for the nextMonth and prevMonth buttons
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
			var mo = jQuery("select[name=month]", datepicker).get(0).selectedIndex;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
			var yr = jQuery("select[name=year]", datepicker).get(0).selectedIndex;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
			var yrs = jQuery("select[name=year] option", datepicker).get().length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
			// first try to process buttons that may change the month we're on
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
			if (e && jQuery(e.target).hasClass('prevMonth')) {				
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
				if (0 == mo && yr) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
					yr -= 1; mo = 11;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = 11;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
					jQuery("select[name=year]", datepicker).get(0).selectedIndex = yr;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
					mo -= 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = mo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
			} else if (e && jQuery(e.target).hasClass('nextMonth')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
				if (11 == mo && yr + 1 < yrs) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
					yr += 1; mo = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
					jQuery("select[name=year]", datepicker).get(0).selectedIndex = yr;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
				} else { 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
					mo += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
					jQuery("select[name=month]", datepicker).get(0).selectedIndex = mo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
			// maybe hide buttons
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
			if (0 == mo && !yr) jQuery("span.prevMonth", datepicker).hide(); 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
			else jQuery("span.prevMonth", datepicker).show(); 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
			if (yr + 1 == yrs && 11 == mo) jQuery("span.nextMonth", datepicker).hide(); 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
			else jQuery("span.nextMonth", datepicker).show(); 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
			// clear the old cells
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
			var cells = jQuery("tbody td", datepicker).unbind().empty().removeClass('date');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
			// figure out what month and year to load
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
			var m = jQuery("select[name=month]", datepicker).val();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
			var y = jQuery("select[name=year]", datepicker).val();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
			var d = new Date(y, m, 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
			var startindex = d.getDay();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
			var numdays = monthlengths[m];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
			// http://en.wikipedia.org/wiki/Leap_year
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
			if (1 == m && ((y%4 == 0 && y%100 != 0) || y%400 == 0)) numdays = 29;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
			// test for end dates (instead of just a year range)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
			if (opts.startdate.constructor == Date) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
				var startMonth = opts.startdate.getMonth();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
				var startDate = opts.startdate.getDate();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
			if (opts.enddate.constructor == Date) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
				var endMonth = opts.enddate.getMonth();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
				var endDate = opts.enddate.getDate();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
			// walk through the index and populate each cell, binding events too
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
			for (var i = 0; i < numdays; i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
				var cell = jQuery(cells.get(i+startindex)).removeClass('chosen');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
				
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
				// test that the date falls within a range, if we have a range
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
				if ( 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
					(yr || ((!startDate && !startMonth) || ((i+1 >= startDate && mo == startMonth) || mo > startMonth))) &&
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
					(yr + 1 < yrs || ((!endDate && !endMonth) || ((i+1 <= endDate && mo == endMonth) || mo < endMonth)))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
				
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
					cell
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
						.text(i+1)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
						.addClass('date')
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
						.hover(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
							function () { jQuery(this).addClass('over'); },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
							function () { jQuery(this).removeClass('over'); })
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
						.click(function () {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
							var chosenDateObj = new Date(jQuery("select[name=year]", datepicker).val(), jQuery("select[name=month]", datepicker).val(), jQuery(this).text());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
							closeIt(el, datepicker, chosenDateObj);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
						});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
					// highlight the previous chosen date
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
					if (i+1 == chosendate.getDate() && m == chosendate.getMonth() && y == chosendate.getFullYear()) cell.addClass('chosen');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
		/** closes the datepicker **/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
		// sets the currently matched input element's value to the date, if one is available
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		// remove the table element from the DOM
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
		// indicate that there is no datepicker for the currently matched input element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
		function closeIt (el, datepicker, dateObj) { 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
			if (dateObj && dateObj.constructor == Date)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
				el.val(jQuery.fn.simpleDatepicker.formatOutput(dateObj));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
			datepicker.remove();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
			datepicker = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
			jQuery.data(el.get(0), "simpleDatepicker", { hasDatepicker : false });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        // iterate the matched nodeset
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
        return this.each(function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
            // functions and vars declared here are created for each matched element. so if
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
            // your functions need to manage or access per-node state you can defined them
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
            // here and use $this to get at the DOM element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
			
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
			if ( jQuery(this).is('input') && 'text' == jQuery(this).attr('type')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
				var datepicker; 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
				jQuery.data(jQuery(this).get(0), "simpleDatepicker", { hasDatepicker : false });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
				
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
				// open a datepicker on the click event
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
				jQuery(this).click(function (ev) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
											 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
					var $this = jQuery(ev.target);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
					
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
					if (false == jQuery.data($this.get(0), "simpleDatepicker").hasDatepicker) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
						// store data telling us there is already a datepicker
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
						jQuery.data($this.get(0), "simpleDatepicker", { hasDatepicker : true });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
						// validate the form's initial content for a date
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
						var initialDate = $this.val();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
						if (initialDate && dateRegEx.test(initialDate)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
							var chosendate = new Date(initialDate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
						} else if (opts.chosendate.constructor == Date) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
							var chosendate = opts.chosendate;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
						} else if (opts.chosendate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
							var chosendate = new Date(opts.chosendate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
						} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
							var chosendate = today;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
							
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
						// insert the datepicker in the DOM
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
						datepicker = newDatepickerHTML();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
						jQuery("body").prepend(datepicker);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
						// position the datepicker
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
						var elPos = findPosition($this.get(0));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
						var x = (parseInt(opts.x) ? parseInt(opts.x) : 0) + elPos[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
						var y = (parseInt(opts.y) ? parseInt(opts.y) : 0) + elPos[1];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
						jQuery(datepicker).css({ position: 'absolute', left: x, top: y });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
					
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
						// bind events to the table controls
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
						jQuery("span", datepicker).css("cursor","pointer");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
						jQuery("select", datepicker).bind('change', function () { loadMonth (null, $this, datepicker, chosendate); });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
						jQuery("span.prevMonth", datepicker).click(function (e) { loadMonth (e, $this, datepicker, chosendate); });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
						jQuery("span.nextMonth", datepicker).click(function (e) { loadMonth (e, $this, datepicker, chosendate); });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
						jQuery("span.today", datepicker).click(function () { closeIt($this, datepicker, new Date()); });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
						jQuery("span.close", datepicker).click(function () { closeIt($this, datepicker); });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
						
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
						// set the initial values for the month and year select fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
						// and load the first month
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
						jQuery("select[name=month]", datepicker).get(0).selectedIndex = chosendate.getMonth();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
						jQuery("select[name=year]", datepicker).get(0).selectedIndex = Math.max(0, chosendate.getFullYear() - opts.startyear);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
						loadMonth(null, $this, datepicker, chosendate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
					
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
				});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
        });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
    // finally, I like to expose default plugin options as public so they can be manipulated.  one
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    // way to do this is to add a property to the already-public plugin fn
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
	jQuery.fn.simpleDatepicker.formatOutput = function (dateObj) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
		return (dateObj.getMonth() + 1) + "/" + dateObj.getDate() + "/" + dateObj.getFullYear();	
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
	};
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
	
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
	jQuery.fn.simpleDatepicker.defaults = {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
		// date string matching /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
		chosendate : today,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
		// date string matching /^\d{1,2}\/\d{1,2}\/\d{2}|\d{4}$/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
		// or four digit year
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
		startdate : today.getFullYear(), 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
		enddate : today.getFullYear() + 1,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
		
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
		// offset from the top left corner of the input element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
		x : 18, // must be in px
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
		y : 18 // must be in px
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
	};
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
})(jQuery);