var kux = {
	defaults: {
		width: 580,
		height: 400,
		speed: 300,
		fade: 200,
		prefix: "modality",
		stopEvent: false,
		gallery: false,
		callback: function() {}
	}
};
kux.settings = {
	lightbox: "#"+kux.defaults.prefix,
	container: "#"+kux.defaults.prefix+"_container",
	content: "#"+kux.defaults.prefix+"_content",
	close: "."+kux.defaults.prefix+"_close",
	cache: kux.defaults.prefix+"_cache",
	loading: kux.defaults.prefix+"_loading",
	count: 1
};
var modality;

(function($) {
	
	$.modality = function(config) {
		
		var modality = this;
		
		modality.open = function(href,callback) {
		  $(config.lightbox).removeClass("image inline iframe ajax youtube");
		  $(".modality_next,.modality_prev").remove();
			var dimensions;
			
			$(config.lightbox).addClass(config.loading);
			
			if($(config.lightbox).is(":not(:visible)")) {
			  console.log("fade in");
				$(config.lightbox).fadeIn(config.fade);
			}

			if(config.href) {
				href = config.href;
			}
			
			// Check if a gallery
			if(config.gallery) {
			  var gallery = [];
  	    config.gallery.find("a").each(function() {
  	      gallery.push($(this).attr("href"));
  	    });
  	    
  	    var index = gallery.indexOf(href),
  	        next = $("<a href='#' class='modality modality_next'>Next</a>"),
  	        prev = $("<a href='#' class='modality modality_prev'>Prev</a>"),
  	        max = gallery.length-1;

  	    next.attr("href",gallery[index+1]);
  	    prev.attr("href",gallery[index-1]);

  	    if(index >= 0) {
  	      $("#modality_container").append(next).append(prev);
  	      if(index == 0) {
  	        $("#modality_container").find(".modality_prev").remove();
  	      } else if(index == max) {
  	        $("#modality_container").find(".modality_next").remove();
  	      }
  	    }
			}
		    
			// Checking for link type
			
			// See if link is local content
			if(href.indexOf("#") == 0) {
				$(config.lightbox).removeClass(config.loading);
				
				var content = $(href).clone();
				content.removeClass(config.cache);
				
				dimensions = setDimensions($(href));
				animate(dimensions,callback);
				addContent(content);
			}
			
			// Check if link is an image
			else if(href.indexOf(".jpg") >= 0 || href.indexOf(".png") >= 0 || href.indexOf(".bmp") >= 0 || href.indexOf(".gif") >= 0) {
				$(config.lightbox).removeClass(config.loading).addClass("image");
				
				var img = $("<img src='"+href+"' style='display: block;' />").hide();
				$("body").append(img);
				img.load(function() {
					dimensions = {
						width: img.width(),
						height: img.height()
					}
					
					animate(dimensions,callback);
					addContent(img.show());
				});
			}
			// Check if it's a youtube video
      else if(href.indexOf("youtube") >=0 ) {
        var iframe_code =  '<iframe src ="{path}" width="{width}" height="{height}" scrollbars="off" scrolling=0></iframe>';
        dimensions = setDimensions($(href));
        $(config.lightbox).removeClass(config.loading).addClass("youtube");

        // Youtube link
        movie_id = getV('v', href);
        movie = 'http://www.youtube.com/embed/'+movie_id+'?autoplay=1';
        iframe_code = iframe_code.replace(/{width}/g, dimensions.width ).replace(/{height}/g,  dimensions.height ).replace(/{path}/g, movie);
        var yt_video = $(iframe_code);
        animate(dimensions,callback);
        addContent(yt_video);

        
      }
			// And finally, if we should get link via ajax
			else {
				$.get(href, function(data) {
					$(config.lightbox).removeClass(config.loading);
					
					dimensions = setDimensions($(data));
					var slug = config.prefix+"_"+config.count;
					$("body").append("<div class='"+config.cache+"' id='"+slug+"'>"+data+"</div>");
					
					addContent(data);
					animate(dimensions,callback);
					
					config.count = config.count+1;
					
					$("a."+config.prefix+"[href='"+href+"']").attr("href","#"+slug);
				});
			}
		}
	
		modality.close = function() {
			$(config.lightbox).fadeOut(config.fade, function() {
				$(config.content).html("");
				$(document).unbind("click", addClickEvent);
			});
		}
		
		var clickHandler = function(e) {
			if($(e.target).parents(config.lightbox).length == 0) {
				plugin.close();
			}
			return false;
		}
		
		var animate = function(dimensions,callback) {
			if(dimensions.height > $(window).height()-100) {
				dimensions.height = $(window).height()-100;
			}
			
			var container = $(config.container),
					content = $(config.content);
			
			$(config.content).height(dimensions.height).width(dimensions.width);
			
			setTimeout(function() {
		    
		    $(config.container).animate({
  				marginTop: -(parseInt($(config.container).outerHeight(),10)/2),
  				marginLeft: -(parseInt($(config.container).outerWidth(),10)/2)
  			},config.speed);
  			
		    $(config.lightbox).removeClass(config.loading);
				//$(document).bind("click",addClickEvent);

				if(typeof config.callback == 'function') {
					config.callback.apply(dimensions);
				}
				if(typeof callback == 'function') {
					callback.apply(dimensions);
				}
		  },1);
		}
		
		var addContent = function(content) {
			$(config.content).html(content);
		}
		
		var setDimensions = function(object) {
			var dimensions;
			
			if(checkDimensions(object) != null) {
				dimensions = checkDimensions(object);
			} else {
				dimensions = {
					width: config.width,
					height: config.height
				}
			}
			return dimensions;
		}

		var checkDimensions = function(object) {
			var dimensions = {};
			
			if(object.width()) {
			  dimensions.width = object.outerWidth();
			}
			if(object.attr("data-width")) {
				dimensions.width = parseInt(object.attr("data-width"),10);
			}
			if(object.height()) {
			  dimensions.height = object.outerHeight();
			}
			if(object.attr("data-height")) {
				dimensions.height = parseInt(object.attr("data-height"),10);
			}
			if(dimensions.width || dimensions.height) {
				return dimensions;
			} else {
				return null;
			}
		}
	}
	
	$.fn.modality = function(options) {
		
		var config = $.extend({},kux.defaults,kux.settings,options);
		
		$(this.selector).live("click", function(event) {

			var href = $(this).attr("href");
			
			modality.open(href);
			if(config.stopEvent === true) {
				event.stopImmediatePropagation();
			}
			return false;
			
		});
		
		var modality = new $.modality(config);
		$(this).data("modality",modality);

	}
	
})(jQuery);

