// returns the script element matching the current script's name (based on params[:action]) function selfLocate() { var scriptName = "widget_large_thin", hostName = "www.ridecharge.com", scripts = document.getElementsByTagName("script"), script, src; for(i = 0, j = scripts.length; i < j; ++i) { script = scripts[i]; src = script.getAttribute("src"); if(src && (src.indexOf(scriptName) != -1) && (src.indexOf(hostName) != -1) ) return script; } return false; } // inserts markup before some element, first wrapping it in a div function injectBefore(origNode, content) { var parent = origNode.parentNode, wrapper = document.createElement("div"); wrapper.innerHTML = content; parent.insertBefore(wrapper, origNode); return wrapper; } function emptyElement(elem) { while(elem.firstChild) elem.removeChild(elem.firstChild); } function replaceText(elem, txt) { txt = document.createTextNode(txt); emptyElement(elem); elem.appendChild(txt); } function addEvent(elem, evt, func, bind) { if(bind) { var oldFunc = func; func = function() { oldFunc.apply(bind, Array.prototype.slice.call(arguments)); }; } if(elem.addEventListener) elem.addEventListener(evt, func, false); else if(elem.attachEvent) elem.attachEvent("on" + evt, func); } function delegateListener(elem, childTagName, evt, func, bind) { } function preventEventDefault(evt) { if(evt.preventDefault) evt.preventDefault(); else evt.returnValue = false; } function getTarget(evt) { return (evt.target) ? evt.target : window.event.srcElement; } function clickIsWithin(elem, container) { if(elem == container) return true; var parent, success = false; while(elem.parentNode) { elem = elem.parentNode; if(elem == container) return true; } return false; } // !!!depends on events partial!!! function DateMgr(field) { // set field to today's date this.d = new Date; this.now = new Date; this.massageDate(); this.field = field; this.addIcon(); this.addCalendar(); this.setupMonth(); } DateMgr.prototype = { calendarDayBGColor: "white", calendarSelectedDayBGColor: "#ccc", // ensure date's minutes are multiple of 5, always round up massageDate: function() { var minutes = this.d.getMinutes(), diff; if(! ((minutes % 5) == 0)) { diff = minutes % 5; minutes = minutes + 5 - diff; this.d.setMinutes(minutes); } }, // add icon beside field, make clickable addIcon: function() { var fieldRow = this.field.parentNode, link = document.createElement("a"), img = document.createElement("img"); img.src = "http://www.gocurb.com/stylesheets/images/calendar_icon.gif"; img.style.border = "none"; img.style.position = "relative"; img.style.top = "0px"; img.style.left = "0px"; link.href="#"; link.style.position = "absolute"; link.style.left = "165px"; link.style.top = "12px"; this.link = link; this.icon = img; fieldRow.insertBefore(link, this.field); this.field.previousSibling.appendChild(img); addEvent(img, "click", this.showCalendar, this); }, // add calendar element (initially hidden) beside field addCalendar: function() { this.calendar = document.createElement("div"); var fieldRow = this.field.parentNode, cal = this.calendar, s = cal.style, tables, navLinks, selectBoxes; s.display = "none"; s.position = "absolute"; s.left = (parseInt(this.link.style.left, 10) + 20) + "px"; s.width = "260px"; s.zIndex = "5000"; cal.innerHTML = "
\n \n \n \n
<<\/a><\/td>\n Month<\/td>\n ><\/a><\/td>\n <\/tr>\n <\/tbody>\n <\/table>\n\n \n \n \n \n <\/tbody>\n <\/table>\n\n
Sun<\/th>\n Mon<\/th>\n Tue<\/th>\n Wed<\/th>\n Thu<\/th>\n Fri<\/th>\n Sat<\/th>\n <\/tr>\n <\/thead>\n
\n \n \n \n
\n Hour:\n \n Minutes:\n
 <\/td>\n <\/td>\n <\/tr>\n <\/tbody>\n <\/table>\n<\/div>"; tables = cal.getElementsByTagName("table"); navLinks = tables[0].getElementsByTagName("a"); addEvent(navLinks[0], "click", this.prevMonth, this); addEvent(navLinks[1], "click", this.nextMonth, this); selectBoxes = tables[2].getElementsByTagName("select"); this.hoursBox = selectBoxes[0]; addEvent(this.hoursBox, "change", this.setHour, this); this.minutesBox = selectBoxes[1]; addEvent(this.minutesBox, "change", this.setMinutes, this); this.okButton = tables[2].getElementsByTagName("input")[0]; addEvent(this.okButton, "click", this.hideCalendar, this); this.calendarMonth = tables[0].getElementsByTagName("td")[1]; this.calendarTable = tables[1].getElementsByTagName("tbody")[0]; addEvent(document.body, "click", this.handleClick, this); fieldRow.insertBefore(cal, this.field); }, // set the field with some date, if nothing passed in set to today's date updateField: function() { this.field.value = this.format(); }, // format a date string for display in a text field. Example: 6/9/2010 at 12:15PM format: function() { var o = this.humanReadableObject(); return o.month + "/" + o.day + "/" + o.year + " at " + o.hours + ":" + o.minutes + o.meridian; }, humanReadableObject: function() { var d = this.d, o = { day: d.getDate(), month: d.getMonth() + 1, year: d.getFullYear(), machineHours: d.getHours(), machineMinutes: d.getMinutes(), meridian: (d.getHours() >= 12) ? "PM" : "AM" }; o.hours = (o.machineHours > 12) ? (o.machineHours - 12) : ((o.machineHours == 0) ? 12 : o.machineHours); o.minutes = (o.machineMinutes.toString().length == 2) ? o.machineMinutes : "0" + o.machineMinutes; return o; }, // set up a month's data based on date entered in the field setupMonth: function() { this.month = this.d.getMonth(); this.year = this.d.getFullYear(); this.updateCalendar(); }, // set calendar's current month prevMonth: function(evt) { this.month -= 1; if(this.month < 0) { this.year -= 1; this.month = 11; } this.setD(); this.updateCalendar(); preventEventDefault(evt); }, nextMonth: function(evt) { this.month += 1; if(this.month > 11) { this.year += 1; this.month = 0; } this.setD(); this.updateCalendar(); preventEventDefault(evt); }, setDay: function(day) { this.d.setDate(day); this.updateField(); }, // called when user chooses hour or sets meridian via time picker setHour: function(evt) { var selectBox = getTarget(evt); this.d.setHours(selectBox.value); this.updateField(); }, setMinutes: function(evt) { var selectBox = getTarget(evt); this.d.setMinutes(selectBox.value); this.updateField(); }, // sets the running date object accordingly setD: function() { this.d.setMonth(this.month); this.d.setFullYear(this.year); this.updateField(); }, // update all markup for a given month updateCalendar: function() { var tempDate = new Date(this.d.valueOf()), day, daysInMonth = 31, calTable = this.calendarTable, dayOfWeek, weekRow, i, elem, monthStr = this.monthName() + " " + this.year; replaceText(this.calendarMonth, monthStr); emptyElement(calTable); // start rows weekRow = calTable.appendChild(document.createElement("tr")) // also update this.calendarTable with buildup of days for(day = 1; day <= daysInMonth; day++) { tempDate.setDate(day); if(tempDate.getMonth() == this.d.getMonth()) { dayOfWeek = tempDate.getDay(); // beginning of week if(dayOfWeek == 0 && day != 1) weekRow = calTable.appendChild(document.createElement("tr")); // if first day of month, might need empty spaces if(tempDate.getDate() == 1) { for(i = 0; i < dayOfWeek; i++) { elem = weekRow.appendChild(document.createElement("td")); replaceText(elem, " "); } } elem = weekRow.appendChild(document.createElement("td")); elem = elem.appendChild(document.createElement("a")); elem.href ="#"; replaceText(elem, tempDate.getDate()); elem.style.display = "block"; elem.style.color = "#096EA2"; elem.style.textIndent = "6px"; if(day == this.d.getDate()) { this.setSelectedDay(elem); } else elem.style.backgroundColor = this.calendarDayBGColor; } } this.massageDate(); // update time picker this.hoursBox.value = this.d.getHours(); this.minutesBox.value = this.d.getMinutes(); }, monthName: function() { var names = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; return names[this.month]; }, // show and hide calendar showCalendar: function(evt) { this.calendar.style.display = "block"; this.calendarShowing = true; preventEventDefault(evt); }, handleClick: function(evt) { if(this.calendarShowing) { if(evt) { var target = getTarget(evt); if(target == this.icon) return; else if(clickIsWithin(target, this.calendarTable)) { if(target.tagName.toLowerCase() == "a") return this.handleDayClick(evt); } else if(!clickIsWithin(target, this.calendar)) { this.hideCalendar(); } } } }, hideCalendar: function(evt) { if(this.calendarShowing && this.calendar.style.display == "block") { this.calendar.style.display = "none"; this.calendarShowing = false; } }, // handle click of day handleDayClick: function(evt) { var elem = getTarget(evt); if(this.d.getMonth() > this.now.getMonth() || elem.innerHTML >= this.now.getDate() || this.d.getYear() > this.now.getYear()) { this.setDay(elem.innerHTML); this.setSelectedDay(elem); } preventEventDefault(evt); }, setSelectedDay: function(elem) { if(this.oldDayElement) this.oldDayElement.style.backgroundColor = this.calendarDayBGColor; this.oldDayElement = elem; elem.style.backgroundColor = this.calendarSelectedDayBGColor; } }; var thisScript = selfLocate(); if(thisScript) { var markup = "
\n
\n
\n
\n

Curb<\/p>\n

3 FREE AND EASY ways to book a taxi.<\/p>\n\n

1: Book online right here<\/p>\n\n

\n
\n
\n
\n
\n
\n When:<\/span>\n