/*!
 *
 * Copyright 2011, Rudolf Schmidt
 * 
 */
RT=window.RT||{};RT.Util={};RT.Util.extend=function(e,d){for(var f in d){if(d.hasOwnProperty(f)){e[f]=d[f]}}return e};String.prototype.endsWith=function(a){return(this.substr(this.length-a.length)===a)};RT.Util.extend(Array.prototype,{max:function(){return Math.max.apply(Math,this)}});Date.parseFromString=function(c){var a=c.match(/(\d{1,2})\.(\d{1,2})\.(\d{2,4})/);var b=c.match(/(\d{1,2}):(\d{2})/);if(a&&b){return new Date(a[3],a[2]-1,a[1],b[1],b[2])}return null};RT.Util.extend(Date.prototype,{beginningOfDay:function(){return this.clone().set({hour:0,minute:0,second:0,millisecond:0})},endOfDay:function(){return this.clone().set({hour:23,minute:59,second:59,milliseconds:999})},sameDay:function(a){var b=this.getDate()==a.getDate();if(this.sameYear(a)&&this.sameMonth(a)&&b){return true}return false},sameMonth:function(a){if(this.getMonth()==a.getMonth()){return true}return false},sameYear:function(a){if(this.getYear()==a.getYear()){return true}return false},hoursBetween:function(a){return Math.round(Math.abs(this-a)/3600000)},daysBetween:function(a){return Math.round(Math.abs(this-a)/86400000)}});RT.Queue={queue:function(b,a,c){RT.Queue._element().queue(b,a,c)},dequeue:function(b,a){RT.Queue._element().dequeue(b,a)},_element:function(){if(typeof($RMQueueElement)=="undefined"){$RMQueueElement=$('<div id="RMQueueElement" />')}return $RMQueueElement}};RT.UI={toggle:function(b,a){RT.Queue.queue(function(c){if($(b).is(":visible")){$(b).slideUp("slow",function(){c()})}else{c()}});RT.Queue.queue(function(c){if($(a).is(":hidden")){$(a).slideDown("slow",function(){c()})}else{c()}})}};RT.UI.Button={enable:function(a){RT.Queue.queue(function(b){$(a).find(".button .spinner:visible").parent().children().toggle();b()})},disable:function(a){RT.Queue.queue(function(b){$(a).find(".button .spinner:hidden").parent().children().toggle();b()})}};RT.Geocoder={first:function(a,c){var b;if(!a){c(b);return}RT.Geocoder._geocode({address:a,language:"DE",region:"de"},function(e,d){if(d==google.maps.GeocoderStatus.OK){var f=e[0].types[0];if(f=="street_address"||f=="locality"){b=e[0].formatted_address}}c(b)})},all:function(a,c){var b=[];if(!a){c(b);return}RT.Geocoder._geocode({address:a,language:"DE"},function(f,d){if(d==google.maps.GeocoderStatus.OK){for(var e=0;e<f.length;e++){b.push(f[e].formatted_address)}}c(b)})},_geocode:function(a,b){if(typeof($RMGeocoder)=="undefined"){$RMGeocoder=new google.maps.Geocoder()}$RMGeocoder.geocode(a,b)}};RT.Form=function(c,a,b){this._formElement=$(c);this._resultElement=$(a);this._queueElement=this._formElement;this._options=b||{};this._rmMap=new RT.Map(document.getElementById("requestMap"),this._options);this._applyValidations();this._applyPersonCountOptions("select#personCount");this._applySubmission()};RT.Util.extend(RT.Form.prototype,{_applyValidations:function(){var a=RT.Util.extend({rules:{departureTime:{time:true},arrivalTime:{time:true},departureDate:{germanDateInAdvance:14},arrivalDate:{germanDateInAdvance:14}}},this._options.validation||{});this._formElement.validate(a)},_applyPersonCountOptions:function(c){var d=$(c);var b=RT.Formula.Calculations;for(i=0;i<b.length;i++){var a=b[i].from+" bis "+b[i].to;d.append($('<option value="'+b[i].from+'">'+a+"</option>"))}},_applySubmission:function(){var a=this;this._formElement.submit(function(){RT.UI.Button.disable(a._formElement);if($(this).valid()){try{var b=a._formValues();a._hideResult();a._addFormValuesToResultContainer(b);a._calculatePrice(b);a._renderRoute(b);a._showResult()}catch(c){alert("error: "+c);a._hideResult()}}RT.UI.Button.enable(a._formElement);return false})},_hideResult:function(){var a=this;RT.Queue.queue(function(b){if(a._resultElement.is(":visible")){a._resultElement.fadeOut("fast",function(){b()})}else{b()}})},_showResult:function(){var a=this;RT.Queue.queue(function(b){if(a._resultElement.is(":hidden")){a._resultElement.fadeIn("fast",function(){b()})}else{b()}});RT.Queue.queue(function(b){a._rmMap.resize();b()})},_calculatePrice:function(a){var b=this;RT.Queue.queue(function(c){b._rmMap.price(a,function(d){b._addPriceToResultContainer(d);c()})})},_renderRoute:function(a){var b=this;RT.Queue.queue(function(c){b._rmMap.render(a,function(d){b._addDistanceAndDurationToResultContainer(d);b._rmMap.resize();c()})})},_formValues:function(){var b=this._formElement;var a={origin:b.find("#from").val(),destination:b.find("#to").val(),waypoints:new Array(),continuedAvailability:b.find("[@name='continuedAvailabilityGroup']:checked").val(),additionalStandby:b.find("#additionalStandby").val(),personCount:b.find("#personCount").val(),humanizedPersonCount:b.find("#personCount :selected").text(),departure:b.find("#departureDate").val()+" "+b.find("#departureTime").val(),arrival:b.find("#arrivalDate").val()+" "+b.find("#arrivalTime").val()};b.find(".waypoints").each(function(){if($.trim($(this).val())!=""){a.waypoints.push($(this).val())}});return a},_addFormValuesToResultContainer:function(b){var a=this._resultElement;this._populate(a,"#origin",b.origin);this._populate(a,"#destination",b.destination);this._populate(a,"#waypoints",b.waypoints);this._populate(a,"#departure",b.departure);this._populate(a,"#arrival",b.arrival);this._populate(a,"#personCount",b.humanizedPersonCount)},_addDistanceAndDurationToResultContainer:function(b){var a=this._resultElement;this._populate(a,"#distance",b.distance+" km (einfache Strecke)");this._populate(a,"#duration","ca. "+b.duration+" Stunden (einfache Fahrt ohne Pausenzeiten)")},_addPriceToResultContainer:function(b){var a=this._resultElement;this._populate(a,"#price",b+" &euro; (Hin- und R&uuml;ckfahrt)")},_populate:function(a,b,c){var d=c;if(c instanceof Array){d=c.join("; ")}a.find("td"+b).html(d);a.find("input"+b).val(d)}});RT.Map=function(b,a){this._mapElement=b;this._busOrigin=a.busOrigin||"99610 Vogelsberg, Germany";this._map=new google.maps.Map(this._mapElement,RT.Util.extend({mapTypeControl:false,navigationControl:false},a.map||{}));this._detaultDirectionOptions={travelMode:google.maps.DirectionsTravelMode.DRIVING,unitSystem:google.maps.DirectionsUnitSystem.METRIC};this._directionsService=new google.maps.DirectionsService();this._directionsRenderer=new google.maps.DirectionsRenderer();this._directionsRenderer.setMap(this._map);this._formula=new RT.Formula()};RT.Util.extend(RT.Map.prototype,{render:function(b,a){var e=this;var d=[];$.each(b.waypoints,function(f,g){d.push({location:g,stopover:true})});var c=RT.Util.extend({origin:b.origin,destination:b.destination,waypoints:d},this._detaultDirectionOptions);this._directionsService.route(c,function(g,f){if(f==google.maps.DirectionsStatus.OK){e._directionsRenderer.setDirections(g);var h=e._singleTripResult(g);a(h)}})},price:function(b,a){var e=this;var d=[];$.each(b.waypoints,function(f,g){d.push({location:g,stopover:true})});var c=RT.Util.extend({origin:e._busOrigin,destination:b.destination,waypoints:[{location:b.origin,stopover:true}].concat(d)},this._detaultDirectionOptions);this._directionsService.route(c,function(g,f){if(f==google.maps.DirectionsStatus.OK){var j=e._singleTripResult(g);var k=RT.Util.extend({startDate:Date.parseFromString(b.departure),endDate:Date.parseFromString(b.arrival),personCount:b.personCount,continuedAvailability:b.continuedAvailability,additionalStandby:b.additionalStandby},j);var h=e._formula.calculate(k);a(h)}})},resize:function(){google.maps.event.trigger(this._map,"resize")},_singleTripResult:function(a){var e=0;var d=0;for(var b=0;b<a.routes[0].legs.length;b++){e+=a.routes[0].legs[b].distance.value;d+=a.routes[0].legs[b].duration.value}var c={distance:parseFloat((e/1000).toFixed(2)),duration:Math.round(d/3600)};return c}});RT.Formula=function(a){this._options=RT.Util.extend({additionalCharge:150,additionalDailyStandbyCharge:150},a||{})};RT.Formula.Calculations=[{from:1,to:8,distancePrice:0.65,hourlyPrice:21,dailyPrice:150},{from:9,to:18,distancePrice:0.75,hourlyPrice:30,dailyPrice:230},{from:19,to:30,distancePrice:0.9,hourlyPrice:35,dailyPrice:350},{from:31,to:49,distancePrice:1.15,hourlyPrice:45,dailyPrice:400},{from:50,to:59,distancePrice:1.2,hourlyPrice:50,dailyPrice:450}];RT.Util.extend(RT.Formula.prototype,{calculate:function(b){if(!b){b={}}var a=parseInt(b.personCount)||0;var d=b.continuedAvailability||false;var m=b.additionalStandby||false;var g=parseFloat(b.distance)||0;var k=parseFloat(b.duration)||0;var c=b.startDate;var j=b.endDate;var n=j.clone();n.add(k).hours();var h=this._oneDayCharge(a,g,c,n);h+=this._additionalOneDayCharge(g,k,c,n);if(!c.sameDay(j)){if(d==true||d=="1"){h+=this._multipleDayCharge(a,c,j,m)}else{h*=2}}var e=5;var f=Math.ceil(h);var l=h%e;if(l>0){h=h-l+e}return parseFloat(h.toFixed(2))},_oneDayCharge:function(d,b,a,h){var c=a.hoursBetween(h);if(!a.sameDay(h)){c=a.hoursBetween(a.endOfDay())}var g=this._optionsForPersonCount(d);var e=b*2*parseFloat(g.distancePrice)||0;var f=c*parseFloat(g.hourlyPrice)||0;return[e,f].max()},_additionalOneDayCharge:function(b,c,a,d){if(b>=700||c>=9||a.hoursBetween(d)>=15){return parseFloat(this._options.additionalCharge)}return 0},_multipleDayCharge:function(b,a,f,e){var d=this._optionsForPersonCount(b);var g=a.daysBetween(f);if(g>1){g-=1}var c=g*parseFloat(d.dailyPrice)||0;if(e==true||e=="1"){c+=this._options.additionalDailyStandbyCharge||0}return c},_optionsForPersonCount:function(b){var a=RT.Formula.Calculations;for(var c=0;c<a.length;c++){if(b>=a[c].from&&b<=a[c].to){return a[c]}}return{}}});