$(function() {
	
	kux.config = $.extend({},kux.defaults,kux.settings);	
	$("body").prepend("<div id='"+kux.config.prefix+"'><div id='"+kux.config.prefix+"_container'><a href='#' class='"+kux.config.prefix+"_close'>Close</a><div id='"+kux.config.prefix+"_content'></div></div></div>");
	modality = new $.modality(kux.config);
	
	$(document).keydown(function(e) {
		if(e.keyCode == 27 && $(kux.config.lightbox).is(":visible")) {
			kux.lightbox.close();
		}
	});
	
	var string = location.href.split("#");
	var object = deserialize(string[1]);
	if(object.launch) {
		modality.open("#"+object.launch);
	}
	
	$(kux.settings.close).live("click", function() {
		modality.close($(this));
		return false;
	});
	$("."+kux.config.prefix+"_text_close").live("click", function() {
		modality.close($(this));
		return false;
	});
	
});

function deserialize(str) {
  if (str == "" || str == undefined) {
    return {};
  } else {
    var obj = {};
    $.each(str.split("&"), function(index, value) {
      obj[value.split("=")[0]] = decodeURIComponent(value.split("=")[1]);
    });
    return obj;
  }
}

function addClickEvent(event) {
	if($(event.target).parents(kux.config.container).length <= 0) {
		modality.close();
	}
}

// Get youtube v = xxxxxxxx; code
function getV(name,url){
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( url );
  return ( results == null ) ? "" : results[1];
}
