var JABB = JABB || {};
JABB.version = "0.3";
JABB.Ajax = {
	onStart: null,
	onStop: null,
	onError: null,
	XMLHttpFactories: [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	],
	sendRequest: function (url, callback, postData) {
		var req = this.createXMLHTTPObject();
		if (!req) {
			return;
		}
		var method = (postData) ? "POST" : "GET";
		var calledOnce = false;
		req.open(method, url, true);
		//Refused to set unsafe header "User-Agent"
		//req.setRequestHeader('User-Agent', 'XMLHTTP/1.0');
		req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
		if (postData) {
			req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		}
		req.onreadystatechange = function () {
			switch (req.readyState) {
			case 1:
				if (!calledOnce) {
					JABB.Ajax.onAjaxStart();
					calledOnce = true;
				}
			break;
			case 2:
				return;
			break;
			case 3:
				return;
			break;
			case 4:
				JABB.Ajax.onAjaxStop();
				if (req.status == 200) {
					callback(req);
				} else {
					JABB.Ajax.onAjaxError();
				}
				delete req;
			break;
			}/*
			if (req.readyState != 4) {
				return;
			}
			if (req.status != 200 && req.status != 304) {
				return;
			}
			callback(req);*/
		};
		if (req.readyState == 4) {
			return;
		}
		req.send(postData);
	},
	onAjaxStart: function () {
		if (typeof this.onStart == 'function') {
			this.onStart();
		}
	},
	onAjaxStop: function () {
		if (typeof this.onStop == 'function') {
			this.onStop();
		}
	},
	onAjaxError: function () {
		if (typeof this.onError == 'function') {
			this.onError();
		}
	},
	createXMLHTTPObject: function () {
		var xmlhttp = false;
		for (var i = 0; i < this.XMLHttpFactories.length; i++) {
			try {
				xmlhttp = this.XMLHttpFactories[i]();
			}
			catch (e) {
				continue;
			}
			break;
		}
		return xmlhttp;
	},
	getJSON: function (url, callback) {
		this.sendRequest(url, function (req) {
			callback(eval("(" + req.responseText + ")"));
		});
	},
	postJSON: function (url, callback, postData) {
		this.sendRequest(url, function (req) {
			callback(eval("(" + req.responseText + ")"));
		}, postData);
	}, 
	get: function (url, container_id) {
		this.sendRequest(url, function (req) {
			document.getElementById(container_id).innerHTML = JABB.Utils.parseScript(req.responseText);
		});
	},
	post: function (url, container_id, postData) {
		this.sendRequest(url, function (req) {
			document.getElementById(container_id).innerHTML = JABB.Utils.parseScript(req.responseText);
		}, postData);
	}
};
JABB.Utils = {
	addClass: function (ele, cls) {
		if (!this.hasClass(ele, cls)) {
			ele.className += " " + cls;
		}
	},
	hasClass: function (ele, cls) {
		return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
	},
	removeClass: function (ele, cls) {
		if (this.hasClass(ele, cls)) {
			var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
			ele.className = ele.className.replace(reg, ' ');
		}
	},
	importCss: function (cssFile) {
		if (document.createStyleSheet) {
			document.createStyleSheet(cssFile);
		} else {
			var styles = "@import url(" + cssFile + ");";
			var newSS = document.createElement('link');
			newSS.rel = 'stylesheet';
			newSS.href = 'data:text/css,' + escape(styles);
			document.getElementsByTagName("head")[0].appendChild(newSS);
		}
	},
	importJs: function (jsFile) {
		var d = window.document;
		if (d.createElement) {
			var js = d.createElement("script");
			js.type = "text/javascript";
			js.src = jsFile;
			if (js) {
				d.getElementsByTagName("head")[0].appendChild(js);
			}
		}
	},
	getElementsByClass: function (searchClass, node, tag) {
		var classElements = new Array();
		if (node == null) {
			node = document;
		}
		if (tag == null) {
			tag = '*';
		}
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		for (var i = 0, j = 0; i < elsLen; i++) {
			if (pattern.test(els[i].className)) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	},
	addEvent: function (obj, type, fn) {
		if (obj.addEventListener) {
			obj.addEventListener(type, fn, false);
		} else if (obj.attachEvent) {
			obj["e" + type + fn] = fn;
			obj[type + fn] = function() { obj["e" + type + fn](window.event); };
			obj.attachEvent("on" + type, obj[type + fn]);
		} else {
			obj["on" + type] = obj["e" + type + fn];
		}
	},
	fireEvent: function (element, event) {
		if (!element) return false;
		if (document.createEventObject) {
			// dispatch for IE
			var evt = document.createEventObject();
			return element.fireEvent('on' + event, evt);
		} else {
			// dispatch for firefox + others
			var evt = document.createEvent("HTMLEvents");
			evt.initEvent(event, true, true); // event type,bubbling,cancelable
			return !element.dispatchEvent(evt);
		}
	},
	serialize: function (form) {
		if (!form || form.nodeName !== "FORM") {
			return undefined;
		}
		var i, j, q = [];
		for (i = form.elements.length - 1; i >= 0; i = i - 1) {
			if (form.elements[i].name === "") {
				continue;
			}
			switch (form.elements[i].nodeName) {
			case 'INPUT':
				switch (form.elements[i].type) {
				case 'text':
				case 'hidden':
				case 'password':
				case 'button':
				case 'reset':
				case 'submit':
					q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
					break;
				case 'checkbox':
				case 'radio':
					if (form.elements[i].checked) {
						q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
					}						
					break;
				case 'file':
					break;
				}
				break; 
			case 'TEXTAREA':
				q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
				break;
			case 'SELECT':
				switch (form.elements[i].type) {
				case 'select-one':
					q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[form.elements[i].selectedIndex].value));
					break;
				case 'select-multiple':
					for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
						if (form.elements[i].options[j].selected) {
							q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
						}
					}
					break;
				}
				break;
			case 'BUTTON':
				switch (form.elements[i].type) {
				case 'reset':
				case 'submit':
				case 'button':
					q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
					break;
				}
				break;
			}
		}
		return q.join("&");
	},
	extend: function (obj, args) {
		var i;
		for (i in args) {
			obj[i] = args[i];
		}
		return obj;
	},
	createElement: function (element) {
		if (typeof document.createElementNS != 'undefined') {
			return document.createElementNS('http://www.w3.org/1999/xhtml', element);
		}
		if (typeof document.createElement != 'undefined') {
			return document.createElement(element);
		}
		return false;
	},
	getEventTarget: function (e) {
		var targ;
		if (!e) {
			e = window.event;
		}
		if (e.target) {
			targ = e.target;
		} else if (e.srcElement) {
			targ = e.srcElement;
		}
		if (targ.nodeType == 3) {
			targ = targ.parentNode;
		}	
		return targ;
	},
	parseScript: function (_source) {
		var source = _source,
			scripts = [];
		while (source.indexOf(" -1) {
			var s = source.indexOf("", e);
			scripts.push(source.substring(s_e+1, e));
			source = source.substring(0, s) + source.substring(e_e+1);
		}
		for (var i = 0; i < scripts.length; i++) {
			try {
				eval(scripts[i]);
			} catch(ex) {
				// do what you want here when a script fails
			}
		}
		return source;
	},
	createCookie: function (name, value, days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			var expires = "; expires=" + date.toGMTString();
		}
		else var expires = "";
		document.cookie = name + "=" + value + expires + "; path=/";
	},
	readCookie: function (name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for (var i = 0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0) == ' ') c = c.substring(1, c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
		}
		return null;
	},
	eraseCookie: function (name) {
		this.createCookie(name, "", -1);
	}
};
/*
 * CalendarJS v1.2
 *
 * Copyright 2011, Dimitar Ivanov (http://www.bulgaria-web-developers.com/projects/javascript/calendar/)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL Version 3 
 * (http://www.opensource.org/licenses/gpl-3.0.html) license.
 * 
 * Date: Thu Sep 22 00:49:51 2011 +0300
 */
