eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 t(a,b){g(3=0;3<a.h;3++){k c=[],d=[],n=[],e=[],4=[],l=[];8(a[3].5(\'.\')!=-1||a[3].5(\'#\')==-1){8(a[3].5(\'>\')!=-1){c[3]=a[3].f(a[3].5(\'>\')+2);a[3]=a[3].f(0,a[3].5(\'>\')-1)}8(a[3].5(\'.\')!=-1){d[3]=a[3].f(a[3].5(\'.\')+1);a[3]=a[3].f(0,a[3].5(\'.\'))}n[3]=a[3];8(!d[3])d[3]=\'\';8(c[3]){l[3]=r.o(n[3]);g(k j=0;j<l[3].h;j++){8(l[3][j].6.5(d[3])!=-1){4[3]=l[3][j].o(c[3]);g(k i=0;i<4[3].h;i++){4[3][i].p=9(){7.6+=\' \'+b};4[3][i].q=9(){7.6=7.6.m(b,\'\')}}}}}s{4[3]=r.o(n[3]);g(k i=0;i<4[3].h;i++){8(4[3][i].6.5(d[3])!=-1){4[3][i].p=9(){7.6+=\' \'+b};4[3][i].q=9(){7.6=7.6.m(b,\'\')}}}}}s 8(a[3].5(\'#\')!=-1){8(a[3].5(\'>\')!=-1){c[3]=a[3].f(a[3].5(\'>\')+2);a[3]=a[3].f(0,a[3].5(\'>\')-1)}a[3]=a[3].m(\'#\',\'\');e[3]=r.u(a[3]);8(e[3]){8(c[3]){4[3]=e[3].o(c[3]);g(k i=0;i<4[3].h;i++){4[3][i].p=9(){7.6+=\' \'+b};4[3][i].q=9(){7.6=7.6.m(b,\'\')}}}s{e[3].p=9(){7.6+=\' \'+b};e[3].q=9(){7.6=7.6.m(b,\'\')}}}}}}',31,31,'|||_hoverItem|_hoverElement|indexOf|className|this|if|function||||_class|_id|substr|for|length|||var|_parent|replace|_tag|getElementsByTagName|onmouseover|onmouseout|document|else|hoverForIE6|getElementById'.split('|'),0,{}));
function ieHover() {
	hoverForIE6(['#navigation > li'], 'hover');
}
if (window.attachEvent && !window.opera){
	window.attachEvent("onload", ieHover);
}
//init page
$(function(){
	initFadeGallery();
	initCustomForms();
	//setInterval(addQuestion, 300);
})

function initCustomForms(){
	$('select').removeAttr('title');
	var cfManager = new jcf.customForms();
	cfManager.replace();
}
function resetform(){
	setTimeout(function(){
		var dm = getIndex(document.form1.DepartureMonth, stref.getMonth()+1);
		var dd = getIndex(document.form1.DepartureDay, stref.getDate());
		var dy = getIndex(document.form1.DepartureYear, stref.getFullYear());
		var rm = getIndex(document.form1.ReturnMonth, stref.getMonth()+2);
		var rd = getIndex(document.form1.ReturnDay, stref.getDate()-1);
		var ry = getIndex(document.form1.ReturnYear, stref.getFullYear());
		
		var defaultOptions = ['1','2', dm, dd, dy, rm, rd, ry ,'0','0','0'];
		
		var form = $('form[name="form1"]');
		var selectes = form.find('select');
		
		selectes.each(function(ind){
			var select = $(this).get(0);
			select.selectedIndex = defaultOptions[ind];
			select.jcf.refreshState();
		});
		var radio = $('input[name="CountryofCitizenship"]').eq(0);
		radio.trigger('click');
		 var radios = form.find('input:radio');
		radios.each(function(ind){
			$(this).get(0).jcf.refreshState();
		});
	},100)
}
// selectMe for new custom forms
function selectMe(selectFieldId,linkNo,selectNo) {
	var select = document.getElementsByTagName('select')[selectNo];
	select.selectedIndex = linkNo;
	select.jcf.refreshState();
}
//add 12 question
function addQuestion(){
	var form = $('form[name="form1"]');
	var addQuest = form.find('.hide');
	if(form.length){
		var age = form.find('input[name="Age"]').val();
		var select = form.find('select[name="USarrival"]');
		var options = select.children().filter(':selected').index();
		if(age > 65 && options > 2){
			addQuest.css({
				position:'static'
			});
		}
	}
}
//init hallery
function initFadeGallery(){
	$('div.gallery').fadeGallery({
		slideElements:'ul >li',
		autoRotation:true,
		autoHeight:false,
		pauseOnHover:false,
		switchTime: 10000
	});
}
// slideshow plugin
jQuery.fn.fadeGallery = function(_options){
	var _options = jQuery.extend({
		slideElements:'div.slides > div.slide',
		pagerGener: true,
		pagerHold: false,
		pagerLinks:'ul.nav-list li',
		btnNext:'a.btn-next',
		btnPrev:'a.btn-prev',
		btnPlayPause:'a.play-pause',
		btnPlay:'a.play',
		btnPause:'a.pause',
		pausedClass:'paused',
		disabledClass: 'disabled',
		playClass:'playing',
		activeClass:'active',
		currentNum:false,
		allNum:false,
		startSlide:null,
		noCircle:false,
		caption:'ul.caption > li',
		pauseOnHover:true,
		autoRotation:false,
		autoHeight:true,
		onChange:false,
		switchTime:3000,
		duration:650,
		event:'click'
	},_options);

	return this.each(function(){
		// gallery options
		var _this = jQuery(this);
		var _slides = jQuery(_options.slideElements, _this);
		var _btnPrev = jQuery(_options.btnPrev, _this);
		var _btnNext = jQuery(_options.btnNext, _this);
		var _btnPlayPause = jQuery(_options.btnPlayPause, _this);
		var _btnPause = jQuery(_options.btnPause, _this);
		var _btnPlay = jQuery(_options.btnPlay, _this);
		var _pauseOnHover = _options.pauseOnHover;
		var _autoRotation = _options.autoRotation;
		var _activeClass = _options.activeClass;
		var _disabledClass = _options.disabledClass;
		var _pausedClass = _options.pausedClass;
		var _playClass = _options.playClass;
		var _autoHeight = _options.autoHeight;
		var _duration = _options.duration;
		var _switchTime = _options.switchTime;
		var _controlEvent = _options.event;
		var _currentNum = (_options.currentNum ? jQuery(_options.currentNum, _this) : false);
		var _allNum = (_options.allNum ? jQuery(_options.allNum, _this) : false);
		var _startSlide = _options.startSlide;
		var _noCycle = _options.noCircle;
		var _onChange = _options.onChange;
		var _pagerGener = _options.pagerGener;
		var _pagerHold = jQuery(_options.pagerHold,_this);
		var _caption = jQuery(_options.caption,_this);
		var _paging = '';
		if(_pagerGener){
			for(var i=0; i< _slides.length; i++){
				_paging += '<li><a href="#">'+(i+1)+'</a></li>';
			}
			_pagerHold.html('<ul>'+_paging+'</ul>');
		}
		var _pagerLinks = jQuery(_options.pagerLinks, _this);
		// gallery init
		var _hover = false;
		var _prevIndex = 0;
		var _currentIndex = 0;
		var _slideCount = _slides.length;
		var _timer;
		if(_slideCount < 2) return;

		_prevIndex = _slides.index(_slides.filter('.'+_activeClass));
		if(_prevIndex < 0) _prevIndex = _currentIndex = 0;
		else _currentIndex = _prevIndex;
		if(_startSlide != null) {
			if(_startSlide == 'random') _prevIndex = _currentIndex = Math.floor(Math.random()*_slideCount);
			else _prevIndex = _currentIndex = parseInt(_startSlide);
		}
		_slides.hide().eq(_currentIndex).show();
		_caption.hide().eq(_currentIndex).show();
		if(_autoRotation) _this.removeClass(_pausedClass).addClass(_playClass);
		else _this.removeClass(_playClass).addClass(_pausedClass);

		// gallery control
		if(_btnPrev.length) {
			_btnPrev.bind(_controlEvent,function(){
				prevSlide();
				return false;
			});
		}
		if(_btnNext.length) {
			_btnNext.bind(_controlEvent,function(){
				nextSlide();
				return false;
			});
		}
		if(_pagerLinks.length) {
			_pagerLinks.each(function(_ind){
				jQuery(this).bind(_controlEvent,function(){
					if(_currentIndex != _ind) {
						_prevIndex = _currentIndex;
						_currentIndex = _ind;
						switchSlide();
					}
					return false;
				});
			});
		}

		// play pause section
		if(_btnPlayPause.length) {
			_btnPlayPause.bind(_controlEvent,function(){
				if(_this.hasClass(_pausedClass)) {
					_this.removeClass(_pausedClass).addClass(_playClass);
					_autoRotation = true;
					autoSlide();
				} else {
					_autoRotation = false;
					if(_timer) clearTimeout(_timer);
					_this.removeClass(_playClass).addClass(_pausedClass);
				}
				return false;
			});
		}
		if(_btnPlay.length) {
			_btnPlay.bind(_controlEvent,function(){
				_this.removeClass(_pausedClass).addClass(_playClass);
				_autoRotation = true;
				autoSlide();
				return false;
			});
		}
		if(_btnPause.length) {
			_btnPause.bind(_controlEvent,function(){
				_autoRotation = false;
				if(_timer) clearTimeout(_timer);
				_this.removeClass(_playClass).addClass(_pausedClass);
				return false;
			});
		}
		// gallery animation
		function prevSlide() {
			_prevIndex = _currentIndex;
			if(_currentIndex > 0) _currentIndex--;
			else {
				if(_noCycle) return;
				else _currentIndex = _slideCount-1;
			}
			switchSlide();
		}
		function nextSlide() {
			_prevIndex = _currentIndex;
			if(_currentIndex < _slideCount-1) _currentIndex++;
			else {
				if(_noCycle) return;
				else _currentIndex = 0;
			}
			switchSlide();
		}
		function refreshStatus() {
			if(_pagerLinks.length) _pagerLinks.removeClass(_activeClass).eq(_currentIndex).addClass(_activeClass);
			if(_currentNum) _currentNum.text(_currentIndex+1);
			if(_allNum) _allNum.text(_slideCount);
			_slides.eq(_prevIndex).removeClass(_activeClass);
			_slides.eq(_currentIndex).addClass(_activeClass);
			if(_noCycle) {
				if(_btnPrev.length) {
					if(_currentIndex == 0) _btnPrev.addClass(_disabledClass);
					else _btnPrev.removeClass(_disabledClass);
				}
				if(_btnNext.length) {
					if(_currentIndex == _slideCount-1) _btnNext.addClass(_disabledClass);
					else _btnNext.removeClass(_disabledClass);
				}
			}
			if(typeof _onChange === 'function') {
				_onChange(_this, _currentIndex);
			}
		}
		function switchSlide() {
			_slides.eq(_prevIndex).fadeOut(_duration);
			_slides.eq(_currentIndex).fadeIn(_duration);
			_caption.eq(_prevIndex).fadeOut();
			_caption.eq(_currentIndex).fadeIn();
			if(_autoHeight) _slides.eq(_currentIndex).parent().animate({height:_slides.eq(_currentIndex).outerHeight(true)},{duration:_duration,queue:false});
			refreshStatus();
			autoSlide();
		}

		// autoslide function
		function autoSlide() {
			if(!_autoRotation || _hover) return;
			if(_timer) clearTimeout(_timer);
			_timer = setTimeout(nextSlide,_switchTime+_duration);
		}
		if(_pauseOnHover) {
			_this.hover(function(){
				_hover = true;
				if(_timer) clearTimeout(_timer);
			},function(){
				_hover = false;
				autoSlide();
			});
		}
		refreshStatus();
		autoSlide();
	});
};
/*!
 * JavaScript Custom Forms v0.5
 * Copyright 2011, Unknown
 */
jcf = {};
jcf.modules = {};
jcf.baseOptions = {
	hiddenClass:'outtaHere',
	replaceAll:true
}

// advanced replacer class
jcf.customForms = function(opt) {
	this.options = jcf.baseOptions;
	jcf.lib.extend(this.options, opt);
}
jcf.customForms.prototype.replace = function(obj, opt) {
	for(var k in jcf.modules) {
		var els = jcf.lib.queryBySelector(jcf.modules[k].prototype.selector);
		for(var i = 0; i<els.length; i++) {
			new jcf.modules[k]({
				replaces:els[i]
			});
		}
	}
}
jcf.setBaseModule = function(obj) {
	jcf.customControl = function(opt){
		this.options = {
			labelActiveClass: 'jcf-label-active',
			focusClass:'jcf-focus',
			foo:'bar'
		}
		jcf.lib.extend(this.options, opt);
		this.init();
	}
	for(var p in obj) {
		jcf.customControl.prototype[p] = obj[p];
	}
}
jcf.addModule = function(obj) {
	if(obj.name){
		// create new module proto class
		jcf.modules[obj.name] = function(){
			jcf.modules[obj.name].superclass.constructor.apply(this, arguments);
		}
		jcf.lib.inherit(jcf.modules[obj.name], jcf.customControl);
		for(var p in obj) {
			jcf.modules[obj.name].prototype[p] = obj[p]
		}

		// on create module
		jcf.modules[obj.name].prototype.onCreateModule();

		// make callback for exciting modules
		for(var mod in jcf.modules) {
			if(jcf.modules[mod] != jcf.modules[obj.name]) {
				jcf.modules[mod].prototype.onModuleAdded(jcf.modules[obj.name]);
			}
		}
	}
}

// custom control base class
jcf.setBaseModule({
	init: function(){
		this.initOptions();
		this.realElement = this.options.replaces;
		if(this.realElement) {
			this.replaceObject();
		}
	},
	initOptions: function(){

	},
	createWrapper: function(){
		this.fakeElement = document.createElement('div');
		this.fakeElement.jcf = this;
		this.realElement.jcf = this;
		this.labelFor = jcf.lib.getLabelFor(this.realElement);
		jcf.lib.disableTextSelection(this.fakeElement);
		jcf.lib.addClass(this.realElement, jcf.baseOptions.hiddenClass);
	},
	initEvents: function(){
		jcf.lib.event.add(this.realElement, 'click', this.onClick);
		jcf.lib.event.add(this.realElement, 'focus', this.onFocus);
		jcf.lib.event.add(this.realElement, 'blur', this.onBlur);

		jcf.lib.event.add(this.fakeElement, 'click', this.onFakeClick);
		jcf.lib.event.add(this.fakeElement, 'mousedown', this.onFakeMouseDown);
		jcf.lib.event.add(this.fakeElement, 'mouseup', this.onFakeMouseUp);

		if(this.labelFor) {
			this.labelFor.jcf = this;
			jcf.lib.event.add(this.labelFor, 'click', this.onFakeClick);
			jcf.lib.event.add(this.labelFor, 'mousedown', this.onFakeMouseDown);
			jcf.lib.event.add(this.labelFor, 'mouseup', this.onFakeMouseUp);
		}
	},
	setupWrapper: function(){
		// implement in subclass
	},
	refreshState: function(){
		// implement in subclass
	},
	replaceObject: function(){
		this.createWrapper();
		this.initEvents();
		this.setupWrapper();
	},
	onClick: function(){
		this.jcf.refreshState();
	},
	onFocus: function(){
		clearTimeout(this.jcf.focusTimer);
		this.jcf.fakeElement.mouseDownFlag = false;
		if(!this.jcf.realElement.disabled) {
			jcf.lib.addClass(this.jcf.fakeElement,this.jcf.options.focusClass);
		}
	},
	onBlur: function(){
		var _this = this;
		this.jcf.focusTimer = setTimeout(function(){
			if(!_this.jcf.fakeElement.mouseDownFlag) {
				jcf.lib.removeClass(_this.jcf.fakeElement,_this.jcf.options.focusClass);
			}
		},10);
	},
	onFakeClick: function(){
		this.jcf.realElement.focus();
	},
	onFakeMouseDown: function(){
		this.jcf.fakeElement.mouseDownFlag = true;
		return false;
	},
	onFakeMouseUp: function(){
		this.jcf.fakeElement.mouseDownFlag = false;
	},
	onCreateModule: function(){
		// implement in subclass
	},
	onModuleAdded: function(module) {
		// implement in subclass
	},
	onControlReady: function() {
		// implement in subclass
	}
});


// custom forms util library
jcf.lib = {
	bind: function(func, scope){
		var _function = func;
		return function() {
			return _function.apply(scope, arguments);
		}
	},
	browser: (function() {
		var rwebkit = /(webkit)[ \/]([\w.]+)/,
		ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
		rmsie = /(msie) ([\w.]+)/,
		rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/;
		var ua = navigator.userAgent.toLowerCase();
		var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || [];
		var res = {};
		res[match[1]] = true;
		res.version = match[2] || "0";
		return res;
	})(),
	getOffset: function(element) {
		var el = element;
		var valueT = 0, valueL = 0;
		if (element.offsetParent) {
			do {
				// hello reflow
				valueT += element.offsetTop  || 0;
				valueL += element.offsetLeft || 0;
				if(element != document.body && element != document.body.parentNode) {
					valueT -= element.scrollTop  || 0;
					valueL -= element.scrollLeft  || 0;
				}
				valueT += parseInt(jcf.lib.getStyle(element,'borderTopWidth')) || 0;
				valueL += parseInt(jcf.lib.getStyle(element,'borderLeftWidth')) || 0;
				element = element.offsetParent;
			} while (element);
		}
		return {top:valueT, left:valueL};
	},
	getStyle: function(el, prop) {
		if (document.defaultView && document.defaultView.getComputedStyle) {
			return document.defaultView.getComputedStyle(el, null)[prop];
		} else if (el.currentStyle) {
			return el.currentStyle[prop];
		} else {
			return el.style[prop];
		}
	},
	getParent: function(obj, selector) {
		while(obj.parentNode && obj.parentNode != document.body) {
			if(obj.parentNode.tagName.toLowerCase() == selector.toLowerCase()) {
				return obj.parentNode;
			}
			obj = obj.parentNode;
		}
		return false;
	},
	isParent: function(child, parent) {
		while(child.parentNode) {
			if(child.parentNode === parent) {
				return true;
			}
			child = child.parentNode;
		}
		return false;
	},
	getLabelFor: function(object) {
		if(jcf.lib.getParent(object,'label')) {
			return object.parentNode;
		} else if(object.id && object.id.length) {
			return jcf.lib.queryBySelector('label[for=' + object.id + ']')[0];
		}
	},
	disableSelection: function() {
		document.onselectstart = function(){return false}
	},
	enableSelection: function() {
		document.onselectstart = null
	},
	disableTextSelection: function(el){
		if(el.setProperty) {
			el.setProperty("unselectable","on");
		}
		el.style.MozUserSelect = 'none';
		el.style.KhtmlUserSelect = 'none';
	},
	queryBySelector: function(selector, scope){
		return document.querySelectorAll ? (scope || document).querySelectorAll(selector) : jcf.lib.getElementsBySelector(selector, scope);
	},
	prevSibling: function(node) {
		while(node = node.previousSibling) if(node.nodeType == 1) break;
		return node;
	},
	nextSibling: function(node) {
		while(node = node.nextSibling) if(node.nodeType == 1) break;
		return node;
	},
	fireEvent: function(element,event) {
		if (document.createEventObject){
			var evt = document.createEventObject();
			return element.fireEvent('on'+event,evt)
		}
		else{
			var evt = document.createEvent('HTMLEvents');
			evt.initEvent(event, true, true );
			return !element.dispatchEvent(evt);
		}
	},
	isParent: function(p, c) {
		while(c.parentNode) {
			if(p == c) {
				return true;
			}
			c = c.parentNode;
		}
		return false;
	},
	inherit: function(Child, Parent) {
		var F = function() { }
		F.prototype = Parent.prototype
		Child.prototype = new F()
		Child.prototype.constructor = Child
		Child.superclass = Parent.prototype
	},
	extend: function(obj1,obj2) {
		for(var prop in obj2) {
			obj1[prop] = obj2[prop];
		}
	},
	hasClass: function (obj,cname) {
		return (obj.className ? obj.className.match(new RegExp('(\\s|^)'+cname+'(\\s|$)')) : false);
	},
	addClass: function (obj,cname) {
		if (!this.hasClass(obj,cname)) obj.className += " "+cname;
	},
	removeClass: function (obj,cname) {
		if (this.hasClass(obj,cname)) obj.className=obj.className.replace(new RegExp('(\\s|^)'+cname+'(\\s|$)'),' ');
	},
	getAllClasses: function(cname, prefix, skip) {
		if(!skip) skip = '';
		if(!prefix) prefix = '';
		return cname ? cname.replace(new RegExp('(\\s|^)'+skip+'(\\s|$)'),' ').replace(/[\s]*([\S]+)+[\s]*/gi,prefix+"$1 ") : '';
	},
	getElementsBySelector: function(selector, scope) {
		// Attempt to fail gracefully in lesser browsers
		if (!document.getElementsByTagName) {
			return new Array();
		}
		// Split selector in to tokens
		var tokens = selector.split(' ');
		var currentContext = new Array(scope || document.body);
		for (var i = 0; i < tokens.length; i++) {
			token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
			if (token.indexOf('#') > -1) {
				// Token is an ID selector
				var bits = token.split('#');
				var tagName = bits[0];
				var id = bits[1];
				var element = document.getElementById(id);
				if (tagName && element.nodeName.toLowerCase() != tagName) {
					// tag with that ID not found, return false
					return new Array();
				}
				// Set currentContext to contain just this element
				currentContext = new Array(element);
				continue; // Skip to next token
			}
			if (token.indexOf('.') > -1) {
				// Token contains a class selector
				var bits = token.split('.');
				var tagName = bits[0];
				var className = bits[1];
				if (!tagName) {
					tagName = '*';
				}
				// Get elements matching tag, filter them for class selector
				var found = new Array;
				var foundCount = 0;
				for (var h = 0; h < currentContext.length; h++) {
					var elements;
					if (tagName == '*') {
						elements = currentContext[h].getElementsByTagName('*');
					} else {
						elements = currentContext[h].getElementsByTagName(tagName);
					}
					for (var j = 0; j < elements.length; j++) {
						found[foundCount++] = elements[j];
					}
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for (var k = 0; k < found.length; k++) {
					if (found[k].className && found[k].className.match(new RegExp('(\\s|^)'+className+'(\\s|$)'))) {
						currentContext[currentContextIndex++] = found[k];
					}
				}
				continue; // Skip to next token
			}
			// Code to deal with attribute selectors
			if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
				var tagName = RegExp.$1;
				var attrName = RegExp.$2;
				var attrOperator = RegExp.$3;
				var attrValue = RegExp.$4;
				if (!tagName) {
					tagName = '*';
				}
				// Grab all of the tagName elements within current context
				var found = new Array;
				var foundCount = 0;
				for (var h = 0; h < currentContext.length; h++) {
					var elements;
					if (tagName == '*') {
						elements = currentContext[h].getElementsByTagName('*');
					} else {
						elements = currentContext[h].getElementsByTagName(tagName);
					}
					for (var j = 0; j < elements.length; j++) {
						found[foundCount++] = elements[j];
					}
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				var checkFunction; // This function will be used to filter the elements
				if(attrName.toLowerCase() == 'for' && jcf.lib.browser.msie && jcf.lib.browser.version < 8) {
					attrName = 'htmlFor';
				}
				switch (attrOperator) {
					case '=': // Equality
						checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
						break;
					case '~': // Match one of space seperated words
						checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('(\\s|^)'+attrValue+'(\\s|$)'))); };
						break;
					case '|': // Match start with value followed by optional hyphen
						checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
						break;
					case '^': // Match starts with value
						checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
						break;
					case '$': // Match ends with value
						checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
						break;
					case '*': // Match ends with value
						checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
						break;
					default :
						// Just test for existence of attribute
						checkFunction = function(e) { return e.getAttribute(attrName); };
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for (var k = 0; k < found.length; k++) {
					if (checkFunction(found[k])) {
						currentContext[currentContextIndex++] = found[k];
					}
				}
				continue; // Skip to next token
			}
			// If we get here, token is JUST an element (not a class or ID selector)
			tagName = token;
			var found = new Array;
			var foundCount = 0;
			for (var h = 0; h < currentContext.length; h++) {
				var elements = currentContext[h].getElementsByTagName(tagName);
				for (var j = 0; j < elements.length; j++) {
					found[foundCount++] = elements[j];
				}
			}
			currentContext = found;
		}
		return currentContext;
	},
	domReady: function (handler){
		var called = false
		function ready() {
			if (called) return;
			called = true;
			handler();
		}
		if (document.addEventListener) {
			document.addEventListener( "DOMContentLoaded", ready, false )
		} else if (document.attachEvent) {
			if (document.documentElement.doScroll && window == window.top) {
				function tryScroll(){
					if (called) return
					if (!document.body) return
					try {
						document.documentElement.doScroll("left")
						ready()
					} catch(e) {
						setTimeout(tryScroll, 0)
					}
				}
				tryScroll()
			}
			document.attachEvent("onreadystatechange", function(){
				if ( document.readyState === "complete" ) {
					ready()
				}
			})
		}
		if (window.addEventListener) window.addEventListener('load', ready, false)
		else if (window.attachEvent) window.attachEvent('onload', ready)
	},
	event: (function(){
		var guid = 0;
		function fixEvent(event) {
			event = event || window.event;
			if ( event.isFixed ) {
				return event;
			}
			event.isFixed = true;
			event.preventDefault = event.preventDefault || function(){this.returnValue = false}
			event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true}
			if(!event.target) {
				event.target = event.srcElement;
			}
			if(!event.relatedTarget && event.fromElement) {
				event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
			}
			if(event.pageX == null && event.clientX != null ) {
				var html = document.documentElement, body = document.body;
				event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
				event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
			}
			if(typeof event.layerX == 'undefined') {
				event.layerX = event.offsetX;
				event.layerY = event.offsetY;
			}
			if(!event.which && event.button ) {
				event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
			}
			return event;
		}

		function commonHandle(event) {
			if(!this.events) return;
			event = fixEvent(event)
			var handlers = this.events[event.type]
			for(var g in handlers ) {
				var handler = handlers[g]
				var ret = handler.call(this, event)
				if ( ret === false ) {
					event.preventDefault()
					event.stopPropagation()
				}
			}
		}

		return {
			add: function(elem, type, handler) {
				if (elem.setInterval && (elem != window && !elem.frameElement)) {
					elem = window;
				}
				if (!handler.guid) {
					handler.guid = ++guid;
				}
				if (!elem.events) {
					elem.events = {}
					elem.handle = function(event) {
						if (typeof jcf.lib.event !== "undefined") {
							return commonHandle.call(elem, event)
						}
					}
				}

				if (!elem.events[type]) {
					elem.events[type] = {}
					if (elem.addEventListener) {
						elem.addEventListener(type, elem.handle, true);
					} else {
						if (elem.attachEvent) elem.attachEvent('on' + type, elem.handle);
					}
				}
				elem.events[type][handler.guid] = handler
			},

			remove: function(elem, type, handler) {
				var handlers = elem.events && elem.events[type];
				if (!handlers) return;
				delete handlers[handler.guid];
				for(var any in handlers) return;
				if (elem.removeEventListener) elem.removeEventListener(type, elem.handle, false)
				else if (elem.detachEvent) elem.detachEvent("on" + type, elem.handle)
				delete elem.events[type]

				for (var any in elem.events) return;
				try {
					delete elem.handle
					delete elem.events
				} catch(e) { // IE
					try {
						elem.removeAttribute("handle")
						elem.removeAttribute("events")
					} catch(e) {}
				}
			}
		}
	}())
}
// custom radio module
jcf.addModule({
	name:'radio',
	selector: 'input[type=radio]',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			wrapperClass:'rad-area',
			focusClass:'rad-focus',
			checkedClass:'radioAreaChecked',
			uncheckedClass:'radioArea',
			disabledClass:'rad-disabled',
			radStructure:'<span></span>'
		});
	},
	getRadioGroup: function(item){
		var name = item.getAttribute('name');
		if(name) {
			return jcf.lib.queryBySelector('input[name='+name+']', jcf.lib.getParent('form'));
		} else {
			return [item];
		}
	},
	setupWrapper: function(){
		jcf.lib.addClass(this.fakeElement, this.options.wrapperClass);
		this.fakeElement.innerHTML = this.options.radStructure;
		this.realElement.parentNode.insertBefore(this.fakeElement, this.realElement);
		this.refreshState();
		this.addEvents();
	},
	addEvents: function(){
		jcf.lib.event.add(this.fakeElement, 'click', this.toggleRadio);
		if(this.labelFor) {
			jcf.lib.event.add(this.labelFor, 'click', this.toggleRadio);
		}
	},
	toggleRadio: function(){
		if(!this.jcf.realElement.disabled) {
			this.jcf.realElement.checked = true;
		}
		this.jcf.refreshState();
	},
	refreshState: function(){
		var els = this.getRadioGroup(this.realElement);
		for(var i = 0; i < els.length; i++) {
			var curEl = els[i].jcf;
			if(curEl) {
				if(curEl.realElement.checked) {
					jcf.lib.addClass(curEl.fakeElement, curEl.options.checkedClass);
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.uncheckedClass);
					if(curEl.labelFor) {
						jcf.lib.addClass(curEl.labelFor, curEl.options.labelActiveClass);
					}
				} else {
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.checkedClass);
					jcf.lib.addClass(curEl.fakeElement, curEl.options.uncheckedClass);
					if(curEl.labelFor) {
						jcf.lib.removeClass(curEl.labelFor, curEl.options.labelActiveClass);
					}
				}
				if(curEl.realElement.disabled) {
					jcf.lib.addClass(curEl.fakeElement, curEl.options.disabledClass);
				} else {
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.disabledClass);
				}
			}
		}
	}
});
// custom select module
jcf.addModule({
	name:'select',
	selector:'select',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			wrapperClass:'selectArea',
			focusClass:'select-focus',
			selectedClass:'item-selected',
			disabledClass:'select-disabled',
			valueSelector:'span.center',
			optGroupClass:'optgroup',
			openerSelector:'a.selectButton',
			selectStructure:'<span class="left"></span><span class="center"></span><a class="selectButton"></a>',
			selectPrefixClass:'select-',
			dropMaxHeight: 200,
			dropHiddenClass:'optionsDivInvisible',
			dropScrollableClass:'options-overflow',
			dropClass:'optionsDivVisible',
			dropClassPrefix:'drop-',
			dropStructure:'<div class="drop-holder"><div class="drop-list"></div></div>',
			dropSelector:'div.drop-list'
		});
	},
	setupWrapper: function(){
		jcf.lib.addClass(this.fakeElement, this.options.wrapperClass);
		this.realElement.parentNode.insertBefore(this.fakeElement, this.realElement);
		if(!jcf.lib.browser.opera) this.realElement.setAttribute('multiple','multiple'); // Mac Safari Fix
		this.fakeElement.innerHTML = this.options.selectStructure;
		this.fakeElement.style.width = this.realElement.offsetWidth + 'px';
		jcf.lib.addClass(this.fakeElement, jcf.lib.getAllClasses(this.realElement.className, this.options.selectPrefixClass, jcf.baseOptions.hiddenClass));

		// create select body
		this.opener = jcf.lib.queryBySelector(this.options.openerSelector, this.fakeElement)[0];
		this.valueText = jcf.lib.queryBySelector(this.options.valueSelector, this.fakeElement)[0];
		this.opener.jcf = this;

		this.createDropdown();
		this.refreshState();
		this.addEvents();
		this.onControlReady(this);
	},
	addEvents: function(){
		jcf.lib.event.add(this.fakeElement, 'click', this.toggleDropdown);
		jcf.lib.event.add(this.realElement, 'change', this.onChange);
	},
	onFocus: function(){
		jcf.modules[this.jcf.name].superclass.onFocus.apply(this, arguments);
		jcf.lib.event.add(this.jcf.realElement, 'keydown', this.jcf.onKeyDown);
		if(jcf.activeControl && jcf.activeControl != this.jcf) {
			jcf.activeControl.hideDropdown();
		}
	},
	onBlur: function(){
		if(!this.jcf.isActiveDrop() || !this.jcf.isOverDrop()) {
			jcf.modules[this.jcf.name].superclass.onBlur.apply(this, arguments);
		}
		jcf.lib.event.remove(this.jcf.realElement, 'keydown', this.jcf.onKeyDown);
	},
	onChange: function() {
		this.jcf.refreshState();
	},
	onKeyDown: function(e){
		var context = this;
		setTimeout(function(){
			context.jcf.refreshState();
		},10);
		if(e.keyCode == 13) {
			context.jcf.toggleDropdown.apply(context);
			return false;
		}
	},
	onResizeWindow: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.hideDropdown();
		}
	},
	onScrollWindow: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.positionDropdown();
		}
	},
	onOptionClick: function(e){
		var opener = e.target && e.target.tagName && e.target.tagName.toLowerCase() == 'li' ? e.target : jcf.lib.getParent(e.target, 'li');
		if(opener) {
			this.jcf.realElement.selectedIndex = parseInt(opener.getAttribute('rel'));
			this.jcf.realElement.focus();
			this.jcf.refreshState();
			this.jcf.hideDropdown();
			jcf.lib.fireEvent(this.jcf.realElement, 'change');
		}
		return false;
	},
	onClickOutside: function(e){
		if(jcf.activeControl && !jcf.lib.isParent(jcf.activeControl, e.target) && !jcf.lib.isParent(jcf.activeControl.fakeElement, e.target)) {
			jcf.activeControl.hideDropdown();
		}
	},
	onDropHover: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.hoverFlag = true;
			var opener = e.target && e.target.tagName && e.target.tagName.toLowerCase() == 'li' ? e.target : jcf.lib.getParent(e.target, 'li');
			if(opener) {
				jcf.activeControl.realElement.selectedIndex = parseInt(opener.getAttribute('rel'));
				jcf.activeControl.refreshSelectedClass(parseInt(opener.getAttribute('rel')));
			}
		}
	},
	onDropLeave: function(){
		if(jcf.activeControl) {
			jcf.activeControl.hoverFlag = false;
		}
	},
	isActiveDrop: function(){
		return !jcf.lib.hasClass(this.selectDrop, this.options.dropHiddenClass);
	},
	isOverDrop: function(){
		return this.hoverFlag;
	},
	createDropdown: function(){
		// remove old dropdown if exists
		if(this.selectDrop) {
			this.selectDrop.parentNode.removeChild(this.selectDrop);
		}

		// create dropdown holder
		this.selectDrop = document.createElement('div');
		this.selectDrop.className = this.options.dropClass;
		this.selectDrop.innerHTML = this.options.dropStructure;
		this.selectList = jcf.lib.queryBySelector(this.options.dropSelector,this.selectDrop)[0];
		jcf.lib.addClass(this.selectDrop, this.options.dropHiddenClass);
		document.body.appendChild(this.selectDrop);
		this.selectDrop.jcf = this;
		jcf.lib.event.add(this.selectDrop, 'click', this.onOptionClick);
		jcf.lib.event.add(this.selectDrop, 'mouseover', this.onDropHover);
		jcf.lib.event.add(this.selectDrop, 'mouseout', this.onDropLeave);
		this.buildDropdown();
	},
	buildDropdown: function() {
		// build select options / optgroups
		this.buildDropdownOptions();

		// position and resize dropdown
		this.positionDropdown();

		// cut dropdown if height exceedes
		this.buildDropdownScroll();
	},
	buildDropdownOptions: function() {
		this.resStructure = '';
		this.optNum = 0;
		for(var i = 0; i < this.realElement.children.length; i++) {
			this.resStructure += this.buildElement(this.realElement.children[i]) +'\n';
		}
		this.selectList.innerHTML = this.resStructure;
	},
	buildDropdownScroll: function() {
		if(this.options.dropMaxHeight) {
			if(this.selectDrop.offsetHeight > this.options.dropMaxHeight) {
				this.selectList.style.height = this.options.dropMaxHeight+'px';
				this.selectList.style.overflow = 'auto';
				this.selectList.style.overflowX = 'hidden';
				jcf.lib.addClass(this.selectDrop, this.options.dropScrollableClass);
			}
		}
		jcf.lib.addClass(this.selectDrop, jcf.lib.getAllClasses(this.realElement.className, this.options.dropClassPrefix, jcf.baseOptions.hiddenClass));
	},
	buildElement: function(obj){
		// build option
		var res = '';
		if(obj.tagName.toLowerCase() == 'option') {
			if(!jcf.lib.prevSibling(obj) || jcf.lib.prevSibling(obj).tagName.toLowerCase() != 'option') {
				res += '<ul>';
			}
			res += '<li rel="'+(this.optNum++)+'" class="'+(obj.className? obj.className : '')+' jcfcalc"><a href="#">'+(obj.title? '<img src="'+obj.title+'" alt="" />' : '')+'<span>' + obj.innerHTML + '</span></a></li>';
			if(!jcf.lib.nextSibling(obj) || jcf.lib.nextSibling(obj).tagName.toLowerCase() != 'option') {
				res += '</ul>';
			}
			return res;
		}
		// build option group with options
		else if(obj.tagName.toLowerCase() == 'optgroup' && obj.label) {
			res += '<div class="'+this.options.optGroupClass+'">';
			res += '<strong class="jcfcalc"><em>'+(obj.label)+'</em></strong>';
			for(var i = 0; i < obj.children.length; i++) {
				res += this.buildElement(obj.children[i]);
			}
			res += '</div>';
			return res;
		}
	},
	positionDropdown: function(){
		var ofs = jcf.lib.getOffset(this.fakeElement);
		this.selectDrop.style.top = (ofs.top+this.fakeElement.offsetHeight)+'px';
		this.selectDrop.style.left = ofs.left+'px';
		this.selectDrop.style.width = this.fakeElement.offsetWidth+'px';
	},
	showDropdown: function(){
		jcf.lib.removeClass(this.selectDrop, this.options.dropHiddenClass);
		this.positionDropdown();

		// hide active dropdown
		if(jcf.activeControl) {
			jcf.activeControl.hideDropdown();
		}

		// show current dropdown
		jcf.activeControl = this;
		jcf.lib.event.add(window, 'resize', this.onResizeWindow);
		jcf.lib.event.add(window, 'scroll', this.onScrollWindow);
		jcf.lib.event.add(document.body, 'click', this.onClickOutside);
		this.positionDropdown();
	},
	hideDropdown: function(){
		if(jcf.activeControl && typeof jcf.activeControl.origSelectedIndex === 'number') {
			jcf.activeControl.realElement.selectedIndex = jcf.activeControl.origSelectedIndex;
		}
		jcf.lib.addClass(this.selectDrop, this.options.dropHiddenClass);
		jcf.activeControl = null;
		jcf.lib.event.remove(window, 'resize', this.onResizeWindow);
		jcf.lib.event.remove(window, 'scroll', this.onScrollWindow);
		jcf.lib.event.remove(document.body, 'click', this.onClickOutside);
	},
	toggleDropdown: function(){
		this.jcf.dropOpened = true;
		if(!this.jcf.realElement.disabled) {
			if(this.jcf.isActiveDrop()) {
				this.jcf.hideDropdown();
			} else {
				this.jcf.showDropdown();
			}
		}
		this.jcf.refreshState();
	},
	scrollToItem: function(){
		if(this.isActiveDrop()) {
			var dropHeight = this.selectList.offsetHeight;
			var offsetTop = this.calcOptionOffset(this.getFakeActiveOption());
			var sTop = this.selectList.scrollTop;
			var oHeight = this.getFakeActiveOption().offsetHeight;
			//offsetTop+=sTop;

			if(offsetTop >= sTop + dropHeight) {
				this.selectList.scrollTop = offsetTop - dropHeight + oHeight;
			} else if(offsetTop < sTop) {
				this.selectList.scrollTop = offsetTop;
			}
		}
	},
	getFakeActiveOption: function(c) {
		return jcf.lib.queryBySelector('li[rel="'+(typeof c === 'number' ? c : this.realElement.selectedIndex) +'"]',this.selectList)[0];
	},
	calcOptionOffset: function(fake) {
		var h = 0;
		var els = jcf.lib.queryBySelector('.jcfcalc',this.selectList);
		for(var i = 0; i < els.length; i++) {
			if(els[i] == fake) break;
			h+=els[i].offsetHeight;
		}
		return h;
	},
	childrenHasItem: function(hold,item) {
		var items = hold.getElementsByTagName('*');
		for(i = 0; i < items.length; i++) {
			if(items[i] == item) return true;
		}
		return false;
	},
	removeSelectedClass: function(){
		var children = jcf.lib.queryBySelector('li',this.selectList);
		for(var i = children.length - 1; i >= 0; i--) {
			jcf.lib.removeClass(children[i], this.options.selectedClass);
		}
	},
	setSelectedClass: function(c){
		jcf.lib.addClass(this.getFakeActiveOption(c), this.options.selectedClass);
	},
	refreshSelectedClass: function(c){
		this.removeSelectedClass(c);
		this.setSelectedClass(c);
		if(this.realElement.disabled) {
			jcf.lib.addClass(this.fakeElement, this.options.disabledClass);
		} else {
			jcf.lib.removeClass(this.fakeElement, this.options.disabledClass);
		}
	},
	refreshSelectedText: function() {
		if(!this.dropOpened && this.realElement.title) {
			this.valueText.innerHTML = this.realElement.title;
		} else {
			if(this.realElement.options[this.realElement.selectedIndex].title) {
				this.valueText.innerHTML = '<img src="'+this.realElement.options[this.realElement.selectedIndex].title+'" alt="" />' + this.realElement.options[this.realElement.selectedIndex].innerHTML;
			} else {
				this.valueText.innerHTML = this.realElement.options[this.realElement.selectedIndex].innerHTML;
			}
		}
	},
	refreshState: function(){
		if(jcf.activeControl) {
			jcf.activeControl.origSelectedIndex = jcf.activeControl.realElement.selectedIndex;
		}
		this.refreshSelectedClass();
		this.refreshSelectedText();
		this.scrollToItem();
	}
});

