var jc = {
	init:function(){
		jc.ui.init();
	},
	util:{
		dump:function(o){
			x = function(obj,prefix){
				prefix = (typeof prefix == 'undefined')?'':prefix;
				var str = '';
				for (var i in obj) {
					str += prefix+''+i+' = '+obj[i]+'\n';
					str += x(obj[i],prefix+'   ');
				}
				return str;
			}	
			alert(x(o));
		}
	},
	ui:{
		init:function(){
			$.each($('div.jc-slideShow'),function(i,e){ jc.ui.slideShow.init($(e)) });
			$.each($('a.jc-ddMenu'),function(i,e){ jc.ui.ddMenu.init($(e)) });
		},
		slideShow:{
			interval:3000,
			indexPosition:'bottom right',
			init:function(ss){
				$(ss).find('.jc-slide').width($(ss).width()).height($(ss).height()); //.click(function(){ jc.ui.slideShow.next($(this).closest('.jc-slideShow')); }); // set inividual slide dimensions
				if (ss.find('.jc-slide-active').length == 0) ss.find('.jc-slide').first().addClass('jc-slide-active'); // set first slide to be active
				jc.ui.slideShow.restartTimer(ss);
				var slideCount = $(ss).find('.jc-slide').length;
				// add index controls
				var control = $('<div class="jc-slide-control" />').appendTo(ss);
				// position
				if (jc.ui.slideShow.indexPosition.indexOf('bottom') >= 0) control.css('bottom','5px');
				else if (jc.ui.slideShow.indexPosition.indexOf('top') >= 0) control.css('top','5px');
				if (jc.ui.slideShow.indexPosition.indexOf('left') >= 0) control.css('left','5px');
				else if (jc.ui.slideShow.indexPosition.indexOf('right') >= 0) control.css('right','5px');
				// slides
				$.each($(ss).find('.jc-slide'),function(i,e){
					$('<div class="jc-slide-control-node" />').appendTo(control).click(function(){ jc.ui.slideShow.slideTo($(e)); });
					$(e).attr('jc-index',i);
				});
				control.css('width',(slideCount*(12+5))+'px');
				// marker
				$('<div class="jc-slide-control-marker" />').appendTo(control);
			},
			next:function(ss){
				var e1 = ss.find('.jc-slide-active');
				var e2 = e1.next('.jc-slide');
				if (e2.length == 0) e2 = ss.find('.jc-slide').first();
				jc.ui.slideShow.slideTo(e2);
			},
			previous:function(ss){
				var e1 = ss.find('.jc-slide-active');
				var e2 = e1.previous('jc-slide');
				if (e2.length == 0) e2 = ss.find('jc-slide').last();
				jc.ui.slideShow.slideTo(e2);
			},
			slideTo:function(e2){
				var s = $(e2).closest('.jc-slides');
				$(s).animate({left:'-'+e2.position().left+'px'}, function(){
					s.find('.jc-slide-active').removeClass('jc-slide-active');
					$(e2).addClass('jc-slide-active');
					jc.ui.slideShow.restartTimer($(e2).closest('.jc-slideShow'));
				});
				var m = $(s).closest('.jc-slideShow').find('.jc-slide-control-marker');
				var i = $(e2).attr('jc-index');
				$(m).animate({left:(i*16)+'px'});
			},
			restartTimer:function(ss){
				var t = $(ss).data('timer');
				if (typeof t != 'undefined')
					if (t != null)
						clearTimeout(t);
				$(ss).data('timer',setTimeout(function(){ jc.ui.slideShow.next(ss); },jc.ui.slideShow.interval));
			}
		},
		ddMenu:{
			init:function(a){
				var dd = $(a).siblings('div.jc-ddMenu'); // find and drop down
				$(a).data('jc-ddClone',dd.clone()); // clone/store it for use later
				dd.remove(); // remove original drop down HTML from DOM (waste of memory)
				$(a).mouseover(function(){ jc.ui.ddMenu.show($(this)); });
			},
			show:function(a){
				var dd = a.data('jc-ddClone');
				dd.appendTo(document.body);
				var p = a.offset();
				dd.css({top:(p.top+a.height())+'px',left:p.left+'px'});
				dd.slideDown('fast');
				$(document).click(function(e){
					if ($(e.target).closest('.jc-ddMenu').length == 0)
						jc.ui.ddMenu.hide(dd);
				});
				$('.jc-ddMenu').mouseout(function(e){
					if ($(e.relatedTarget).closest('.jc-ddMenu').length == 0) 
						jc.ui.ddMenu.hide(dd);
				});
			},
			hide:function(dd){
				dd.slideUp('fast',function(){ $(dd).remove(); });
			}
		}
	},
	form:{
		validate:{
			email:function(str){
				var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				return (filter.test(str));
			}	
		}	
	}
};