(function(window,undefined){var now=new Date(),today=[now.getFullYear(),now.getMonth(),now.getDate()].join("-"),midnight=new Date(now.getFullYear(),now.getMonth(),now.getDate()),d=window.document;function Calendar(options){this.isOpen=false;this.focus=false;this.opts={year:new Date().getFullYear(),month:new Date().getMonth(),dayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],dayNamesFull:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],monthNamesFull:["January","February","March","April","May","June","July","August","September","October","November","December"],startDay:0,weekNumbers:false,months:1,inline:false,disablePast:false,dateFormat:"Y-m-d",onBeforeOpen:function(){},onBeforeClose:function(){},onOpen:function(){},onClose:function(){},onSelect:function(){}};for(var key in options){if(options.hasOwnProperty(key)){this.opts[key]=options[key]}}this.init.call(this)}Calendar.Util={addClass:function(ele,cls){if(!this.hasClass(ele,cls)&&ele){ele.className+=ele.className.length>0?" "+cls:cls}},hasClass:function(ele,cls){if(ele&&typeof ele.className!="undefined"&&typeof ele.nodeType!="undefined"&&ele.nodeType===1){return ele.className.match(new RegExp("(\\s|^)"+cls+"(\\s|$)"))}return false},removeClass:function(ele,cls){if(this.hasClass(ele,cls)){var reg=new RegExp("(\\s|^)"+cls+"(\\s|$)");ele.className=ele.className.replace(reg," ")}},addEvent:function(obj,type,fn){if(obj.addEventListener){obj.addEventListener(type,fn,false)}else{if(obj.attachEvent){obj["e"+type+fn]=fn;obj[type+fn]=function(){obj["e"+type+fn](window.event)};obj.attachEvent("on"+type,obj[type+fn])}else{obj["on"+type]=obj["e"+type+fn]}}},getElementsByClass:function(searchClass,node,tag){var classElements=[];if(node===null){node=d}if(tag===null){tag="*"}var els=node.getElementsByTagName(tag);var elsLen=els.length;var pattern=new RegExp("(^|\\s)"+searchClass+"(\\s|$)");for(var i=0,j=0;i0&&i0&&i===months-1){return 2}else{if(i===0&&i===months-1){return 3}else{if(i===0&&i");Calendar.Util.addEvent(cell,"click",function(e){self.container.innerHTML="";for(i=0;i1){day-=7}while(day<=daysInMonth){jsdate=new Date(year,month,day+startDay);row=d.createElement("tr");if(self.opts.weekNumbers){cell=d.createElement("td");Calendar.Util.addClass(cell,"bcal-week");a=new Date(jsdate.getFullYear(),jsdate.getMonth(),jsdate.getDate()-(jsdate.getDay()||7)+3);b=new Date(a.getFullYear(),0,4);cell.appendChild(d.createTextNode(1+Math.round((a-b)/86400000/7)));row.appendChild(cell)}for(i=0;i<7;i++){cell=d.createElement("td");if(day>0&&day<=daysInMonth){cell.setAttribute("bcal-date",new Date(year,month,day).getTime());Calendar.Util.addClass(cell,"bcal-date");current=new Date(year,month,day);if(today===[current.getFullYear(),current.getMonth(),current.getDate()].join("-")){Calendar.Util.addClass(cell,"bcal-today")}text=d.createTextNode(day);cell.appendChild(text);if(self.opts.disablePast===true&¤t<=midnight){Calendar.Util.addClass(cell,"bcal-past")}else{Calendar.Util.addEvent(cell,"click",(function(self,cell){return function(){s_arr=Calendar.Util.getElementsByClass("bcal-selected",self.container,"td");for(si=0,slen=s_arr.length;sidate)?1:(this=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;}
var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);}
if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);}
if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);}
if(x.hour||x.hours){this.addHours(x.hour||x.hours);}
if(x.month||x.months){this.addMonths(x.month||x.months);}
if(x.year||x.years){this.addYears(x.year||x.years);}
if(x.day||x.days){this.addDays(x.day||x.days);}
return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(valuemax){throw new RangeError(value+" is not a valid value for "+name+".");}
return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;}
if(!x.second&&x.second!==0){x.second=-1;}
if(!x.minute&&x.minute!==0){x.minute=-1;}
if(!x.hour&&x.hour!==0){x.hour=-1;}
if(!x.day&&x.day!==0){x.day=-1;}
if(!x.month&&x.month!==0){x.month=-1;}
if(!x.year&&x.year!==0){x.year=-1;}
if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());}
if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());}
if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());}
if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());}
if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());}
if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());}
if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());}
if(x.timezone){this.setTimezone(x.timezone);}
if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);}
return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;}
var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}}
return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();};
Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;}
return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;}
if(!last&&q[1].length===0){last=true;}
if(!last){var qx=[];for(var j=0;j0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
if(rx[1].length1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
if(args){for(var i=0,px=args.shift();i2)?n:(n+(((n+2000)Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");}
var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});}
return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;}
for(var i=0;i<' + '/script>');
  }
  
  var modules = google.maps.modules = {};
  google.maps.__gjsload__ = function(name, text) {
    modules[name] = text;
  };
  
  google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    apiLoad([0.009999999776482582,[[["http://mt0.googleapis.com/vt?lyrs=m@249000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=m@249000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"m@249000000",["https://mts0.google.com/vt?lyrs=m@249000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.google.com/vt?lyrs=m@249000000\u0026src=api\u0026hl=en-US\u0026"]],[["http://khm0.googleapis.com/kh?v=145\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=145\u0026hl=en-US\u0026"],null,null,null,1,"145",["https://khms0.google.com/kh?v=145\u0026hl=en-US\u0026","https://khms1.google.com/kh?v=145\u0026hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?lyrs=h@249000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=h@249000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"h@249000000",["https://mts0.google.com/vt?lyrs=h@249000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.google.com/vt?lyrs=h@249000000\u0026src=api\u0026hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?lyrs=t@132,r@249000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=t@132,r@249000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"t@132,r@249000000",["https://mts0.google.com/vt?lyrs=t@132,r@249000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.google.com/vt?lyrs=t@132,r@249000000\u0026src=api\u0026hl=en-US\u0026"]],null,null,[["http://cbk0.googleapis.com/cbk?","http://cbk1.googleapis.com/cbk?"]],[["http://khm0.googleapis.com/kh?v=84\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=84\u0026hl=en-US\u0026"],null,null,null,null,"84",["https://khms0.google.com/kh?v=84\u0026hl=en-US\u0026","https://khms1.google.com/kh?v=84\u0026hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt?hl=en-US\u0026","http://mt1.googleapis.com/mapslt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/ft?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/ft?hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?hl=en-US\u0026","http://mt1.googleapis.com/vt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/loom?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/loom?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]]],["en-US","US",null,0,null,null,"http://maps.gstatic.com/mapfiles/","http://csi.gstatic.com","https://maps.googleapis.com","http://maps.googleapis.com"],["http://maps.gstatic.com/intl/en_us/mapfiles/api-3/15/10","3.15.10"],[2643995682],1,null,null,null,null,0,"",null,null,0,"http://khm.googleapis.com/mz?v=145\u0026",null,"https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"http://mt.googleapis.com/vt/icon",[["http://mt0.googleapis.com/vt","http://mt1.googleapis.com/vt"],["https://mts0.googleapis.com/vt","https://mts1.googleapis.com/vt"],[null,[[0,"m",249000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],0],[null,[[0,"m",249000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],3],[null,[[0,"m",249000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],0],[null,[[0,"m",249000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],3],[null,[[4,"t",132],[0,"r",132000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],0],[null,[[4,"t",132],[0,"r",132000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],3],[null,null,[null,"en-US","US",null,18],0],[null,null,[null,"en-US","US",null,18],3],[null,null,[null,"en-US","US",null,18],6],[null,null,[null,"en-US","US",null,18],0],["https://mts0.google.com/vt","https://mts1.google.com/vt"],"/maps/vt"],2,500], loadScriptTime);
  };
  var loadScriptTime = (new Date).getTime();
  getScript("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/15/10/main.js");
})();
(function (window, undefined) {
	var document = window.document;
	
	function CR(options) {
		if (!(this instanceof CR)) {
			return new CR(options);
		}
		this.container = null;
		this.passed = {'first': false, 'second': false, 'third': false, 'fourth': false};
		this.current = 'loadSearch';
		this.opts = {
			folder: ""
		};
		for (var attr in options) {
			if (options.hasOwnProperty(attr)) {
				this.opts[attr] = options[attr];
			}
		}
		this.init();
		return this;
	}
	function dateFormat(str, format) {
		var jQuery = ['d', 'dd', 'm', 'mm', 'yy'],
			dateJs = ['d', 'dd', 'M', 'MM', 'yyyy'],
			php = ['j', 'd', 'n', 'm', 'Y'],
			limiters = ['.', '-', '/'],
			stack = [];
		switch (format) {
			case 'jquery':
				stack = jQuery;
				break;
			case 'datejs':
				stack = dateJs;
				break;
			default:
				return str;
		}
		for (var i = 0, len = limiters.length; i < len; i++) {
			if (str.indexOf(limiters[i]) !== -1) {
				var iFormat = str.split(limiters[i]);
				return [ 
					stack[php.indexOf(iFormat[0])], 
					stack[php.indexOf(iFormat[1])], 
					stack[php.indexOf(iFormat[2])]
				].join(limiters[i]);
			}
		}
		return str;
	}
	if (!Array.prototype.indexOf) {  
		Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {  
			"use strict";  
            if (this == null) {  
                throw new TypeError();  
            }  
            var t = Object(this);  
            var len = t.length >>> 0;  
            if (len === 0) {  
                return -1;  
            }  
            var n = 0;  
            if (arguments.length > 0) {  
                n = Number(arguments[1]);  
                if (n != n) { // shortcut for verifying if it's NaN  
                    n = 0;  
                } else if (n != 0 && n != Infinity && n != -Infinity) {  
                    n = (n > 0 || -1) * Math.floor(Math.abs(n));  
                }  
            }  
            if (n >= len) {  
                return -1;  
            }  
            var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);  
            for (; k < len; k++) {  
                if (k in t && t[k] === searchElement) {  
                    return k;  
                }  
            }  
            return -1;  
        }  
    }
	CR.prototype = {
		init: function () {
			var self = this;
			self.container = document.getElementById("crContainer");
			self.loadSearch();
			
			var btns = {};
			btns[self.opts.closeButton] = function (button) {
				this.close();
			};
			
			self.overlayTerms = new OverlayJS({
				selector: "crDialogTerms",
				modal: true,
				width: 640,
				height: 480,
				onBeforeOpen: function () {
					var that = this;
					JABB.Ajax.sendRequest(self.opts.folder + "index.php?controller=Front&action=getTerms", function (req) {
						that.content.innerHTML = req.responseText;
					});
				},
				buttons: btns
			});
			
			self.overlayMap = new OverlayJS({
				selector: "crDialogMap",
				width: 640,
				height: 480,
				modal: true,
				onOpen: function () {
					var that = this,
						canvasId = 'ojs-content-' + this.id;
						
					JABB.Ajax.getJSON(self.opts.folder + "index.php?controller=Front&action=getLocations", function (data) {
						var map = new google.maps.Map(document.getElementById(canvasId), {
							zoom: 8,
							mapTypeId: google.maps.MapTypeId.ROADMAP
						});
						
						if (data && data.length) {
							var i, len, markers = [], _latLng, _marker, _info;
							for (i = 0, len = data.length; i < len; i++) {
								_latLng = new google.maps.LatLng(data[i].lat, data[i].lng);
								_marker = new google.maps.Marker({
									map: map,
									position: _latLng
								});
								_info = new google.maps.InfoWindow({
									content: ['', data[i].name, '
',
										data[i].state, ', ', data[i].city, ' ', data[i].zip, '
', 
										data[i].address_1, '
', 
										'Email: ', data[i].email, '
',
										'Phone: ', data[i].phone, '
',	
										'Opening Time:
',
										data[i].opening_time.replace(/\n/, '
')].join("")
								});
								google.maps.event.addListener(_marker, "click", function (info, marker) {
									return function () {
										info.open(map, marker);
									};
								}(_info, _marker));
								if (i == len - 1) {
									map.setCenter(_latLng);
								}
								markers.push(_marker);
							}								
						}							
					});							
				},
				buttons: btns
			});
		},
		bindMenu: function () {
			var self = this,
				breadcrumbsEl = JABB.Utils.getElementsByClass("crBreadcrumbsEl", self.container, "A"),
				localeEl = JABB.Utils.getElementsByClass("crLocaleEl", self.container, "A"),
				i, len;
			for (i = 0, len = breadcrumbsEl.length; i < len; i++) {
				switch (parseInt(breadcrumbsEl[i].getAttribute("rel"), 10)) {
					case 2:
						if (!self.passed.first) {
							breadcrumbsEl[i].style.cursor = "default";
						}
						break;
					case 3:
						if (!self.passed.second) {
							breadcrumbsEl[i].style.cursor = "default";
						}
						break;
					case 4:
						if (!self.passed.third) {
							breadcrumbsEl[i].style.cursor = "default";
						}
						break;
				}
				breadcrumbsEl[i].onclick = function (inst) {
					return function (e) {
						switch (parseInt(this.getAttribute("rel"), 10)) {
							case 1:
								inst.loadSearch();
								break;
							case 2:
								if (inst.passed.first) {
									inst.loadCars();
								}
								break;
							case 3:
								if (inst.passed.second) {
									inst.loadExtras();
								}
								break;
							case 4:
								if (inst.passed.third) {
									inst.loadCheckout();
								}
								break;
						}
						if (e && e.preventDefault) {
							e.preventDefault();
						}
						return false;
					};
				}(self);
			}
			for (i = 0, len = localeEl.length; i < len; i++) {
				localeEl[i].onclick = function (inst) {
					return function (e) {
						inst.setLocale(this.getAttribute("rel"));
						if (e && e.preventDefault) {
							e.preventDefault();
						}
						return false;
					};
				}(self);
			}
		},
		bindTabs: function () {
			var self = this,
				arr = JABB.Utils.getElementsByClass("crTabsLink", self.container, "a"),
				i, len;
			for (i = 0, len = arr.length; i < len; i++) {
				arr[i].onclick = function (inst) {
					return function (e) {
						if (e && e.preventDefault) {
							e.preventDefault();
						}
						inst.loadCars.apply(inst, [null, this.getAttribute("rel"), inst.transmission]);
						return false;
					};
				}(self);
			}
			
			arr = JABB.Utils.getElementsByClass("crSort", self.container, "a");
			for (i = 0, len = arr.length; i < len; i++) {
				arr[i].onclick = function (inst) {
					return function (e) {
						if (e && e.preventDefault) {
							e.preventDefault();
						}
						var rel = this.getAttribute("rel");
						inst.loadCars.apply(inst, [null, inst.size, inst.transmission, rel.split("|")[0], rel.split("|")[1]]);
						return false;
					};
				}(self);
			}
			
			var transmission = document.getElementById("crTransmission");
			if (transmission) {
				transmission.onchange = function (e) {
					self.loadCars.apply(self, [null, self.size, this.options[this.selectedIndex].value, self.col_name, self.direction]);
				};
			}
		},
		bindSearch: function () {
			var self = this,
				dateFrom = new Calendar({
					element: "cr_date_from",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				dateTo = new Calendar({
					element: "cr_date_to",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				lnkFrom = document.getElementById("crDateFrom"),
				lnkTo = document.getElementById("crDateTo"),
				btnQuote = document.getElementById("crBtnQuote"),
				btnMap = document.getElementById("crBtnMap"),
				sameLoc = document.getElementById("cr_same_location"),
				returnLoc = document.getElementById("crReturnBox");
			self.elFrom = document.getElementById("cr_date_from");
			self.elTo = document.getElementById("cr_date_to");
			self.elHFrom = document.getElementById("cr_hour_from");
			self.elMFrom = document.getElementById("cr_minutes_from");
			self.elHTo = document.getElementById("cr_hour_to");
			self.elMTo = document.getElementById("cr_minutes_to");
			
			function reCalc() {
				var from = Date.parseExact(this.elFrom.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHFrom.value, 10) * 3600000) + (parseInt(this.elMFrom.value, 10) * 60000),
					to = Date.parseExact(this.elTo.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHTo.value, 10) * 3600000) + (parseInt(this.elMTo.value, 10) * 60000),
					nd = document.getElementById("crNumDays"),
					days;
				if (from !== null && to !== null) {
					days = Math.ceil((to - from) / 86400000);
					if (days > 0) {
						nd.lastChild.innerHTML = days;
						nd.style.display = "";
					} else {
						nd.style.display = "none";
					}
				} else {
					nd.style.display = "none";
				}
			}	
			
			if (lnkFrom) {
				lnkFrom.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateFrom.isOpen ? dateFrom.close() : dateFrom.open();
					return false;
				};
			}
			if (lnkTo) {
				lnkTo.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateTo.isOpen ? dateTo.close() : dateTo.open();
					return false;
				};
			}
			if (btnMap) {
				btnMap.onclick = function (e) {
					self.overlayMap.open();
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					return false;
				}
			}
			if (sameLoc && returnLoc) {
				function bindLoc(el) {
					if (this.checked) {
						el.style.display = "none";
					} else {
						el.style.display = "";
					}
				}
				sameLoc.onchange = function () {
					bindLoc.call(this, returnLoc);
				};
				sameLoc.onclick = function () {
					bindLoc.call(this, returnLoc);
				};
			}
			if (btnQuote) {
				btnQuote.onclick = function () {
					this.disabled = true;
					if (!self.validateSearch(this)) {
						this.disabled = false;
						return;
					}
					self.passed.first = true;
					self.loadCars.apply(self, [JABB.Utils.serialize(document.getElementById("crFormSearch"))]);
				};
			}
		},
		bindCars: function () {
			var el = document.getElementById('hideorshow');
			el.parentNode.removeChild(el);
			var self = this,
				btnQuote = document.getElementById("crBtnQuote"),
				btnContinue = JABB.Utils.getElementsByClass("crBtnContinue", self.container, "button"),
				lnkFrom = document.getElementById("crDateFrom"),
				lnkTo = document.getElementById("crDateTo"),
				dateFrom = new Calendar({
					element: "cr_date_from",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				dateTo = new Calendar({
					element: "cr_date_to",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				i, len = btnContinue.length;
			self.elFrom = document.getElementById("cr_date_from");
			self.elTo = document.getElementById("cr_date_to");
			self.elHFrom = document.getElementById("cr_hour_from");
			self.elMFrom = document.getElementById("cr_minutes_from");
			self.elHTo = document.getElementById("cr_hour_to");
			self.elMTo = document.getElementById("cr_minutes_to");
			
			function reCalc() {
				var from = Date.parseExact(this.elFrom.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHFrom.value, 10) * 3600000) + (parseInt(this.elMFrom.value, 10) * 60000),
					to = Date.parseExact(this.elTo.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHTo.value, 10) * 3600000) + (parseInt(this.elMTo.value, 10) * 60000),
					nd = document.getElementById("crNumDays"),
					days;
				if (from !== null && to !== null) {
					days = Math.ceil((to - from) / 86400000);
					if (days > 0) {
						nd.lastChild.innerHTML = days;
						nd.style.display = "";
					} else {
						nd.style.display = "none";
					}
				} else {
					nd.style.display = "none";
				}
			}	
			
			if (lnkFrom) {
				lnkFrom.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateFrom.isOpen ? dateFrom.close() : dateFrom.open();
					return false;
				};
			}
			if (lnkTo) {
				lnkTo.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateTo.isOpen ? dateTo.close() : dateTo.open();
					return false;
				};
			}
			for (i = 0; i < len; i++) {
				btnContinue[i].onclick = function (inst) {
					return function (e) {
						inst.passed.second = true;
						inst.type_id = this.value;
						//inst.loadExtras();
						inst.passed.third = true;
						inst.loadCheckout(this.value);
					};
				}(self);
			}
			if (btnQuote) {
				btnQuote.onclick = function () {
					this.disabled = true;
					if (!self.validateSearch(this)) {
						this.disabled = false;
						return;
					}
					self.passed.first = true;
					self.loadCars.apply(self, [JABB.Utils.serialize(document.getElementById("crFormSearch"))]);
				};
			}
		},
		bindExtras: function () {
			var self = this,
				btnCheckout = document.getElementById("crBtnCheckout"),
				btnConditions = document.getElementById("crBtnConditions"),
				btnWhen = document.getElementById("crBtnWhen"),
				btnChoise = document.getElementById("crBtnChoise"),
				add = JABB.Utils.getElementsByClass("crBtnAdd", self.container, "button"),
				remove = JABB.Utils.getElementsByClass("crBtnRemove", self.container, "button"),
				i, len;
			if (btnCheckout) {
				btnCheckout.onclick = function () {
					/*
					self.passed.third = true;
					self.loadCheckout();
					*/
				};
			}
			if (btnConditions) {
				btnConditions.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.overlayTerms.open();
					return false;
				}
			}
			if (btnWhen) {
				btnWhen.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.loadSearch();
					return false;
				};
			}
			if (btnChoise) {
				btnChoise.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.loadCars();
					return false;
				};
			}
			for (i = 0, len = add.length; i < len; i++) {
				add[i].onclick = function (e) {
					self.addExtra.apply(self, [this.value]);
				};
			}
			for (i = 0, len = remove.length; i < len; i++) {
				remove[i].onclick = function (e) {
					self.removeExtra.apply(self, [this.value]);
				};
			}
		},
		bindCheckout: function () {
			var self = this,
				btnTerms = document.getElementById("crBtnTerms"),
				btnConfirm = document.getElementById("crBtnConfirm"),
				btnBack = document.getElementById("crBtnBack"),
				btnQuote = document.getElementById("crBtnQuote"),
				btnConditions = document.getElementById("crBtnConditions"),
				btnContinue = JABB.Utils.getElementsByClass("crBtnContinue", self.container, "button"),
				btnWhen = document.getElementById("crBtnWhen"),
				btnChoise = document.getElementById("crBtnChoise"),
				lnkFrom = document.getElementById("crDateFrom"),
				lnkTo = document.getElementById("crDateTo"),
				dateFrom = new Calendar({
					element: "cr_date_from",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				dateTo = new Calendar({
					element: "cr_date_to",
					//dateFormat: "Y-m-d",
					dateFormat: self.opts.dateFormat,
					monthNamesFull: self.opts.monthNamesFull,
					dayNames: self.opts.dayNames,
					disablePast: true,
					onSelect: function () {
						reCalc.call(self);
					}
				}),
				i, len = btnContinue.length;
			self.elFrom = document.getElementById("cr_date_from");
			self.elTo = document.getElementById("cr_date_to");
			self.elHFrom = document.getElementById("cr_hour_from");
			self.elMFrom = document.getElementById("cr_minutes_from");
			self.elHTo = document.getElementById("cr_hour_to");
			self.elMTo = document.getElementById("cr_minutes_to");
			
			function reCalc() {
				var from = Date.parseExact(this.elFrom.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHFrom.value, 10) * 3600000) + (parseInt(this.elMFrom.value, 10) * 60000),
					to = Date.parseExact(this.elTo.value, dateFormat(self.opts.dateFormat, 'datejs')).getTime() + (parseInt(this.elHTo.value, 10) * 3600000) + (parseInt(this.elMTo.value, 10) * 60000),
					nd = document.getElementById("crNumDays"),
					days;
				if (from !== null && to !== null) {
					days = Math.ceil((to - from) / 86400000);
					if (days > 0) {
						nd.lastChild.innerHTML = days;
						nd.style.display = "";
					} else {
						nd.style.display = "none";
					}
				} else {
					nd.style.display = "none";
				}
			}	
			
			if (lnkFrom) {
				lnkFrom.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateFrom.isOpen ? dateFrom.close() : dateFrom.open();
					return false;
				};
			}
			if (lnkTo) {
				lnkTo.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					dateTo.isOpen ? dateTo.close() : dateTo.open();
					return false;
				};
			}
	
			
			if (btnTerms) {
				btnTerms.onclick = function (e) {
					self.overlayTerms.open();
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					return false;
				};
			}
			if (btnBack) {
				btnBack.onclick = function () {
					self.loadExtras();
				};
			}
			if (btnQuote) {
				btnQuote.onclick = function () {
					this.disabled = true;
					if (!self.validateSearch(this)) {
						this.disabled = false;
						return;
					}
					self.passed.first = true;
					self.loadCars.apply(self, [JABB.Utils.serialize(document.getElementById("crFormSearch"))]);
				};
			}
			
			if (btnConditions) {
				btnConditions.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.overlayTerms.open();
					return false;
				}
			}
			if (btnWhen) {
				btnWhen.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.loadSearch();
					return false;
				};
			}
			if (btnChoise) {
				btnChoise.onclick = function (e) {
					if (e && e.preventDefault) {
						e.preventDefault();
					}
					self.loadCars();
					return false;
				};
			}
			if (btnConfirm) {
				var frm = btnConfirm.form;
				if (frm) {
					var pm = frm.payment_method;
					if (pm) {
						pm.onchange = function (e) {
							var data = document.getElementById("crCCData"),
								names = ["cc_type", "cc_num", "cc_exp_month", "cc_exp_year", "cc_code"],
								i, len = names.length;
							switch (this.options[this.selectedIndex].value) {
								case 'creditcard':
									data.style.display = "";
									for (i = 0; i < len; i++) {
										JABB.Utils.addClass(frm[names[i]], "crRequired");
									}
									break;
								default:
									data.style.display = "none";
									for (i = 0; i < len; i++) {
										JABB.Utils.removeClass(frm[names[i]], "crRequired");
									}
							}
						};
					}
				}				
				
				btnConfirm.onclick = function () {
					var that = this;
					that.disabled = true;
					//btnBack.disabled = true;
					if (!self.validateCheckoutForm(that)) {
						that.disabled = false;
						btnBack.disabled = false;
						return;
					}
					JABB.Ajax.postJSON(self.opts.folder + "index.php?controller=Front&action=bookingSave", function (data) {
						switch (data.code) {
							case 100:
								self.errorHandler('\n' + self.opts.message_4);
								that.disabled = false;
								btnBack.disabled = false;
								break;
							case 200:
								switch (data.payment) {
									case 'paypal':
										self.triggerLoading('message_1', self.container);
										self.loadPaymentForm(data);
										break;
									case 'authorize':
										self.triggerLoading('message_2', self.container);
										self.loadPaymentForm(data);
										break;
									case 'creditcard':
										self.triggerLoading('message_3', self.container);
										break;
									default:
										var h = document.getElementById('bookSuccess');
										self.container.innerHTML= h.innerHTML;
										//self.container.style.display='none';
										//self.triggerLoading('message_3', self.container);
								}					 
								break;
						}
					}, JABB.Utils.serialize(that.form));
				};
			}
			
		},
		loadSearch: function () {
			var self = this;
			JABB.Ajax.sendRequest(self.opts.folder + "index.php?controller=Front&action=loadSearch", function (req) {
				self.container.innerHTML = req.responseText;
				self.bindSearch();
				self.bindMenu();
			});
			self.current = "loadSearch";
		},
		loadCars: function () {
			var self = this,
				post = typeof arguments[0] != "undefined" ? arguments[0] : null,
				qs = "";
			if (typeof arguments[1] != "undefined") {
				self.size = arguments[1];
			} else {
				self.size = "all";
			}
			qs += "&size=" + self.size;
			if (typeof arguments[2] != "undefined") {
				self.transmission = arguments[2];
			} else {
				self.transmission = "";
			}
			qs += "&transmission=" + self.transmission;
			if (typeof arguments[3] != "undefined") {
				self.col_name = arguments[3];
			} else {
				self.col_name = "t1.name";
			}
			qs += "&col_name=" + self.col_name;
			if (typeof arguments[4] != "undefined") {
				self.direction = arguments[4];
			} else {
				self.direction = "asc";
			}
			qs += "&direction=" + self.direction;
			JABB.Ajax.sendRequest(self.opts.folder + "index.php?controller=Front&action=loadCars" + qs, function (req) {
				self.container.innerHTML = req.responseText;
				self.bindCars();
				self.bindMenu();
				self.bindTabs();
			}, post);
			self.current = "loadCars";
		},
		loadExtras: function () {
			var self = this,
				qs = "&type_id=" + self.type_id;
			JABB.Ajax.sendRequest([self.opts.folder, "index.php?controller=Front&action=loadExtras", qs].join(""), function (req) {
				self.container.innerHTML = req.responseText;
				self.bindExtras();
				self.bindMenu();
			});
			self.current = "loadExtras";
		},
		loadCheckout: function (id) {
			var self = this;
			JABB.Ajax.sendRequest(self.opts.folder + "index.php?controller=Front&action=loadCheckout&type_id="+id, function (req) {
				self.container.innerHTML = req.responseText;
				self.bindCheckout();
				self.bindMenu();
			});
			self.current = "loadCheckout";
		},
		loadPaymentForm: function (obj) {
			var self = this,
				div;
			JABB.Ajax.sendRequest(self.opts.folder + "index.php?controller=Front&action=loadPayment", function (req) {
				div = document.createElement("div");
				div.innerHTML = req.responseText;
				self.container.appendChild(div);
				
				if (typeof document.forms[obj.payment == 'paypal' ? 'crPaypal' : 'crAuthorize'] != 'undefined') {
					document.forms[obj.payment == 'paypal' ? 'crPaypal' : 'crAuthorize'].submit();						
				}
			}, "id=" + obj.booking_id);
		},
		addExtra: function (extra_id) {
			var self = this;
			JABB.Ajax.getJSON([self.opts.folder, "index.php?controller=Front&action=addExtra&extra_id=", extra_id].join(""), function (data) {
				self.loadExtras();
			});
			return self;
		},
		removeExtra: function (extra_id) {
			var self = this;
			JABB.Ajax.getJSON([self.opts.folder, "index.php?controller=Front&action=removeExtra&extra_id=", extra_id].join(""), function (data) {
				self.loadExtras();
			});
			return self;
		},
		setLocale: function (index) {
			var self = this;
			JABB.Ajax.getJSON([self.opts.folder, "index.php?controller=Front&action=setLocale&index=", index].join(""), function (data) {
				switch (self.current) {
					case 'loadSearch':
						self.loadSearch();
						break;
					case 'loadCars':
						self.loadCars();
						break;
					case 'loadExtras':
						self.loadExtras();
						break;
					case 'loadCheckout':
						self.loadCheckout();
						break;
				}
				if (window.myCR) {
					window.myCR.opts = data;
				}
			});
		},
		validateSearch: function (btn) {
			var frm = btn.form,
				df = frm.date_from,
				dt = frm.date_to;
			if (df && dt) {
				if (Date.parseExact(df.value, dateFormat(this.opts.dateFormat, 'datejs')).getTime() < Date.parseExact(dt.value, dateFormat(this.opts.dateFormat, 'datejs')).getTime()) {
					return true;
				}
			}
			this.errorHandler("\n - " + this.opts.validation.error_dates);
			return false;
		},
		validateCheckoutForm: function (btn) {
			var re = /([0-9a-zA-Z\.\-\_]+)@([0-9a-zA-Z\.\-\_]+)\.([0-9a-zA-Z\.\-\_]+)/,
				message = "";
			var frm = btn.form;
			for (var i = 0, len = frm.elements.length; i < len; i++) {
				var cls = frm.elements[i].className;
				if (cls.indexOf("crRequired") !== -1 && frm.elements[i].disabled === false) {
					switch (frm.elements[i].nodeName) {
					case "INPUT":
						switch (frm.elements[i].type) {
						case "checkbox":
						case "radio":
							if (!frm.elements[i].checked && frm.elements[i].getAttribute("rev")) {
								message += "\n - " + frm.elements[i].getAttribute("rev"); 
							}
							break;
						default:
							if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {
								message += "\n - " + frm.elements[i].getAttribute("rev");
							}
							break;
						}
						break;
					case "TEXTAREA":
						if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {						
							message += "\n - " + frm.elements[i].getAttribute("rev");
						}
						break;
					case "SELECT":
						switch (frm.elements[i].type) {
						case 'select-one':
							if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {
								message += "\n - " + frm.elements[i].getAttribute("rev"); 
							}
							break;
						case 'select-multiple':
							var has = false;
							for (j = frm.elements[i].options.length - 1; j >= 0; j = j - 1) {
								if (frm.elements[i].options[j].selected) {
									has = true;
									break;
								}
							}
							if (!has && frm.elements[i].getAttribute("rev")) {
								message += "\n - " + frm.elements[i].getAttribute("rev");
							}
							break;
						}
						break;
					default:
						break;
					}
				}
				if (cls.indexOf("crEmail") !== -1) {
					if (frm.elements[i].nodeName === "INPUT" && frm.elements[i].value.length > 0 && frm.elements[i].value.match(re) == null) {
						message += "\n - " + this.opts.validation.error_email;
					}
				}
			}
			if (message.length === 0) {
				return true;
			} else {
				this.errorHandler(message);		
				return false;
			}
		},
		errorHandler: function (message) {
			var err = JABB.Utils.getElementsByClass("crError", self.container, "P");
			if (err[0]) {
				err[0].innerHTML = '' + this.opts.validation.error_title + message.replace(/\n/g, "
");
				err[0].style.display = '';
			} else {
				alert(this.opts.validation.error_title + message);
			}
		},
		triggerLoading: function (message, container) {
			if (container && container.nodeType) {
				container.innerHTML = this.opts[message];
			} else if (typeof container != "undefined") {
				var c = document.getElementById(container);
				if (c && c.nodeType) {
					c.innerHTML = this.opts[message];
				}
			}
		}
	};
	return (window.CR = CR);
})(window);