help editing a dhtml calendar

Discussion in 'JavaScript' started by fisofo, Sep 4, 2007.

  1. #1
    Hello! I am attempting to edit this dhtml calendar to my liking: http://www.dynarch.com/demos/jscalendar/

    Basically, I want the time to show up as two combo boxes (a <select> item) rather than the way it is (see example #2 on that page).

    Opening up the calendar.js file, I found the relevant code starting on line 846 and ending at 920. Here is the code I am referring to:
    
    (function(){
    			function makeTimePart(className, init, range_start, range_end) {
    				var part = Calendar.createElement("span", cell);
    				part.className = className;
    				part.innerHTML = init;
    				part.calendar = cal;
    				part.ttip = Calendar._TT["TIME_PART"];
    				part.navtype = 50;
    				part._range = [];
    				if (typeof range_start != "number")
    					part._range = range_start;
    				else {
    					for (var i = range_start; i <= range_end; ++i) {
    						var txt;
    						if (i < 10 && range_end >= 10) txt = '0' + i;
    						else txt = '' + i;
    						part._range[part._range.length] = txt;
    					}
    				}
    				Calendar._add_evs(part);
    				return part;
    			};
    			var hrs = cal.date.getHours();
    			var mins = cal.date.getMinutes();
    			var t12 = !cal.time24;
    			var pm = (hrs > 12);
    			if (t12 && pm) hrs -= 12;
    			var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
    			var span = Calendar.createElement("span", cell);
    			span.innerHTML = ":";
    			span.className = "colon";
    			var M = makeTimePart("minute", mins, 0, 59);
    			var AP = null;
    			cell = Calendar.createElement("td", row);
    			cell.className = "time";
    			cell.colSpan = 2;
    			if (t12)
    				AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
    			else
    				cell.innerHTML = "&nbsp;";
    
    			cal.onSetTime = function() {
    				var pm, hrs = this.date.getHours(),
    					mins = this.date.getMinutes();
    				if (t12) {
    					pm = (hrs >= 12);
    					if (pm) hrs -= 12;
    					if (hrs == 0) hrs = 12;
    					AP.innerHTML = pm ? "pm" : "am";
    				}
    				H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
    				M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
    			};
    
    			cal.onUpdateTime = function() {
    				var date = this.date;
    				var h = parseInt(H.innerHTML, 10);
    				if (t12) {
    					if (/pm/i.test(AP.innerHTML) && h < 12)
    						h += 12;
    					else if (/am/i.test(AP.innerHTML) && h == 12)
    						h = 0;
    				}
    				var d = date.getDate();
    				var m = date.getMonth();
    				var y = date.getFullYear();
    				date.setHours(h);
    				date.setMinutes(parseInt(M.innerHTML, 10));
    				date.setFullYear(y);
    				date.setMonth(m);
    				date.setDate(d);
    				this.dateClicked = false;
    				this.callHandler();
    			};
    		})();
    Code (markup):
    I tried replacing that, with this:
    (function(){
    			function makeTimePartHours(className, init) {
    				var part = Calendar.createElement("select", cell);
    				part.name = className;
    				part.id = className;
    				part.className = className;
    				part.calendar = cal;
    				part.navtype = 50;
    				if	(className == "hour") {
    					var option = Calendar.createElement('option');
    					option.value = 0;
    					option.appendChild(Calendar.createTextNode('12 am'));
    					part.appendChild(option);
    					if (init == 0) {
    						option.selected = true;
    						}
    				
    					for (i=1; i<=11; i++) {
    						option = Calendar.createElement('option');
    						option.value = i;
    						option.appendChild(Calendar.createTextNode(i+' am'));
    						part.appendChild(option);
    						if (init == i) {
    							option.selected = true;
    							}
    						}
    				
    					option = Calendar.createElement('option');
    					option.value = 12;
    					option.appendChild(Calendar.createTextNode('12 pm'));
    					part.appendChild(option);
    					if (init == 12) {
    						option.selected = true;
    						}
    				
    					for (i=1; i<=11; i++) {
    						option = Calendar.createElement('option');
    						option.value = i+12;
    						option.appendChild(Calendar.createTextNode(i+' pm'));
    						part.appendChild(option);
    						if (init == i+12) {
    							option.selected = true;
    							}
    						}
    				} else {
    					var minStep = 5;
    					var	minStr = "";
    					for (i=0; i<60; i+=minStep) {
    						if (i < 10) minStr = "0"+i;
    						else minStr = String(i);
    						var option = Calendar.createElement('option');
    						option.value = i;
    						option.appendChild(Calendar.createTextNode(minStr));
    						part.appendChild(option);
    						if ((init < (i+minStep))&&(init >= i)) option.selected = true;
    						}
    					}
    				Calendar._add_evs(part);
    				return part;
    			};
    			var hrs = cal.date.getHours();
    			var mins = cal.date.getMinutes();
    			//~ var t12 = !cal.time24;
    			//~ var pm = (hrs > 12);
    			//~ if (t12 && pm) hrs -= 12;
    			var H = makeTimePart("hour", hrs);
    			//~ var span = Calendar.createElement("span", cell);
    			//~ span.innerHTML = ":";
    			//~ span.className = "colon";
    			var M = makeTimePart("minute", mins);
    
    			cal.onSetTime = function() {
    				var hrs = this.date.getHours(),
    					mins = this.date.getMinutes();
    				//~ H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
    				//~ M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
    			};
    
    			cal.onUpdateTime = function() {
    				var date = this.date;
    				//~ var h = parseInt(H.innerHTML, 10);
    				//~ if (t12) {
    					//~ if (/pm/i.test(AP.innerHTML) && h < 12)
    						//~ h += 12;
    					//~ else if (/am/i.test(AP.innerHTML) && h == 12)
    						//~ h = 0;
    				//~ }
    				var d = date.getDate();
    				var m = date.getMonth();
    				var y = date.getFullYear();
    				date.setHours(H.value);
    				date.setMinutes(M.value);
    				date.setFullYear(y);
    				date.setMonth(m);
    				date.setDate(d);
    				this.dateClicked = false;
    				this.callHandler();
    			};
    		})();
    Code (markup):
    But I keep getting an "unexpected object" on line 912, which is this comment line: //~ var span = Calendar.createElement("span", cell);

    Doesn't make much sense. What do you guys think?
     
    fisofo, Sep 4, 2007 IP
  2. fisofo

    fisofo Peon

    Messages:
    2
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #2
    I'm having trouble editing the post, but anyway, I found a few of my mistakes, but now I'm getting "option.text is not a function"... here's the updated code:

    
    (function(){
    			function makeTimePart(className, init) {
    				var part = Calendar.createElement("select", cell);
    				part.name = className;
    				part.id = className;
    				part.className = className;
    				part.calendar = cal;
    				part.navtype = 50;
    				if	(className == "hour") {
    					var option = Calendar.createElement('option', part);
    					option.value = 0;
    					option.text('12 am');
    					if (init == 0) option.selected = true;
    				
    					for (i=1; i<=11; i++) {
    						option = Calendar.createElement('option');
    						option.value = i;
    						option.text(i+' am');
    						part.appendChild(option);
    						if (init == i) option.selected = true;
    					}
    				
    					option = Calendar.createElement('option');
    					option.value = 12;
    					option.text('12 pm');
    					part.appendChild(option);
    					if (init == 12) option.selected = true;
    				
    					for (i=1; i<=11; i++) {
    						option = Calendar.createElement('option');
    						option.value = i+12;
    						option.text(i+' pm');
    						part.appendChild(option);
    						if (init == i+12) option.selected = true;
    					}
    					
    				} else {
    					var minStep = 5;
    					var	minStr = "";
    					for (i=0; i<60; i+=minStep) {
    						if (i < 10) minStr = "0"+i;
    						else minStr = String(i);
    						option = Calendar.createElement('option');
    						option.value = i;
    						option.text(minStr);
    						part.appendChild(option);
    						if ((init < (i+minStep))&&(init >= i)) option.selected = true;
    					}
    				}
    				Calendar._add_evs(part);
    				return part;
    			};
    			var hrs = cal.date.getHours();
    			var mins = cal.date.getMinutes();
    			//~ var t12 = !cal.time24;
    			//~ var pm = (hrs > 12);
    			//~ if (t12 && pm) hrs -= 12;
    			var H = makeTimePart("hour", hrs);
    			//~ var span = Calendar.createElement("span", cell);
    			//~ span.innerHTML = ":";
    			//~ span.className = "colon";
    			var M = makeTimePart("minute", mins);
    
    			cal.onSetTime = function() {
    				var hrs = this.date.getHours(),
    					mins = this.date.getMinutes();
    				//~ H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
    				//~ M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
    			};
    
    			cal.onUpdateTime = function() {
    				var date = this.date;
    				//~ var h = parseInt(H.innerHTML, 10);
    				//~ if (t12) {
    					//~ if (/pm/i.test(AP.innerHTML) && h < 12)
    						//~ h += 12;
    					//~ else if (/am/i.test(AP.innerHTML) && h == 12)
    						//~ h = 0;
    				//~ }
    				var d = date.getDate();
    				var m = date.getMonth();
    				var y = date.getFullYear();
    				date.setHours(H.value);
    				date.setMinutes(M.value);
    				date.setFullYear(y);
    				date.setMonth(m);
    				date.setDate(d);
    				this.dateClicked = false;
    				this.callHandler();
    			};
    		})();
    
    Code (markup):
     
    fisofo, Sep 4, 2007 IP