
/* Copyright (c) 2011 der|Design */

(function($) {

	/* Posts Widget Popup Class */

	Der.classes.PostsWidgetPopup = function(id, type, trigger, container) {

		var self = this;

		var content = [];

		self.id = id;

		self.type = type;

		self.visible = false;
		
		/* Disable popup if no image specified */
		
		self.disable = trigger.data('disable_popup') || false;
		
		this.show = function() {

			// Hover In
			
			if ( self.disable ) { return; }
			
			self.set_html();

			self.visible = true;

			var pos = global_coords(trigger[0]);

			container.fadeIn( (Der.is('modern_browser') ) ? 300 : 0 );

		}

		function show_timeout() {

			clearTimeout( Der.get(type, 'timeout') );

			Der.set(type, 'timeout', setTimeout(self.show, 300));

		}

		this.hide = function() {
			
			// Hover Out
			
			if ( self.disable ) { return; }

			clearTimeout( Der.get(type, 'timeout') );

			if ( ! self.visible ) {
				return;
			}

			self.visible = false;

			container.hide();

		}

		this.set_html = function() {

			var code = trigger.data('html'); // Cached

			if ( ! code ) {

				code = Templates.replace(type, {
					'SRC': content[0]
				});

				trigger.data('html', code);

			}

			container.find('.wrap').html(code);

		}

		this.set_content = function(object) {

			content = object;

		}

		this.get_content = function(index) {

			return content[index];

		}


		/* Event handlers */

		$(trigger).hover(show_timeout, self.hide).mousemove(function(e) {

			// Mouse Move

			container.css({
				top: ( e.pageY - 45 ) + 'px',
				left: (e.pageX - 252 - 70) + 'px'
			});

		});

	}

	/* Creator Hook: [posts_widget] */

	Der.core.creator['posts_widget_popup'] = function(object_type, class_fn, trigger_items) {

		var self = Der; // Use RuntimeClass namespace.

		var popup_elem = $('#posts-widget-popup');

		$(trigger_items).each(function(i) {
			
			if ( $(this).find('img').attr('src') == Der.options.blank_image ) { 
			
				$(this).data('disable_popup', true);
				
			}

			self.objects[object_type].push( new class_fn(i, object_type, $(this), popup_elem) );

		});

		popup_elem.hover(function() {

			$(this).fadeOut( (Der.is('modern_browser') ) ? 200 : 0 );

		}, null);

	}
	
	/* Secondary Nav Popup Class */

	Der.classes.SecNavPopup = function (id, type, nav_elem, element) {

		var self = this;

		var content = [];

		self.id = id;

		self.type = type;

		self.visible = false;
		
		self.disabled = false;

		self.popup_timeout = null;

		self.position = 0;

		self.nav_elem = nav_elem;

		nav_elem.data('width', nav_elem.width() );

		self.show = function() {

			if ( ! self.visible ) {

				var coords = global_coords(nav_elem[0]);

				self.position = Der.window.width() - coords.left - nav_elem.data('width');

				self.set_html();

				element.css('right', self.position + 'px');

				element.find('.tip').css('right', (nav_elem.data('width')/2.0 - 9) + 'px' );

				element.fadeIn( (Der.is('modern_browser') ) ? 180 : 0 );

				self.visible = true;

			}

		}

		self.hide = function() {

			if ( self.visible  ) {

				self.nav_elem.css('textDecoration', 'none');

				element.hide();

				self.visible = false;

			}

		}

		this.set_content = function(object) {

			if ( object.length == 0 ) { self.disabled = true; }

			content = object;

		}

		this.get_content = function(index) {

			return content[index];

		}

		this.set_html = function() {

			var code = nav_elem.data('html'); // Cached

			if ( ! code ) {

				code = '';

				for (var i in content) {

					code += Templates.replace('nav_popup', {
						'TITLE': content[i].title[0],
						'URL': content[i].title[1],
						'THUMB': content[i].thumb,
						'TEXT': content[i].text
					});

				}

				nav_elem.data('html', code);

			}

			element.find('ul.posts').html(code);

		}

		nav_elem.hover(function(event) {
			
			switch(event.type) {

				case 'mouseenter':

					if ( Der.locked('nav_popups_lock') ) { return; }

					$(this).css('textDecoration', 'underline');

					Der.hide_visible_popups('nav_popup');

					clearTimeout(self.popup_timeout);

					if ( ! self.disabled ) { self.show(); }

					break;


				case 'mouseleave':

					if ( ! self.disabled ) { self.popup_timeout = setTimeout(self.hide, 1000); }
					
					else { $(this).css('textDecoration', 'none'); }

					break;

			}

		});

		element.hover(function(event) {

			switch(event.type) {

				case 'mouseenter':

					clearTimeout(self.popup_timeout);

					break;

				case 'mouseleave':

					self.popup_timeout = setTimeout(self.hide, 1000);

					break;

			}

		});

	}

	/* Creator Hook: [nav_popup] */

	Der.core.creator['nav_popup'] = function(object_type, class_fn, trigger_items) {

		var self = Der; // Use RuntimeClass namespace

		var popup_elem = $('#secondary-menu-popup');

		$(trigger_items).each(function(i) {

			self.objects[object_type].push( new class_fn(i, object_type, $(this), popup_elem) );

		});

	}

	/* Template Class */

	Der.classes.TemplateMgr = function() {

		var templates = {};

		this.add = function(id, code) {

			templates[id] = code;

		}

		this.get = function(id) {

			return templates[id];

		}

		this.replace = function(id, object) {

			var buffer = templates[id];

			for (var i in object) {

				buffer = buffer.replace(new RegExp('\\{' + i + '\\}', 'g'), object[i]);

			}

			return buffer + '\n';

		}

	}

	var Templates = new Der.classes.TemplateMgr();


	/* Initialization Code */

	queue_ready_fn(function() {

		Templates.add('nav_popup', '<li><a class="frame" href="{URL}"><img with="40" height="40" src="{THUMB}" /></a>\
<div class="text"><h4><a href="{URL}">{TITLE}</a></h4>\
<p>{TEXT}</p></div><div class="clear"></div></li>');

		Templates.add('posts_widget_popup', '<span class="tip"></span>\
<a><img width="240" src="{SRC}" /></a>');

		Der.create_objects('nav_popup', Der.classes.SecNavPopup, '#secondary-nav li a');

		Der.create_objects('posts_widget_popup', Der.classes.PostsWidgetPopup, '#right-sidebar .widget.posts_widget ul li a.frame');

	});

})(jQuery);
