var Rafa = function(){
    var blank = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
    function debug(msg) {
	( typeof(console) != "undefined" ) ? console.debug(msg) : alert(msg);
    };

    var $jq = jQuery;
    var actions = {};
    function getActions(name){ return actions[name] }

    var hooks = {};
    function setup(el) {
	for (var css in hooks) {
	    for (var hook in hooks[css]) {
		//		debug('setting up: ' + css + '.' + hook + '()');
		if ( hook == 'each' ) {
		    $jq(css, el).each(hooks[css][hook]);
		} else {
		    $jq(css, el).bind(hook, {}, hooks[css][hook]);
		}
	    }
	}
	return el;
    }

/*
    var Thickbox = {
	show: function(msg) {
	    tb_show({inline:true, caption:'',
		     width:130, height:60,
		     modal:'true', msg:('<div style="text-align: center; font-weight: bold">' + msg + '</div>')});
	},
	hide: tb_remove,
	update: function(msg) {
	    $jq("#TB_ajaxContent").html(msg);
	}
    };
*/

    var PRELOAD = { slices: {}, sponsors: {} };

    hooks = {
/*	'.showcase': {
	    each: function(idx, showcase) {
		var selected = 1;
		var selections = $jq('.selection', showcase);
		$jq('.prev', showcase).click(function(e){
			if ( selected <= 1 ) { selected = selections.size();
			} else { selected--; }
			$jq(selections.get(selected - 1)).click();
		    });

		$jq('.next', showcase).click(function(e){
			if ( selected >= selections.size() ) { selected = 1;
			} else { selected++; }
			$jq(selections.get(selected - 1)).click();
		    });
		selections.each(function(idx, selection) {
			var sel = $jq(selection);
			var src = sel.attr('src');
			var mouseover_src = src.replace('slices/', 'slices/mouseovers/');
			PRELOAD.slices[src] = new Image();
			PRELOAD.slices[src].src = src;
			PRELOAD.slices[src + '_mouseover'] = new Image();
			PRELOAD.slices[src + '_mouseover'].src = mouseover_src;
			sel.bind('mouseover', {}, function(evt) { selections.mouseout(); evt.target.src = mouseover_src });
			sel.bind('mouseout', {}, function(evt) { if ( (selected != (idx + 1)) ) { evt.target.src = src; } });
			sel.click(function(e){
				selected = idx + 1;
				$jq(e.target).mouseover();
				selections.mouseout();
				$jq('.viewer', showcase).html($jq('#showcase_' + selected).html());
				//$jq('.viewer', showcase).children().center();
			    });
			if ( idx == 0 ) {
			    selection.src = mouseover_src;
			}
		    });
	    }
	},
	'div.carousel': {
	    each: function(idx, div) {
		//		$jq(div).jCarouselLite({ circular: true, visible: 6, auto: 200, speed: 1000 });
		$jq('ul', div).each(function(idx, ul) {
			$jq('#sponsors-container').show();
			$jq(ul).jcarousel({
				scroll: 1,
				animation: 4000,
				auto: 1,
				    //				wrap: 'circular',
				wrap: 'both',
				last: 'circular',
				visible: 6,
				buttonNextHTML: null, buttonPrevHTML: null,    
				initCallback: function (c) {
				    // Disable autoscrolling if the user clicks the prev or next button.
				    // c.buttonNext.bind('click', function() { c.startAuto(0); });
				    // c.buttonPrev.bind('click', function() { c.startAuto(0); });
				    // Pause autoscrolling if the user moves with the cursor over the clip.
				    c.clip.mouseover(function(){ c.stopAuto(); });
				    c.clip.mouseout(function(){ c.startAuto(); });
				    //				    c.clip.hover(function() { c.stopAuto(); }, function() { c.startAuto(); });
				}
			    });
		    });
	    }
	},
	'img.sponsor': {
	    each: function(idx, el) {
		var src = el.src;
		var mouseover_src = src.replace('.OFF.', '.ON.');
		var img = new Image();
		PRELOAD.sponsors[src] = new Image();
		PRELOAD.sponsors[src].src = src;
		PRELOAD.sponsors[src + '_mouseover'] = new Image();
		PRELOAD.sponsors[src + '_mouseover'].src = mouseover_src;
		$jq(el).hover(function(){ $jq(el).siblings('.sponsor').mouseout(); el.src = mouseover_src; }, function(){ el.src = src; });
	    }
	}, */
	'*.nav': {
	    each: function(idx, el) {
		var id = '#' + el.id + '_menu';
		var fx = (!$jq.browser.msie) ? { open: 'fadeIn', openSpeed: 215 } : {open: 'show', openSpeed: ''};
		var timeout;
		$jq(el).cluetip({
			local: 'true',
			    positionBy: 'auto',
			    leftOffset: 0,
			    topOffset: 10,
			    showTitle: false,
			    mouseOutClose: true,
			    activation: 'click',
			    fx: fx,
			    onActivate: function(){ if ( timeout ) { clearTimeout(timeout);  }; return true; },
			    onShow: function(ct, c) { timeout = setTimeout(function(){ return 0; $jq('#cluetip').hide() }, 20000); }
			    }
		    );
	    }
	}, /*
	'ul.scroller': {
	    each: function(idx, el) { */
		/*

		*/
	    /*}
	},
	'a.toggle': {
	    each: function(idx, el) {
		var toggle = $jq(el);
		var form = $jq(toggle.parents('.form').get(0));
		var panel = form.children('.panel');
		toggle.toggle(
			      function(){ panel.fadeIn(); toggle.html('&ndash;'); },
			      function(){ panel.fadeOut(); toggle.html('+'); });
	    }
	}, */
	'img.hover': {
	    each: function(idx, el) {
		var img = $jq(el);
		var src = img.attr('src');
		var mouseover_src = src.replace('slices/', 'slices/mouseovers/');
		PRELOAD.slices[src] = new Image();
		PRELOAD.slices[src].src = src;
		PRELOAD.slices[src + '_mouseover'] = new Image();
		PRELOAD.slices[src + '_mouseover'].src = mouseover_src;
		//		$jq(el).bind('mouseover', {}, function(evt) { img.siblings('.hover').mouseout(); evt.target.src = mouseover_src });
		$jq(el).bind('mouseover', {}, function(evt) { evt.target.src = mouseover_src });
		$jq(el).bind('mouseout', {}, function(evt) { evt.target.src = src });
	    }
	} /*, 
	'*.undo': {
	    click: function(evt) {
		var form = $jq(evt.target).parents('form');
		var clone = form.siblings('form');
		form.remove();
		clone.show();
		clone.before(setup(clone.clone().hide()));
		return false;
	    }
	},
	'form': {
	    each: function(idx, el) {
		var form = $jq(el);
		var clone = form.before(setup(form.clone().hide()));
	    }
	},
	'*.remove': {
	    click: function(evt) {
		var target = $jq(evt.target).parents('.list');
		var form = $jq(target).parents('form');
		var field = $jq(target).parents('.field');
		var needs_empty_list = $jq('.needs_empty_list', form);
		
		target.remove();
		var list = $jq('.list', form);
		$jq('*.needs_list_change', form).show();
		if ( !list.size()  ) {
		    $jq('*.needs_list', form).hide();
		    needs_empty_list.show();
		    if ( needs_empty_list.is('tr') ) {
			needs_empty_list.css('display', 'table-row');
		    }
		}

		var model = $jq('.model', form);
		if ( $jq('.field'. model).size() > 1 ) {
		    // slots
		    list.each(function(idx, clone) {
			    var list_count = idx + 1;
			    var editors = $jq('*[name]', clone);
			    editors.each(function(idx, editor){
				    var editor_model = $jq($jq('*[name]', model).get(idx));
				    $jq(editor).attr('name', (editor_model.attr('name') + '_' + list_count));
				});
			});
		} else {
		    // languages
		}

		return false;
	    }
	},
	'*': {
	    change : function(evt){
		var form = $jq(evt.target).parents('form');
		//		$jq('.save', form).show();
		//		$jq('.remove', form).show();
		return false;
	    }
	},
	'*.view': {
	    click: function(evt) {
		var view = $jq(evt.target);
		var form = $jq(view).parents('form');
		var listfield = view.parents('.listfield');
		var field = view.parents('.field');
		var list = view.parents('.list');

		var ctxt;
		if ( listfield.size() ) {
		    ctxt = listfield;
		} else if ( list.size() ) {
		    ctxt = list;
		} else {
		    ctxt = field;
		}

		var editors = { input: 1, select: 1, textarea: 1 };
		
		var editor;
		for (var type in editors) {
		    var test = $jq(('.view +' + type), ctxt);
		    if ( !editor && test.size() ) {
			editor = test;
		    }
		}

		if ( editor ) {
		    if ( editor.attr('class').match('datetime') ) {
			return;
		    } else {
			var end = function(evt){
			    var editor = $jq(evt.target);
			    var view = $jq('.view', editor.parent());
			    var value = $jq(('option[value="' + editor.val() + '"]'),
					    editor).text() || editor.val();
			    view.html(((editor.is('textarea')) ? value.replace(/\n/g, "<br />\n") : value) || blank);
			    view.insertBefore(editor);
			    editor.hide();
			    view.show();
			    $jq('.needs_list_change', editor.parents('form')).show();
			};
			view.hide();			

			editor.unbind('change');
			editor.unbind('blur');
			editor.show();
			editor.change(end);
			editor.blur(end);
			editor.focus();
			setTimeout(function(){end({target: editor})}, 30000);
		    }
		} else {
		    debug('editor not found');
		}
	    }
	},
	'input.datetime': {
	    each: function(idx, el) {
		var editor = $jq(el);
		if ( typeof(Calendar) != 'undefined' ) {
		    
		    var icon = $jq('.calendar_icon', editor.parent());
		    var view = $jq('.view', editor.parent());
		    var form = $jq(view).parents('form');
		    
		    var set = function(cal, date) {
			if ( date != editor.val() ) {
			    editor.val(date);
			    editor.change();
			    $jq('.needs_list_change', form).show();
			    view.text(cal.date.print('%a %m/%d/%y %I:%M%p'));
			}
		    };
		    
		    var calendar = new Calendar(0, null, set, function(cal){ cal.hide() });
		    calendar.isPopup = true;
		    calendar.showsTime = true;
		    calendar.setRange(2008, 2008);
		    calendar.setDisabledHandler(function(date){ return false; });
		    calendar.create(); // or Calendar.create();
		    
		    var show = function(evt) {
			calendar.showAtElement(evt.target, 'cc');
			calendar.setDateFormat('%a %m/%d/%y %I:%M%p');
			calendar.parseDate(view.text());
			calendar.setDateFormat('%Y-%m-%d %H:%M:00');
			setTimeout(function(){ calendar.hide(); }, 30000);
		    };
		    icon.click(show);
		    view.click(show);
		} else {
		    debug("Calendar js isn't loaded");
		}
	    }
	},
	'*.map': {
	    each: function(idx, el){
		var view = $jq(el);
		debug('MAPS DISABLED');
		return false;
		if ( typeof(GBrowserIsCompatible) != "undefined" ) {
		    if ( GBrowserIsCompatible() ) {
			var geocoder = new GClientGeocoder();
			var address = view.text();
			if (address) {
			    geocoder.getLatLng(address,
					       function(loc){
						   if ( !loc ) {
						       debug('Location ' + address + ' not found');
						   } else {
						       view.html('');
						       var map = new GMap2(view.get(0));
						       map.setCenter(loc, 15);
						       // BREAKING HERE
						       var mgr = new MarkerManger(map);
						       var marker = new GMarker(loc, {});
						       mgr.addMarker(marker);
						       mgr.refresh();
						   }
					       });
			}
		    } else {
			debug('Your browser is not capable of displaying google maps.');
		    }
		}
	    }
	},
	'*.save': {
	    click: function(evt) {
		var form = $jq(evt.target).parents('form');
		var saver = $jq(evt.target).parents('.save');
		saver = (saver.size()) ? saver : $jq(evt.target);
		saver.hide();
		form.ajaxSubmit({
			beforeSubmit: function(){
			    Thickbox.show('Saving...');
			},
			    success: function(){
			    Thickbox.update('Success!');
			    tb_remove();
			    $jq('.needs_list_change', form).hide();
			}
		    });
		return false;
	    }
	},
	'*.show': {
	    'click': function(evt){
		$jq(evt.target).hide();
		$jq('.panel', $jq(evt.target).parent()).fadeIn('slow');
		return false;
	    }
	},
	'*.hide': {
	    'click': function(evt){
		$jq(evt.target).parents('.panel').hide();
		$jq('.show', $jq(evt.target).parent().parent()).fadeIn('slow');
		return false;
	    }
	},
	'*.add': {
	    'click':function(evt) {
		var add = $jq(evt.target);
		var field = add.parents('field');
		var ctxt = ( field.size() ) ? field : add.parents('form');

		var needs_list = $jq('.needs_list', ctxt);
		var needs_empty_list = $jq('.needs_empty_list', ctxt);
		var needs_list_change = $jq('.needs_list_change', ctxt);

		var model = $jq('.model', ctxt);

		var list = $jq('.list', ctxt);

		var clone = model.clone().hide().removeClass('model').addClass('list');

		if ( clone.size() ) {
		    var params = $jq('*[name]', clone);
		    params.hide();
		    if ( params.size() > 1 ) {
			params.each(function(idx, el) {
				var name = $jq(el).attr('name') + '_' + (list.size() + 1);
				$jq(el).attr('name',name);
			    });
		    }
		    params.val('');
		    params.clearFields();
		    
		    $jq('.view', clone).html(blank);
		    var appender = ( list.size() ) ? list : model;
		    appender.parent().append(setup(clone.css('display', appender.css('display')).fadeIn('show')));

		    needs_empty_list.hide();
		    needs_list.show();
		    needs_list_change.show();
		} else {
		    debug('add(): no model found');
		}
		return false;
	    }
	} */
    };
    setup(document);
}

jQuery(document).ready(Rafa);