$\' + value + \'<\/div>\';\n }\n else {\n return \'
\' + value + \'<\/div>\';\n }\n };\n\n var items = key.split(\'_\');\n if(!items) { return build_item(\'N/A\'); }\n\n items[0] = parseInt(items[0], 10) + 1;\n var key_month = (items[0] < 10) ? (\'0\' + items[0]) : items[0];\n var key_day = (items[1] < 10) ? (\'0\' + items[1]) : items[1];\n var content_date = items[2] + \'-\' + key_month + \'-\' + key_day;\n\n // NOTE: This loop is inefficient, however for our immediate\n // purposes, cell_content is only going to have 365 elements\n // which is one year of rates.\n for(var i = 0; i < cfg.cell_content.length; i++) {\n if(cfg.cell_content[i].date === content_date) {\n var value = cfg.cell_content[i].data;\n return build_item(value);\n }\n }\n if(cfg.use_custom_content) {\n return build_item(\'\');\n } else {\n return build_item(\'N/A\');\n }\n },\n\n markup: function(params) {\n var tr_node = params.tr_node;\n var td_class = \'yo-datepicker-day-empty\' + params.multi_cal;\n\n if(this.offset >= this.first_dow) {\n var tmp_date = new Date(this.year, this.month, this.day);\n var key = this.month + \'_\' + this.day + \'_\' + this.year;\n var td_id = params.yo_id + \'_\' + key;\n\n if(tmp_date.valueOf() > cfg.max_date.valueOf()) {\n td_class = \'yo-datepicker-day-noselect\' + params.multi_cal;\n _yodatepicker.create_day(tr_node, this.day, td_id, td_class);\n }\n else if(tmp_date.valueOf() < cfg.min_date.valueOf()) {\n td_class = \'yo-datepicker-day-noselect\' + params.multi_cal;\n _yodatepicker.create_day(tr_node, this.day, td_id, td_class);\n }\n else if(tmp_date.valueOf() === cfg.today.valueOf()) {\n td_class = \'yo-datepicker-day-current\' + params.multi_cal;\n _yodatepicker.create_day(tr_node, this.day, td_id, td_class);\n var tmp_elem = document.getElementById(td_id);\n if(tmp_elem && cfg.cell_content) {\n tmp_elem.innerHTML += this.jrs_more_content(key);\n }\n }\n else {\n td_class = \'yo-datepicker-day\' + params.multi_cal;\n _yodatepicker.create_day(tr_node, this.day, td_id, td_class);\n var tmp_elem = document.getElementById(td_id);\n if(tmp_elem && cfg.cell_content) {\n tmp_elem.innerHTML += this.jrs_more_content(key);\n }\n }\n\n if(this.day >= this.total_days) { this.first_dow = 999; }\n }\n else {\n _yodatepicker.create_day(tr_node, \'\', \'\', td_class);\n }\n this.offset++;\n if(this.offset > this.first_dow) { this.day++; }\n }\n };\n\n var close_datepicker = function() {\n if(!cfg.close_onselect) { return; }\n\n // Close the datepicker by setting innerHTML to empty string.\n var dp_elem = document.getElementById(cfg.dp_id_name);\n if(dp_elem && dp_elem.innerHTML) {\n dp_elem.innerHTML = \'\';\n }\n\n if(cfg.onclose_callback) { cfg.onclose_callback(); }\n };\n\n /* jshint loopfunc: true */\n\n var rate_available = function(elem) {\n if(!elem.innerHTML) { return false; }\n\n var rate_val = elem.innerHTML;\n if(!rate_val || rate_val === \'N/A\') {\n return false;\n }\n return true;\n };\n\n var yo_rate_item = function(js_date) {\n // The current date needs to be in a format that will work\n // with this \"yo-\" + dp_id_name + \"_2_18_2015\"\n var day_id = \'yo-\' + cfg.dp_id_name + \'_\' + js_date;\n var day_elem = document.getElementById(day_id);\n if(!day_elem) { return false; }\n\n var rate_class = \'yo-rate-item\';\n var rate_elem = day_elem.getElementsByClassName(rate_class);\n if(!rate_elem) { return false; }\n\n return rate_elem[0];\n };\n\n var reset_date_inputs = function() {\n cfg.date_range = { start: true, stop: false };\n\n var start_elem = document.getElementById(cfg.begin_id_name);\n start_elem.value = \'\';\n var stop_elem = document.getElementById(cfg.end_id_name);\n stop_elem.value = \'\';\n };\n\n var date_input_element = function() {\n var elem = \'\';\n if(cfg.use_date_range) {\n if(cfg.date_range.start) {\n elem = cfg.begin_id_name;\n document.getElementById(cfg.end_id_name).value = \'\';\n } else {\n elem = cfg.end_id_name;\n }\n } else {\n elem = cfg.id_name;\n }\n return elem;\n };\n\n var raw2date = function(raw_date) {\n // Take a raw_formatted date like 3_12_2015 and\n // returns a javascript Date object.\n var pieces = raw_date.split(\'_\');\n return new Date(pieces[2], pieces[0], pieces[1]);\n };\n\n var highlight_date = function(js_date, toggle) {\n toggle = (toggle) ? toggle : false;\n var id_name = \'yo-\' + cfg.dp_id_name + \'_\' + js_date;\n var day_elem = document.getElementById(id_name);\n if(toggle === true) {\n // toggle true: highlight the start date with the mouseover colors\n // day_elem.style.color = cfg.day_mouseover_fgcolor;\n day_elem.style.color = cfg.selected_rate_color;\n day_elem.style.backgroundColor = cfg.day_mouseover_bgcolor;\n var rate_elem = yo_rate_item(js_date);\n rate_elem.style.color = cfg.selected_rate_color;\n\n day_elem.onmouseleave = function() {\n this.style.color = cfg.selected_rate_color;\n this.style.backgroundColor = cfg.day_mouseover_bgcolor;\n var rate_elem = yo_rate_item(js_date);\n rate_elem.style.color = cfg.selected_rate_color;\n };\n } else {\n // toggle false: start date back to original colors\n day_elem.style.color = cfg.selected_rate_color;\n day_elem.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n var rate_elem = yo_rate_item(js_date);\n rate_elem.style.color = cfg.selected_rate_color;\n\n day_elem.onmouseleave = function() {\n this.style.color = cfg.day_mouseleave_fgcolor;\n this.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n var rate_elem = yo_rate_item(js_date);\n rate_elem.style.color = cfg.selected_rate_color;\n };\n }\n };\n\n /* jshint unused: false */\n var select_date = function(_mm, _dd, _yy) {\n try {\n if(_mm === undefined || _dd === undefined || _yy === undefined) {\n throw new YoException(\'undefined paramter(s)\');\n }\n\n var js_date = _mm + \'_\' + _dd + \'_\' + _yy;\n\n // If cfg.id_name has a value then we have a single calendar\n // datepicker. Otherwise we have a multi-month calendar and\n // cfg.date_range is an object that idicates what date is being\n // selected, either the begin date or the end date.\n if(cfg.id_name !== \'\' || cfg.date_range) {\n var elem = date_input_element();\n\n if(cfg.date_range && cfg.date_range.stop) {\n var start_date = raw2date(cfg.date_range.start_date_raw);\n var stop_date = raw2date(js_date);\n // do this check before we set stop_date_raw\n if(stop_date < start_date) {\n console.log(\'end date cannot be < start date\');\n return;\n } else if(start_date.getTime() === stop_date.getTime()) {\n // user clicked a stop_date same as the start_date\n\n // set start date highlight off\n highlight_date(cfg.date_range.start_date_raw, false);\n\n // clear the start_date\n reset_date_inputs();\n return;\n }\n\n cfg.date_range.stop_date_raw = js_date;\n stop_date = raw2date(cfg.date_range.stop_date_raw);\n _yodatepicker.highlight_selected_dates(start_date, stop_date);\n }\n\n if(cfg.date_range && cfg.date_range.start) {\n if(cfg.date_range.start) {\n // set colors back original values\n _yodatepicker.set_custom_day_colors();\n }\n // set the colors for the start date just selected\n highlight_date(js_date, true);\n\n cfg.date_range.start_date_raw = js_date;\n cfg.date_range.stop_date_raw = \'\';\n }\n if(cfg.use_date_range) { toggle_date_range(); }\n put_date_DOM(elem, _mm, _dd, _yy);\n }\n\n if(cfg.ondateselected_callback) { cfg.ondateselected_callback(); }\n\n cfg.current_start_date = raw2date(js_date);\n\n if(!cfg.use_date_range && cfg.close_onselect) {\n close_datepicker();\n } else if(cfg.use_date_range && cfg.date_range.start_date_raw && cfg.date_range.stop_date_raw && cfg.close_onselect) {\n close_datepicker();\n }\n } catch(e) {\n console.log(e.toString());\n return false;\n }\n return true;\n /* jshint unused: true */\n };\n\n var put_date_DOM = function(elem, _mm, _dd, _yy) {\n if(!elem) { return; }\n _mm++; // Note: _mm is the month number 0 - 11 so always add 1.\n\n var the_month = (_mm < 10) ? \'0\' + _mm : _mm.toString();\n var the_day = (_dd < 10) ? \'0\' + _dd : _dd.toString();\n\n /* jshint evil: true */\n if(cfg.locale === \'en\') {\n eval(\'document.getElementById(\"\' + elem + \'\").value=\' +\n \'the_month + \"/\" + the_day + \"/\" + _yy\');\n } else {\n eval(\'document.getElementById(\"\' + elem + \'\").value=\' +\n \'the_day + \"/\" + the_month + \"/\" + _yy\');\n }\n /* jshint evil: false */\n };\n\n var text = function(_text) {\n // Create and set a text node and return it.\n var node = document.createTextNode(_text);\n return node;\n };\n\n var element = function(_name, _attrs) {\n // Create and set an element node and return it.\n var node = document.createElement(_name);\n if(_attrs) {\n if(_attrs.id) { node.setAttribute(\'id\', _attrs.id); }\n if(_attrs.klass) { node.setAttribute(\'class\', _attrs.klass); }\n if(_attrs.style) { node.setAttribute(\'style\', _attrs.style); }\n if(_attrs.colspan) { node.setAttribute(\'colspan\', _attrs.colspan); }\n if(_attrs.value) { node.setAttribute(\'value\', _attrs.value); }\n if(_attrs.type) { node.setAttribute(\'type\', _attrs.type); }\n }\n return(node);\n };\n\n var remove_element = function(_node, _id) {\n if(document.getElementById(_id)) {\n _node.removeChild(document.getElementById(_id));\n }\n };\n\n var month_inc = function() {\n var scroll_date = new Date(cfg.yy, cfg.mn, cfg.today.getDate());\n if((scroll_date.getFullYear() === cfg.max_date.getFullYear()) &&\n (scroll_date.getMonth() >= cfg.max_date.getMonth())) {\n return;\n }\n\n if(cfg.mn < 11) { cfg.mn++; }\n else { cfg.mn = 0; cfg.yy++; }\n _yodatepicker.show();\n\n if(cfg.date_range) {\n var start_raw = cfg.date_range.start_date_raw;\n var stop_raw = cfg.date_range.stop_date_raw;\n if(!start_raw || !stop_raw) { return; }\n var start_date = raw2date(start_raw);\n var stop_date = raw2date(stop_raw);\n _yodatepicker.highlight_selected_dates(start_date, stop_date, true);\n }\n };\n\n var month_dec = function() {\n var scroll_date = new Date(cfg.yy, cfg.mn, cfg.today.getDate());\n if((scroll_date.getFullYear() === cfg.min_date.getFullYear()) &&\n (scroll_date.getMonth() <= cfg.min_date.getMonth())) {\n return;\n }\n\n if(cfg.mn > 0) { cfg.mn--; }\n else { cfg.mn = 11; cfg.yy--; }\n _yodatepicker.show();\n\n if(cfg.date_range) {\n var start_raw = cfg.date_range.start_date_raw;\n var stop_raw = cfg.date_range.stop_date_raw;\n if(!start_raw || !stop_raw) { return; }\n var start_date = raw2date(start_raw);\n var stop_date = raw2date(stop_raw);\n _yodatepicker.highlight_selected_dates(start_date, stop_date, true);\n }\n };\n\n var leap_year = function(yr) {\n return(yr % 400 === 0) || (yr % 4 === 0 && yr % 100 !== 0);\n };\n\n var get_dow_names = function(locale, dow_heading) {\n var names = [];\n switch(dow_heading) {\n case \'single_name\':\n names = dow_single_names(locale);\n break;\n case \'short_name\':\n names = dow_short_names(locale);\n break;\n case \'full_name\':\n names = dow_full_names(locale);\n break;\n default:\n names = dow_single_names(locale);\n }\n return names;\n };\n\n var dow_single_names = function(locale) {\n var names = [];\n switch(locale) {\n case \'es\':\n names = [\'D\', \'L\', \'M\', \'M\', \'J\', \'V\', \'S\'];\n break;\n case \'fr\':\n names = [\'D\', \'L\', \'M\', \'M\', \'J\', \'V\', \'S\'];\n break;\n case \'de\':\n names = [\'S\', \'M\', \'D\', \'M\', \'D\', \'F\', \'S\'];\n break;\n default:\n names = [\'S\', \'M\', \'T\', \'W\', \'T\', \'F\', \'S\'];\n }\n return names;\n };\n\n var dow_short_names = function(locale) {\n var names = [];\n switch(locale) {\n case \'es\':\n names = [\'Dom\', \'Lun\', \'Mar\', \'Mie\', \'Jue\', \'Vie\', \'Sab\'];\n break;\n case \'fr\':\n names = [\'Dim\', \'Lu\', \'Ma\', \'Me\', \'Jeu\', \'Vend\', \'Sam\'];\n break;\n case \'de\':\n names = [\'zo\', \'ma\', \'di\', \'wo\', \'do\', \'vr\', \'za\'];\n break;\n default:\n names = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\n }\n return names;\n };\n\n var dow_full_names = function(locale) {\n var names = [];\n switch(locale) {\n case \'es\':\n names = [\'Domingo\', \'Lunes\', \'Martes\', \'Miercoles\',\n \'Jueves\', \'Viernes\', \'Sabado\'];\n break;\n case \'fr\':\n names = [\'Dimanche\', \'Lundi\', \'Mardi\', \'Mercredi\',\n \'Jeudi\', \'Vendredi\', \'Samedi\'];\n break;\n case \'de\':\n names = [\'zondag\', \'maandag\', \'dinsdag\', \'woensdag\',\n \'donderdag\', \'vrijdag\', \'zaterdag\'];\n break;\n default:\n names = [\'Sunday\', \'Monday\', \'Tuesday\', \'Wednesday\',\n \'Thursday\', \'Friday\', \'Saturday\'];\n }\n return names;\n };\n\n var get_month_names = function(locale) {\n if(locale === undefined || locale === null) { locale = \'en\'; }\n\n if(locale === \'es\') {\n return([\'Enero\', \'Febrero\', \'Marzo\', \'Abril\',\n \'Mayo\', \'Junio\', \'Julio\', \'Augosto\',\n \'Septiembre\', \'Octubre\', \'Noviembre\', \'Diciembre\']);\n }\n else if(locale === \'fr\') {\n return([\'Janvier\', \'Fevrier\', \'Mars\', \'Avril\',\n \'Mai\', \'Juin\', \'Juillet\', \'Aout\',\n \'Septembre\', \'Octobre\', \'Novembre\', \'Decembre\']);\n }\n else if(locale === \'de\') {\n return([\'Januar\', \'Februar\', \'Marz\', \'April\',\n \'Mai\', \'Juni\', \'Juli\', \'August\',\n \'September\', \'Oktober\', \'November\', \'Dezember\']);\n }\n\n return([\'January\', \'February\', \'March\', \'April\', \'May\', \'June\', \'July\',\n \'August\', \'September\', \'October\', \'November\', \'December\']);\n };\n\n var days_in_month = function(month_num, full_year) {\n // Jan == 0, Feb == 1, Mar == 2, ...\n if(month_num === 0 || month_num === 2 || month_num === 4 ||\n month_num === 6 || month_num === 7 || month_num === 9 ||\n month_num === 11) {\n return(31);\n }\n else if(month_num === 3 || month_num === 5 ||\n month_num === 8 || month_num === 10) {\n return(30);\n }\n\n return(leap_year(full_year) ? 29 : 28);\n };\n\n var get_max_date = function(param_max_date) {\n // Return a date object set to max_date.\n // Acceptable parameter formats: 3M, 6M, 9M, 1Y, 2Y, * (infinity)\n var date = new Date();\n var month = date.getMonth();\n var year = date.getFullYear();\n\n if(param_max_date instanceof Date) { return(param_max_date); }\n\n switch(param_max_date) {\n case \'3M\':\n if((month + 3) > 11) { month = (month +3) % 12; year++; }\n else { month += 3; }\n break;\n case \'6M\':\n if((month + 6) > 11) { month = (month +6) % 12; year++; }\n else { month += 6; }\n break;\n case \'9M\':\n if((month + 9) > 11) { month = (month +9) % 12; year++; }\n else { month += 9; }\n break;\n case \'2Y\':\n year += 2;\n break;\n case \'*\': // infinity\n year = 3125;\n break;\n default: // default to \'1Y\'\n year += 1;\n }\n return(new Date(year, month, date.getDate()));\n };\n\n var get_min_date = function(param_min_date) {\n // Return a date object set to min_date.\n // Acceptable parameter formats: 0, 3M, 6M, 9M, 1Y, 2Y, * (infinity)\n var date = new Date();\n var month = date.getMonth();\n var year = date.getFullYear();\n\n // If a Date object is passed in, use that.\n if(param_min_date instanceof Date) { return(param_min_date); }\n\n switch(param_min_date) {\n case \'3M\':\n if((month - 3) < 0) { month = (month -3) % 12; year--; }\n else { month -= 3; }\n break;\n case \'6M\':\n if((month - 6) < 0) { month = (month -6) % 12; year--; }\n else { month -= 6; }\n break;\n case \'9M\':\n if((month - 9) < 0) { month = (month -9) % 12; year--; }\n else { month -= 9; }\n break;\n case \'1Y\':\n year -= 1;\n break;\n case \'2Y\':\n year -= 2;\n break;\n case \'*\':\n year = 1900;\n break;\n default:\n break; // default is the current date\n }\n return(new Date(year, month, date.getDate()));\n };\n\n // If date in the format of DD/MM/YYYY (non en dates), convert to Date object\n var dateToJSDate = function(date, locale) {\n if(date instanceof Date) {\n return date;\n }\n\n if(!locale || locale === \'en\') {\n return new Date(date);\n }\n\n var pieces = date.split(\'/\');\n\n return new Date(pieces[2], pieces[1] - 1, pieces[0]);\n };\n\n var cfg = configure(options);\n\n // This object is returned and represents the public properties and methods.\n var _yodatepicker = {\n version: \'yo-yo\',\n\n hide: function() {\n close_datepicker();\n },\n\n /* jshint loopfunc: true */\n highlight_selected_dates : function(start_date, stop_date) {\n if(!start_date || !stop_date) { return false; }\n var td_item = \'yo-datepicker-day-multi\';\n var rate_item = \'yo-rate-item\';\n var curr_item = \'yo-datepicker-day-current-multi\';\n\n var items = document.getElementsByClassName(td_item);\n\n if(cfg.months_to_display === 1) {\n td_item = \'yo-datepicker-day\';\n curr_item = \'yo-datepicker-day-current\';\n items = document.getElementsByClassName(td_item);\n }\n\n for(var i = 0; i < items.length; i++) {\n var id_date = items[i].id.replace(\'yo-\' + cfg.dp_id_name + \'_\', \'\');\n var curr_date = raw2date(id_date);\n var elem = document.getElementById(items[i].id);\n var item = elem.getElementsByClassName(rate_item);\n if(!item || item.length < 1) { continue; }\n\n // if the current date is between start and stop dates\n if(curr_date >= start_date && curr_date <= stop_date) {\n // change colors to hover colors\n elem.style.color = cfg.selected_rate_color;\n elem.style.backgroundColor = cfg.day_mouseover_bgcolor;\n // yo-rate-item\n item[0].style.color = cfg.selected_rate_color;\n\n elem.onmouseleave = function() {\n // leave hover colors on\n this.style.color = cfg.selected_rate_color;\n this.style.backgroundColor = cfg.day_mouseover_bgcolor;\n // yo-rate-item\n var r_item = this.getElementsByClassName(rate_item);\n if(!r_item) { return; }\n r_item[0].style.color = cfg.selected_rate_color;\n };\n } else {\n // change back to original\n item[0].style.color = cfg.rate_mouseleave_fgcolor;\n elem.style.color = cfg.day_mouseleave_fgcolor;\n elem.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n elem.onmouseleave = function() {\n this.style.color = cfg.day_mouseleave_fgcolor;\n this.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n // yo-rate-item\n var r_item = this.getElementsByClassName(rate_item);\n if(!r_item) { return; }\n r_item[0].style.color = cfg.rate_mouseleave_fgcolor;\n };\n }\n }\n\n // Adding/removing highlight from day-current\n var elem_curr = document.getElementsByClassName(curr_item)[0];\n if(elem_curr) {\n var id_date = elem_curr.id.replace(\'yo-\' + cfg.dp_id_name + \'_\', \'\');\n var curr_date = raw2date(id_date);\n var item = elem_curr.getElementsByClassName(rate_item);\n if(!item || item.length < 1) { return; }\n\n if(curr_date >= start_date && curr_date <= stop_date) {\n // yo-rate-item\n item[0].style.color = cfg.selected_rate_color;\n elem_curr.style.color = cfg.selected_rate_color;\n elem_curr.style.backgroundColor = cfg.day_mouseover_bgcolor;\n elem_curr.onmouseleave = function() {\n // leave hover colors on\n this.style.color = cfg.selected_rate_color;\n this.style.backgroundColor = cfg.day_mouseover_bgcolor;\n // yo-rate-item\n var r_item = this.getElementsByClassName(rate_item);\n if(!r_item) { return; }\n r_item[0].style.color = cfg.selected_rate_color;\n };\n } else {\n // change back to original\n item[0].style.color = cfg.rate_mouseleave_fgcolor;\n elem_curr.style.color = cfg.day_mouseleave_fgcolor;\n elem_curr.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n elem_curr.onmouseleave = function() {\n this.style.color = cfg.day_mouseleave_fgcolor;\n this.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n\n // yo-rate-item\n var r_item = this.getElementsByClassName(rate_item);\n if(!r_item) { return; }\n r_item[0].style.color = cfg.rate_mouseleave_fgcolor;\n };\n }\n }\n },\n /* jshint loopfunc: false */\n\n set_min_date: function(mdate) {\n // This will override the cfg.min_date param.\n if(!mdate instanceof Date) { return false; }\n\n cfg.min_date = mdate;\n\n cfg.mn = (cfg.currdate.getTime() < cfg.min_date.getTime()) ?\n cfg.min_date.getMonth() : cfg.currdate.getMonth();\n\n cfg.yy = (cfg.currdate.getTime() < cfg.min_date.getTime()) ?\n cfg.min_date.getFullYear() : cfg.currdate.getFullYear();\n\n return cfg.min_date;\n },\n\n create_title_header: function(params) {\n // Creates the header on the yodatepicker.\n try {\n if(!params.tbody || !params.month || !params.year) {\n throw new YoException(params);\n }\n\n var tr_class = \'yo-calendar-title-bar\' + params.multi_cal;\n var tr = params.tbody.appendChild(\n element(\'tr\', { klass: tr_class }));\n var yo_id = params.yo_id;\n\n // previous month navigation element\n var prev_style = \'yo-previous-month\' + params.multi_cal;\n var prev_id = yo_id + \'-prev-month\' + params.multi_cal + \'-\' +\n params.calendar_number;\n\n if(cfg.prev_fa_class) {\n tr.appendChild(element(\'td\', {klass: prev_style, colspan: \'1\'}))\n .appendChild(element(\'span\', {id: prev_id}))\n .appendChild(element(\'i\', {klass: cfg.prev_fa_class}));\n } else {\n tr.appendChild(element(\'td\', {klass: prev_style, colspan: \'1\'}))\n .appendChild(element(\'span\', {id: prev_id}))\n .appendChild(text(\'<\'));\n }\n\n // month name element\n var text_style = \'yo-calendar-month\' + params.multi_cal;\n tr.appendChild(element(\'td\', {klass: text_style, colspan: \'5\'}))\n .appendChild(text(params.month + \' \' + params.year));\n\n // next month navigation element\n var next_style = \'yo-next-month\' + params.multi_cal;\n var next_id = yo_id + \'-next-month\' + params.multi_cal + \'-\' +\n params.calendar_number;\n if(cfg.next_fa_class) {\n tr.appendChild(element(\'td\', {klass: next_style, colspan: \'1\'}))\n .appendChild(element(\'span\', {id: next_id}))\n .appendChild(element(\'i\', {klass: cfg.next_fa_class}));\n } else {\n tr.appendChild(element(\'td\', {klass: next_style, colspan: \'1\'}))\n .appendChild(element(\'span\', {id: next_id}))\n .appendChild(text(\'>\'));\n }\n\n // suppress inner nav buttons\n if(params.calendar_number > 0) {\n prev_id = \'yo-previous-month\' + params.multi_cal;\n document.getElementsByClassName(prev_id)[1].innerHTML = \'\';\n document.getElementsByClassName(prev_id)[1].style.cursor = \'default\';\n next_id = \'yo-next-month\' + params.multi_cal;\n document.getElementsByClassName(next_id)[0].innerHTML = \'\';\n document.getElementsByClassName(next_id)[0].style.cursor = \'default\';\n }\n } catch(e) {\n console.log(e.toString());\n return false;\n }\n return true;\n },\n\n create_dow_header: function(params) {\n // Creates the day-of-week header for yodatepicker.\n try {\n if(!params.tbody) { throw new YoException(params.tbody); }\n var tr = params.tbody.appendChild(element(\'tr\'));\n var td_class = \'yo-calendar-dow-title\' + params.multi_cal;\n for(var i = 0; i < cfg.day_names.length; i++) {\n tr.appendChild(element(\'td\', {klass: td_class}))\n .appendChild(text(cfg.day_names[i]));\n }\n } catch(e) {\n console.log(e.toString());\n return false;\n }\n return true;\n },\n\n create_empty_week: function(tbody_node) {\n // Creates an entire week with empty days.\n try {\n if(!tbody_node) { throw new YoException(tbody_node); }\n var multi_cal = (cfg.months_to_display > 1) ? \'-multi\' : \'\';\n var td_class = \'yo-datepicker-day-empty\' + multi_cal;\n var tr = tbody_node.appendChild(element(\'tr\'));\n for(var i = 0; i < 7; i++) {\n tr.appendChild(element(\'td\', {klass: td_class}))\n .appendChild(text(\' \'));\n }\n } catch(e) {\n console.log(e.toString());\n return false;\n }\n return true;\n },\n\n create_day: function(tr, content, _id, _klass) {\n // Styles for a single day (cell) should be one of these classes:\n //\n // .yo-datepicker-day // day is selectable\n // .yo-datepicker-day-current // day is the current day\n // .yo-datepicker-day-empty // empty content\n // .yo-datepicker-day-noselect // day is not selectable\n //\n // .yo-datepicker-day-multi // day is selectable\n // .yo-datepicker-day-current-multi // day is the current day\n // .yo-datepicker-day-empty-multi // empty content\n // .yo-datepicker-day-noselect-multi // day is not selectable\n try {\n tr.appendChild(element(\'td\', {klass: _klass, id: _id}))\n .appendChild(text(content));\n } catch(e) {\n console.log(e.toString());\n return false;\n }\n return true;\n },\n\n create_month_calendar: function(params) {\n var tbody_node = false;\n for(var i = 0; i < cfg.months_to_display; i++) {\n var table_class = \'yo-calendar\' + params.multi_cal;\n tbody_node = params.td_node\n .appendChild(element(\'table\', {klass: table_class}))\n .appendChild(element(\'tbody\'));\n\n citem.day = 1;\n citem.month = cfg.mn;\n citem.year = cfg.yy;\n\n if(i > 0) {\n if(cfg.mn < 11) { citem.month = cfg.mn +1; }\n else { citem.month = 0; citem.year = cfg.yy +1; }\n }\n\n cfg.currdate.setDate(1); // set day of month to the 1st\n cfg.currdate.setMonth(citem.month); // set the month\n cfg.currdate.setFullYear(citem.year); // set to 4-digit year\n\n citem.offset = 0;\n citem.first_dow = cfg.currdate.getDay(); // 0 - 6 (sun - sat)\n citem.total_days = days_in_month(cfg.currdate.getMonth(),\n cfg.currdate.getFullYear());\n\n this.create_title_header({\n tbody: tbody_node,\n month: cfg.month_names[citem.month],\n year: citem.year,\n calendar_number: i,\n multi_cal: params.multi_cal,\n yo_id: params.yo_id\n });\n\n this.create_dow_header({\n tbody: tbody_node,\n multi_cal: params.multi_cal\n });\n\n var weeks_created = 0;\n for(var j = 0; j < 6; j++) {\n if(citem.first_dow === 999) { break; }\n var yo_tbody_tr = tbody_node.appendChild(element(\'tr\'));\n for(var k = 0; k < 7; k++) {\n citem.markup({\n yo_id: params.yo_id,\n tr_node: yo_tbody_tr,\n multi_cal: params.multi_cal\n });\n }\n weeks_created++;\n }\n\n // Output empty rows if needed so we have 6 rows total.\n for(var b = 0; b < (6-weeks_created); b++) {\n this.create_empty_week(tbody_node);\n }\n }\n return tbody_node;\n },\n\n set_custom_nav_colors: function(css_ext) {\n if(cfg.prev_month_nav_color) {\n var klass_name = \'yo-previous-month\' + css_ext;\n var items = document.getElementsByClassName(klass_name);\n for(var i = 0; i < items.length; i++) {\n items[i].style.color = cfg.prev_month_nav_color;\n }\n }\n\n if(cfg.next_month_nav_color) {\n var klass_name = \'yo-next-month\' + css_ext;\n var items = document.getElementsByClassName(klass_name);\n for(var i = 0; i < items.length; i++) {\n items[i].style.color = cfg.next_month_nav_color;\n }\n }\n },\n\n /* jshint loopfunc: true */\n set_custom_day_colors: function(css_ext) {\n var td_item = \'yo-datepicker-day\' + css_ext;\n var rate_item = \'yo-rate-item\';\n var curr_item = \'yo-datepicker-day-current\' + css_ext;\n\n if(cfg.day_mouseover_bgcolor && cfg.day_mouseover_fgcolor) {\n // when mouseover this element change colors\n var items = document.getElementsByClassName(td_item);\n for(var i = 0; i < items.length; i++) {\n var elem = document.getElementById(items[i].id);\n if(!elem) { continue; }\n elem.style.color = cfg.selected_rate_color;\n elem.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n // yo-rate-item\n var item = elem.getElementsByClassName(rate_item);\n if(item[0]) {\n item[0].style.color = cfg.selected_rate_color;\n }\n // Mouse over event: setup colors\n items[i].onmouseover = function(event) {\n var id = event.srcElement.id;\n if(!id) { id = event.srcElement.parentElement.id; }\n var el = document.getElementById(id);\n if(!el) { return; }\n el.style.color = cfg.selected_rate_color;\n el.style.backgroundColor = cfg.day_mouseover_bgcolor;\n // yo-rate-item\n var item = el.getElementsByClassName(rate_item);\n if(item[0]) {\n item[0].style.color = cfg.selected_rate_color;\n }\n };\n }\n\n // changing colors of day-current on mouseover\n var elem_curr = document.getElementsByClassName(curr_item)[0];\n if(elem_curr) {\n elem_curr.style.color = cfg.selected_rate_color;\n elem_curr.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n elem_curr.onmouseover = function(event) {\n var id = event.srcElement.id;\n if(!id) { id = event.srcElement.parentElement.id; }\n\n var el = document.getElementById(id);\n if(el) {\n el.style.color = cfg.selected_rate_color;\n el.style.backgroundColor = cfg.day_mouseover_bgcolor;\n }\n\n // yo-rate-item\n var item = el.getElementsByClassName(rate_item);\n if(item[0]) {\n item[0].style.color = cfg.selected_rate_color;\n }\n };\n }\n }\n\n if(cfg.day_mouseleave_bgcolor && cfg.day_mouseleave_fgcolor) {\n // yo-rate-item: setup foreground color on all elements\n var items = document.getElementsByClassName(rate_item);\n\n // when mouseleave this element change colors\n items = document.getElementsByClassName(td_item);\n for(var i = 0; i < items.length; i++) {\n // Mouse leave event: setup colors\n items[i].onmouseleave = function(event) {\n var id = event.srcElement.id;\n if(!id) { id = event.srcElement.parentElement.id; }\n var elem = document.getElementById(id);\n if(!elem) { return; }\n elem.style.color = cfg.selected_rate_color;\n elem.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n // yo-rate-item\n var item = elem.getElementsByClassName(rate_item);\n if(item[0]) {\n item[0].style.color = cfg.selected_rate_color;\n }\n };\n }\n\n // changing colors of day-current on mouseleave\n var elem_curr = document.getElementsByClassName(curr_item)[0];\n if(elem_curr) {\n elem_curr.onmouseleave = function(event) {\n var id = event.srcElement.id;\n if(!id) { id = event.srcElement.parentElement.id; }\n\n var elem = document.getElementById(id);\n if(elem) {\n elem.style.color = cfg.selected_rate_color;\n elem.style.backgroundColor = cfg.day_mouseleave_bgcolor;\n }\n\n // yo-rate-item\n var item = elem.getElementsByClassName(rate_item);\n if(item[0]) {\n item[0].style.color = cfg.selected_rate_color;\n }\n };\n }\n }\n },\n /* jshint loopfunc: false */\n\n show: function() {\n var yo_id = \'yo-\' + cfg.dp_id_name;\n var root_node = document.getElementById(cfg.dp_id_name);\n var css_ext = (cfg.months_to_display > 1) ? \'-multi\' : \'\';\n\n if(!root_node) { throw new YoException(root_node); }\n\n if(document.getElementById(yo_id)) {\n remove_element(root_node, yo_id);\n }\n\n var td_node = root_node\n .appendChild(element(\'table\', {id: yo_id, klass: \'yo-content\'}))\n .appendChild(element(\'tbody\')).appendChild(element(\'tr\'))\n .appendChild(element(\'td\'));\n\n this.create_month_calendar({\n td_node: td_node,\n yo_id: yo_id,\n multi_cal: css_ext\n });\n\n this.set_custom_nav_colors(css_ext);\n this.set_custom_day_colors(css_ext);\n\n this.highlight_selected_dates(\n cfg.current_start_date, cfg.current_stop_date\n );\n\n // Attach event listeners for the previous and next buttons.\n var prev_month_id = yo_id + \'-prev-month\' + css_ext + \'-\';\n var next_month_id = yo_id + \'-next-month\' + css_ext + \'-\';\n var elem;\n for(var x = 0; x < cfg.months_to_display; x++) {\n elem = document.getElementById(prev_month_id + x);\n if(elem) {\n elem.onclick = month_dec;\n elem.style.display = \'block\';\n }\n\n elem = document.getElementById(next_month_id + x);\n if(elem) {\n elem.onclick = month_inc;\n elem.style.display = \'block\';\n }\n }\n\n // Attach event listeners to the following events so that the\n // datepicker will close when the user clicks outside the calendar.\n document.getElementsByTagName(\'body\')[0]\n .onmousedown = close_datepicker;\n\n // Event onmouseover is set to disable onmousedown so that when\n // mouseover the datepicker, mousedown doesn\'t close it.\n document.getElementById(yo_id).onmouseover = function(e) {\n // IE 7-8 does not support event.currentTarget but does\n // so for event.srcElement;\n var elem, elem_id, ev = e || window.event;\n\n try { elem = ev.currentTarget; }\n catch(err) { elem = ev.srcElement; }\n\n try { elem_id = elem.id; }\n catch(err) { elem_id = (elem) ? elem : yo_id; }\n\n if(elem_id) {\n document.getElementById(elem_id).onmouseover = function() {\n document.getElementsByTagName(\'body\')[0]\n .onmousedown = null;\n };\n }\n document.getElementsByTagName(\'body\')[0].onmousedown = null;\n };\n\n // Event onmouseout is set to close_datepicker.\n document.getElementById(yo_id).onmouseout = function(e) {\n // IE 7-8 does not support event.currentTarget but does\n // so for event.srcElement;\n var elem, elem_id, ev = e || window.event;\n\n try { elem = ev.currentTarget; }\n catch(err) { elem = ev.srcElement; }\n\n try { elem_id = elem.id; }\n catch(err) { elem_id = (elem) ? elem : yo_id; }\n\n if(elem_id) {\n document.getElementById(elem_id).onmouseout = function() {\n document.getElementsByTagName(\'body\')[0]\n .onmousedown = close_datepicker;\n };\n }\n document.getElementsByTagName(\'body\')[0]\n .onmousedown = close_datepicker;\n };\n\n // Bind event listeners to each day for the onclick event.\n // Get an array of elements by the class name so we can get\n // each element id name to bind the onclick handler.\n var day_selectors = \'yo-datepicker-day\' + css_ext;\n var day_tds = document.getElementsByClassName(day_selectors);\n for(var y = 0; y < day_tds.length; y++) {\n // string to match: \'yo-rates_calendar_id_9_22_2014\'\n // Split on \'_\' then we can use the last three elements.\n var items = day_tds[y].id.split(\'_\');\n var mmtmp = items[items.length -3];\n var ddtmp = items[items.length -2];\n var yytmp = items[items.length -1];\n var t_id = yo_id + \'_\' + mmtmp + \'_\' + ddtmp + \'_\' + yytmp;\n var s = \'document.getElementById(\"\' + t_id + \'\")\' +\n \'.onclick = function() { select_date(\' +\n mmtmp + \',\' + ddtmp + \',\' + yytmp + \'); };\';\n if(document.getElementById(t_id)) {\n /* jshint evil: true */\n eval(s);\n /* jshint evil: false */\n }\n }\n\n // The current day node will have a different class name so\n // we get that and bind the onclick handler.\n var selector = \'yo-datepicker-day-current\' + css_ext;\n var curr_day_td = document.getElementsByClassName(selector);\n if(curr_day_td.length > 0) {\n var items = curr_day_td[0].id.split(\'_\');\n var mmtmp = items[items.length -3];\n var ddtmp = items[items.length -2];\n var yytmp = items[items.length -1];\n var t_id = yo_id + \'_\' + mmtmp + \'_\' + ddtmp + \'_\' + yytmp;\n var s = \'document.getElementById(\"\' + t_id + \'\")\' +\n \'.onclick = function() \' + \'{ select_date(\' +\n mmtmp + \',\' + ddtmp + \',\' + yytmp + \'); };\';\n if(document.getElementById(t_id)) {\n /* jshint evil: true */\n eval(s);\n /* jshint evil: false */\n }\n }\n\n if(!cfg.cell_content && cfg.cell_content_url) {\n if(typeof(YoJax) === \'undefined\') {\n throw new YoException(\'YoJax is required\');\n }\n /* global YoJax */\n /* jshint latedef: false */\n YoJax.get(cfg.cell_content_url, {}, function(_response) {\n var response = JSON.parse(_response);\n cfg.cell_content = response.data.rates;\n _yodatepicker.show();\n });\n }\n\n return true;\n }\n };\n\n return _yodatepicker;\n};\n' + ' ' +
'// Declare function names.\nvar format_date, isNumeric, zeropad, DatePicked, set_date_fields;\nvar submit_ng, jrs_local_dates;\n\nif(!format_date) {\n format_date = function(ms) {\n var d = new Date(ms);\n return zeropad((d.getMonth() +1), 2) + \'/\' + zeropad(d.getDate(), 2) + \'/\' + d.getFullYear(); // Jan = 0\n }\n}\n\nif(!zeropad) {\n zeropad = function(num, zeros) {\n var retval = \'\';\n var numstr = num.toString();\n for(var i = numstr.length; i < zeros; i++) {\n retval += \'0\';\n }\n retval += numstr;\n return retval;\n }\n}\n\nvar lodging_rates_widget_submit = function(widget_id, dir, checkin, checkout) {\n var elem = document.getElementById(\'direction\');\n if(elem) { elem.value = dir; }\n\n elem = document.getElementById(\'start-date-\' + widget_id);\n if(elem) { elem.value = checkin; }\n\n elem = document.getElementById(\'end-date-\' + widget_id);\n if(elem) { elem.value = checkout; }\n\n document.getElementById(\'widget_booking_form-\' + widget_id).submit();\n}\n\nif(!DatePicked) {\n DatePicked = function(trigger, widget_id, datepicker) {\n var start_date_id = \'start-date-\' + widget_id;\n var end_date_id = \'end-date-\' + widget_id;\n\n var checkin_date = (document.getElementById(start_date_id)) ? document.getElementById(start_date_id).value : null;\n var checkout_date = (document.getElementById(end_date_id)) ? document.getElementById(end_date_id).value : null;\n\n var language = (document.getElementById(\'language\')) ? document.getElementById(\'language\').value : \'en\';\n var nights = document.getElementById(\'nights\');\n var oneDay = 1000*60*60*24;\n var DSToffset = 1000*60*60*4; // Take into consideration daylight-savings time change.\n var cindate, coutdate;\n\n // What triggered this function? If trigger is numeric then we have a widget id.\n trigger = (trigger == start_date_id || trigger == end_date_id) ? trigger : \'nights\';\n\n // Make format adjustments for locales.\n if(language !== \'en\') {\n cindate = (checkin_date.match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) ?\n new Date(checkin_date.split(\'/\').reverse().join(\'/\')) : null;\n coutdate = (checkout_date.match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) ?\n new Date(checkout_date.split(\'/\').reverse().join(\'/\')) : null;\n }\n else {\n cindate = (checkin_date.match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) ? new Date(checkin_date) : null;\n coutdate = (checkout_date.match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) ? new Date(checkout_date) : null;\n }\n\n if(trigger == start_date_id && cindate != null) {\n var num_nights = (nights && !isNaN(nights.value)) ? parseInt(nights.value) : 1;\n\n // Customer can stay longer than min_stay; once nights are set use this\n // value, until he resets by picking a different end date. The end-date\n // picker gets its min-date reset to reflect min-stay.\n// var search_min_stay = ;\n var search_min_stay = 1;\n var max_nights = Math.max(search_min_stay, num_nights);\n\n var max_checkout_date = new Date(cindate.getTime() + (oneDay * max_nights) + DSToffset);\n var min_checkout_date = new Date(cindate.getTime() + (oneDay * search_min_stay) + DSToffset);\n\n if(language !== \'en\') {\n var dmy_date = zeropad(max_checkout_date.getDate(), 2) + \'/\' +\n zeropad((max_checkout_date.getMonth() +1), 2) + \'/\' +\n max_checkout_date.getFullYear();\n document.getElementById(end_date_id).value = dmy_date;\n } else {\n document.getElementById(end_date_id).value = format_date(max_checkout_date);\n }\n\n // Set the minimum checkout date (minimum date selectable in datepicker).\n coutdate = max_checkout_date;\n if(datepicker) {\n var mdate = new Date(min_checkout_date.getFullYear(), min_checkout_date.getMonth(), min_checkout_date.getDate());\n datepicker.set_min_date(mdate);\n }\n }\n\n if(cindate != null && coutdate != null && trigger != \'nights\') {\n var difference = parseInt((coutdate.getTime() - cindate.getTime()) / oneDay);\n\n if(nights) nights.value = difference;\n\n // Set the end-date to check-in date + nights.\n var new_checkout_date = new Date(cindate.getTime() + (oneDay * difference) + DSToffset);\n\n var datepicker_last_date = new Date(\'03/29/2026\');\n\n if(datepicker_last_date && new_checkout_date.getTime() > datepicker_last_date.getTime()) {\n var new_checkout_date = datepicker_last_date;\n }\n\n if(language !== \'en\') {\n document.getElementById(end_date_id).value = zeropad(new_checkout_date.getDate(), 2) + \'/\' +\n zeropad((new_checkout_date.getMonth() +1), 2) + \'/\' +\n new_checkout_date.getFullYear();\n } else {\n document.getElementById(end_date_id).value = format_date(new_checkout_date);\n }\n\n }\n else if(cindate != null && nights != null && trigger == \'nights\') {//only fires on first entry\n if(parseInt(nights.value) < 1) {\n alert(\"You must select 1 or more nights.\");\n }\n }\n\n if(language != \'en\') { jrs_local_dates(widget_id); }\n else { set_date_fields(widget_id); }\n }\n}\n\nif(!set_date_fields) {\n set_date_fields = function(widget_id) {\n var elem_id = \'start-date-\' + widget_id;\n var start_date = document.getElementById(elem_id);\n\n elem_id = \'end-date-\' + widget_id;\n var end_date = document.getElementById(elem_id);\n var nights = document.getElementById(\'nights\');\n\n var sdate = (start_date) ? new Date(start_date.value) : null;\n var edate = (end_date) ? new Date(end_date.value) : null;\n\n if(nights && sdate && edate) {\n var ONE_DAY = 1000*60*60*24;\n // Add an offset that will work for date ranges that span\n // over a Daylight Savings Time change.\n var DSToffset = 1000*60*60*4;\n edate = new Date(edate.getTime() + DSToffset);\n nights.value = parseInt((edate.getTime() - sdate.getTime()) / ONE_DAY);\n }\n\n if(sdate) {\n document.getElementById(\'sDay\').value = zeropad(sdate.getDate(), 2);\n document.getElementById(\'sMonth\').value = zeropad((sdate.getMonth() +1), 2);\n document.getElementById(\'sYear\').value = sdate.getFullYear();\n }\n }\n}\n\nfunction submit_asp(widget_id, site_url, use_current_window) {\n // Not using jquery and need to encode the form elements (which jquery .serialize() would be used).\n var form_data = \'\';\n var container = document.getElementById(\'jrs_calendar_form-\' + widget_id);\n if(!container) {\n container = document.getElementById(\'jrs-widget-\' + widget_id);\n }\n var inputs = container.getElementsByTagName(\'input\');\n for(var i = 0; i < inputs.length; ++i) {\n // deal with inputs[index] element.\n var name = inputs[i].name;\n var value = inputs[i].value;\n form_data += name + \'=\' + value + \'&\';\n }\n\n if(document.getElementById(\'lodgingID\')) {\n var categories = document.getElementById(\'lodgingID\');\n var selected_value = categories.options[categories.selectedIndex].value;\n form_data += \'lodgingID=\' + selected_value + \'&\';\n }\n\n form_data = form_data.replace(/&$/, \'\'); // remove the last ampersand\n\n if(use_current_window) {\n window.location.replace(site_url + \'?\' + form_data);\n } else {\n window.open(site_url + \'?\' + form_data);\n }\n}\n\nfunction to_YYYYMMDD(date_param, locale) {\n // This function assumes that date_param is MM/DD/YYYY\n // or DD/MM/YYYY depending upon the locale.\n var result = \'\'\n var d = date_param.split(\'/\');\n if(d.length !== 3) { return result; }\n if(!locale) { locale = \'en\'; }\n\n if(locale === \'en\') {\n result = d[2].toString() + d[0].toString() + d[1].toString();\n }\n else {\n result = d[2].toString() + d[1].toString() + d[0].toString();\n }\n\n return result;\n}\n\nfunction location_params() {\n var form_data = \'\';\n var group_ids, region_group_ids, city_group_ids;\n\n group_ids = document.getElementById(\'jrs_location_group_id\');\n if(group_ids) {\n form_data += \'group_ids[]=\' + group_ids.value + \'&\';\n }\n\n city_group_ids = document.getElementById(\'jrs_location_city_group_id\');\n if(city_group_ids && city_group_ids.value) {\n form_data += \'jrs_location_city_group_id=\' + city_group_ids.value + \'&\';\n //document.getElementById(\'group_id\').value = city_group_ids.value;\n }\n\n if(city_group_ids && !city_group_ids.value) {\n region_group_ids = document.getElementById(\'jrs_location_region_group_id_flex\');\n if(region_group_ids && region_group_ids.value) {\n form_data += \'jrs_location_region_group_id=\' + region_group_ids.value + \'&\';\n }\n }\n\n return form_data;\n}\n\nfunction lodging_type_params() {\n // Using a select list, there can be only one value however if there\n // are multiple categories (lodging types) we would construct the\n // following: category_ids[]=101&category_ids[]235&...\n var form_data = \'\';\n var category_ids = document.getElementById(\'lodgingID\');\n if(category_ids) {\n form_data += \'category_ids[]=\' + category_ids.value + \'&\';\n }\n\n var lodging_detail_id = document.getElementById(\'lodging_detail_id\');\n if(lodging_detail_id) {\n form_data += \'lodging_detail_id=\' + lodging_detail_id.value + \'&\';\n }\n return form_data;\n}\n\nif(!submit_ng) {\n submit_ng = function(site_url, widget_id, locale) {\n // This function is used to submit form data to our angular-js\n // responsive template via querystring params.\n\n var form_data = \'\';\n var container = document.getElementById(\'jrs-widget-\' + widget_id);\n\n if(!container) {\n console.log(\'datepicker_utils.js.erb: submit_ng: container is undefined\');\n return false;\n }\n var inputs = container.getElementsByTagName(\'input\');\n if(!locale) { locale = \'en\'; }\n\n // Encode the form elements like jquery .serialize() would do.\n for(var i = 0; i < inputs.length; ++i) {\n switch(inputs[i].name) {\n case \'start-date-\' + widget_id:\n var checkin = to_YYYYMMDD(inputs[i].value, locale);\n form_data += \'checkin=\' + checkin + \'&\';\n break;\n case \'end-date-\' + widget_id:\n var checkout = to_YYYYMMDD(inputs[i].value, locale);\n form_data += \'checkout=\' + checkout + \'&\';\n break;\n case \'campaign\':\n form_data += \'campaign=\' + inputs[i].value + \'&\';\n break;\n case \'airport_code\':\n form_data += \'airport_fragment=\' + inputs[i].value + \'&\';\n break;\n case \'showFlightsInit\':\n form_data += \'showFlightsInit=1&\';\n break;\n }\n }\n form_data += lodging_type_params();\n form_data += location_params();\n\n if(locale !== \'en\') {\n form_data += \'locale=\' + locale + \'&\';\n }\n\n form_data = form_data.replace(/&$/, \'\'); // remove last ampersand\n form_data = form_data.replace(/ /g, \'%20\');\n\n var redirect_url = (site_url + \'?\' + form_data)\n\n if(redirect_url.split(\'?\').length > 1) {\n redirect_url = redirect_url.replace(/(.+\\?\\S+)\\?(.+)/, \'$1&$2\');\n }\n\n window.open(redirect_url);\n }\n}\n\nif(!jrs_local_dates) {\n jrs_local_dates = function(widget_id) {\n var start_date_id = \'start-date-\' + widget_id;\n var end_date_id = \'end-date-\' + widget_id;\n\n var now = new Date();\n var one_day = 1000*60*60*24;\n var DSToffset = 1000*60*60*4; // Take into consideration daylight-savings time change.\n\n // Reverse a date in the format of dd/mm/yyyy into yyyy/mm/dd and get a Date object.\n var checkin_date = new Date(document.getElementById(start_date_id).value.split(\'/\').reverse().join(\'/\'));\n var checkout_date = new Date(document.getElementById(end_date_id).value.split(\'/\').reverse().join(\'/\'));\n\n document.getElementById(\'sDay\').value = zeropad(checkin_date.getDate(), 2);\n document.getElementById(\'sMonth\').value = zeropad((checkin_date.getMonth() +1), 2);\n document.getElementById(\'sYear\').value = checkin_date.getFullYear();\n\n var nights = Math.ceil((checkout_date.getTime() - DSToffset - checkin_date.getTime()) / (one_day));\n document.getElementById(\'nights\').value = Math.max(nights, 1);\n }\n}\n\nfunction check_date_fields(start_date_offset, end_date_offset) {\n // Set default start-date & end-date values using the offset parameters.\n var start_date = (document.getElementById(start_date_id)) ? document.getElementById(start_date_id).value : \'\';\n var one_day = 1000*60*60*24;\n var language = (document.getElementById(\'language\')) ? document.getElementById(\'language\').value : \'en\';\n\n // If date is valid return, else continue.\n if(start_date.match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) { return; }\n\n // isNaN(null) returns false so check for null values.\n if(start_date_offset == null || end_date_offset == null) {\n start_date_offset = one_day;\n end_date_offset = one_day * 2;\n }\n else {\n start_date_offset = (isNaN(start_date_offset)) ? one_day : (parseInt(start_date_offset) * one_day);\n end_date_offset = (isNaN(end_date_offset)) ? one_day : (parseInt(end_date_offset) * one_day);\n }\n\n var curdate = new Date();\n var dsdate = new Date(curdate.getTime() + start_date_offset); // default start date\n var dedate = new Date(curdate.getTime() + end_date_offset); // default end date\n\n if(language !== \'en\') {\n document.getElementById(start_date_id).value = zeropad(dsdate.getDate(), 2) + \'/\' +\n zeropad((dsdate.getMonth() +1), 2) + \'/\' +\n dsdate.getFullYear();\n document.getElementById(end_date_id).value = zeropad(dedate.getDate(), 2) + \'/\' +\n zeropad((dedate.getMonth() +1), 2) + \'/\' +\n dedate.getFullYear();\n }\n else {\n document.getElementById(start_date_id).value = zeropad((dsdate.getMonth() +1), 2) + \'/\' +\n zeropad(dsdate.getDate(), 2) + \'/\' +\n dsdate.getFullYear();\n document.getElementById(end_date_id).value = zeropad((dedate.getMonth() +1), 2) + \'/\' +\n zeropad(dedate.getDate(), 2) + \'/\' +\n dedate.getFullYear();\n }\n DatePicked(\'nights\', null);\n}\n' + ' ' +
' query = \'&p=1824\' + // Partner id\n \'&pg=sh\' + // Search Type\n \'&si=\' + \'514\' + // Referral Code\n \'&shcy=\' + \'Cadillac\' + // Clone City\n \'&shst=\' + \'MI\' + // Clone State\n \'&shcr=\' + \'United States\' + // Clone Country\n \'&shid=\' + \'03/30/2024\' + // Check-in Date\n \'&shod=\' + \'03/31/2024\' + // Check-out Date\n \'&shna=1\' + // # Of Guests\n \'&ch=Book›Direct\'; // # Channel\n\n adara_script = document.createElement(\'script\');\n adara_script.type = \'text/javascript\';\n adara_script.src = \'//tag.yieldoptimizer.com/ps/ps?t=s\';\n adara_script.src += query;\n document.body.appendChild(adara_script);\n';
code += 'console.log(`Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com\nLicense - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n`);';
code += 'function filter_locations(select) {\n var selected_region_value = select.options[select.selectedIndex].value\n var selected_region = select.options[select.selectedIndex].text\n var widget_id = 1937;\n var city_select = document.getElementById(\"jrs_city_group_id\")\n var regions_map = {};\n\n var cities = [{ name: \"All Cities\", id: \"\" }];\n\n if(selected_region_value === \"\") {\n cities = cities.concat(null);\n } else {\n cities = cities.concat(regions_map[selected_region]);\n }\n\n cities = remove_duplicate_cities(cities);\n\n city_select.innerHTML = null;\n\n for(var i = 0; i < cities.length; i++) {\n var opt = document.createElement(\'option\');\n opt.name = cities[i].name;\n opt.value = cities[i].id;\n opt.innerHTML = cities[i].name;\n city_select.appendChild(opt);\n }\n}\n\nvar remove_duplicate_cities = function(cities) {\n var no_dups = [];\n for(var i = 0; i < cities.length; i++) {\n var found = false;\n for(var j = 0; j < no_dups.length; j++) {\n found = (cities[i].name === no_dups[j].name) ? true : false;\n if(found) { break; }\n }\n if(!found) { no_dups.push(cities[i]); }\n }\n return no_dups;\n};';
code += 'var start_datepicker_1937 = yodatepicker({\n dp_id_name: \"start-jrdatepicker-1937\", // selector id where to display the datepicker\n id_name: \"start-date-1937\", // selector id where to populate a selected date\n max_date: new Date(\"03/29/2025\"),\n min_date: \"03/31/2024\",\n locale: \'en\',\n onDateSelected: function() { DatePicked(\'start-date-1937\', \'1937\', end_datepicker_1937); },\n current_start_date: \"03/30/2024\",\n});\n\nvar end_datepicker_1937 = yodatepicker({\n dp_id_name: \"end-jrdatepicker-1937\", // selector id where to display the datepicker\n id_name: \"end-date-1937\", // selector id where to populate a selected date\n max_date: new Date(\"03/29/2025\"),\n min_date: \"03/31/2024\",\n locale: \'en\',\n onDateSelected: function() { DatePicked(\'end-date-1937\', \'1937\'); },\n current_start_date: \"03/31/2024\",\n});';
code += '';
append_script(script, code);
}
})();