MISWeb = (function(){
	
	var self;
	
	//Private members
	var model = (function(controller){
			var controller = controller
			
			// Model Functions
			return {
				name:'model',
				ajax:function(obj) {
					// ajax calls here
					jQuery.ajax(obj);
				},
				updateUrl:function() {
					if (controller.category) {
						if (controller.project) {
							window.location.hash = controller.category + controller.project;
						} else {
							window.location.hash = controller.category;
						}
					} else {
						window.location.hash = '';	
					}
				},
				parseHash:function() {
					var hash = window.location.hash;
					var li = hash.match(/[a-z-]*\/+/g);
					if (!li) {
						// invalid url...
						return;	
					}
					if (li.length==2) {
						controller.category=li[0];
						controller.project=li[1];	
					} else {
						controller.category=li[0];
					}
				}
			}	
		});	

	var view = (function(controller) {
			var controller = controller
			var mobile_navigation = jQuery('#navigation.mobile-navigation')
			var navigation = jQuery('#navigation')
			var category = jQuery('#category')
			var project = jQuery('#project')
			var image = jQuery('#image')
			
			// tool tips
			var tt_loading = jQuery('#tt_loading')
			var tt_close = jQuery('#tt_close')

			// View Functions
			return {
				name:'view',
				displayMobileNavigation:function(hide) {
					// called from successful ajax request
					if (hide) {
						mobile_navigation.fadeOut(600);
					} else {
						mobile_navigation.fadeIn(600);
					}
				},
				displayNavigation:function(hide) {
					// called from successful ajax request
					if (hide) {
						navigation.css('display', 'none');
					} else {
						navigation.css('display', '');
					}
				},								
				displayCategory:function(hide) {
					// called from successful ajax request
					if (hide) {
						category.fadeOut(600);
					} else {
						category.fadeIn(600);
					}
				},
				displayProject:function(hide) {
					// called from successful ajax request
					if (hide) {
						project.fadeOut(600);
					} else {
						project.fadeIn(600);
					}
				},
				displayImage:function(hide) {
					// called from successful ajax request
					if (hide) {
						image.fadeOut(600);
					} else {
						image.fadeIn(600);
					}
				},
				populateCategory:function(data) {
					category.html(data)	
				},
				populateProject:function(data) {
					project.html(data)	
				},
				populateImage:function(data) {
					image.html(data)	
				},
				fadeOutCategoryElements:function() {
					var speed = 1500;
					jQuery('#category_projects').fadeOut(speed)
					jQuery('#category_description').fadeOut(speed)	
					jQuery('#category_nav').fadeOut(speed)
				},
				fadeInCategoryElements:function() {
					var speed = 700;
					jQuery('#category_projects').fadeIn(speed)
					jQuery('#category_description').fadeIn(speed)	
					jQuery('#category_nav').fadeIn(speed)
				},
				loadingToolTip:function(hide) {
					if (hide) {
						tt_loading.delay(600).fadeOut(300);
					} else {
						tt_loading.fadeIn(300);
					}						
				},
				closeToolTip:function(hide) {
					if (hide) {
						tt_close.fadeOut(300);
					} else {
						tt_close.fadeIn(300);
					}						
				}							
			}	
		})

	return {
		name:'controller',
		category:'',
		project:'',
		image:'',
		cms_url:'/zenphoto/',
		init:function() {
			self = cp(this) // since 'this' in callbacks is an html element
			model = model(this);
			view = view(this);
			this.model = model;
			this.view = view;
			
			jQuery('.category').click(cp(this).evnt_categoryClick);

			// loading box			
			$(document).mousemove(function(e){
			    $("#tt_loading").css({
			        top: (e.pageY + 15) + "px",
			        left: (e.pageX + 15) + "px"
			    });
			});
			
			// Profile Fadein/out
			jQuery('#mis-name').hover(function() {
				jQuery('#profile').stop().animate();
				jQuery('#profile').fadeIn(600);
				jQuery('#navigation-fade').stop().animate();
				jQuery('#navigation-fade').fadeOut(300);		
			},function() {
				jQuery('#navigation-fade').stop().animate();
				jQuery('#navigation-fade').fadeIn(300);
				jQuery('#profile').stop().animate();
				jQuery('#profile').fadeOut('slow', function() {
					jQuery('#profile').css('opacity','1');	
				});	
			});
			
			// Load any url in the location bar
			if (window.location.hash) {
				model.parseHash()
				if (this.category) {
					if (this.project) {
						var projObj = {
						  		url: this.cms_url + this.category + this.project,
						  		success: cp(self).evnt_projectLoaded
							};
						var cb_func = function(data) { 
							cp(self).evnt_categoryLoaded(data);
							cp(model).ajax(projObj);
						};
					};
					
					if (!cb_func) {
						var cb_func = cp(self).evnt_categoryLoaded;	
					};
					
					model.ajax({
				  		url: this.cms_url + this.category,
				  		success: cb_func
					});				
				}
			}
		},
			closeMouseMove:function() {
			$('.close').mousemove(function(e){
				self.closeOn = true;
			    $("#tt_close").css({
			        top: (e.pageY + 15) + "px",
			        left: (e.pageX + 15) + "px"
			    });
			    self.view.closeToolTip(true);
			    clearTimeout(self.timer);
			    self.timer = setTimeout(function() {
		    		if (self.closeOn) {
			    		self.view.closeToolTip();
		    		};
			    }, 1100);		    
			});	
			$('.close').mouseout(function(){
				self.closeOn = false;
			});						
		},		
		evnt_categoryClick:function(tag) {
			var url = this.cms_url + tag + '/';
			self.category = tag + '/'; 
			
			model.ajax({
		  		url: url,
		  		success: cp(self).evnt_categoryLoaded
			})
			view.loadingToolTip()
			return false;
		},
		evnt_categoryLoaded:function(data) {
			view.loadingToolTip(true)
			view.populateCategory(data);
			view.displayCategory();
			jQuery('#category .close').click(cp(self).evnt_categoryCloseClick);
			jQuery('.project, .thumb').click(cp(self).evnt_projectClick);
			jQuery('.project, .thumb').hover(cp(self).evnt_projectOver, cp(self).evnt_projectOut);
			self.closeMouseMove();	
			view.displayMobileNavigation(true);	
			view.displayNavigation(true);
			model.updateUrl()
		},
		evnt_projectClick:function(e) {			
			self.project = jQuery(this).attr('rel') + '/';
			var url = '/zenphoto/' + self.category + self.project;
			
			model.ajax({
		  		url: url,
		  		success: cp(self).evnt_projectLoaded
			})
			view.loadingToolTip()
			return false;
		},
		evnt_projectOver:function(e) {
			var cur_cl = jQuery(this).attr('class').split(/\s+/).shift();
			var query = '.' + ( cur_cl=='thumb' ? 'project' : 'thumb' ) + '[rel|="' + jQuery(this).attr('rel') + '"]'
			jQuery(query).removeClass('out').addClass('over');
		},
		evnt_projectOut:function(e) {
			var cur_cl = jQuery(this).attr('class').split(/\s+/).shift();
			var query = '.' + ( cur_cl=='thumb' ? 'project' : 'thumb' ) + '[rel|="' + jQuery(this).attr('rel') + '"]'
			jQuery(query).removeClass('over').addClass('out');
		},
		evnt_projectLoaded:function(data) {
			view.loadingToolTip(true)
			view.populateProject(data);
			view.displayProject();	
			jQuery('#project .close').click(cp(self).evnt_projectCloseClick);
			jQuery("a.proj_image").hover(function() {
				var bkg_img = jQuery(this).attr('name');
				var bkg_css = 'url("' + bkg_img + '")'
				jQuery("#project_img").css('background-image',bkg_css);				
			}, function() {
				//pass
			});
			jQuery("a.video").click(cp(self).evnt_imageClick);
			jQuery("a.proj_image").click(function() { return false; });
			view.fadeOutCategoryElements();
			self.closeMouseMove();
			ViewDescription().init();
			model.updateUrl()
			self.preload_images_list = jQuery.map(jQuery("a.proj_image"), function(item) { return jQuery(item).attr('name') })
			jQuery.preLoadImages.apply(window, self.preload_images_list);
		},
		evnt_imageClick:function(e) {
			var url = jQuery(this).attr('rel');
			
			model.ajax({
		  		url: url,
		  		success: cp(self).evnt_imageLoaded
			})
			view.loadingToolTip()
			return false;
		},
		evnt_imageLoaded:function(data) {
			view.loadingToolTip(true)
			view.populateImage(data);
			view.displayImage();	
			jQuery('#image .close').click(cp(self).evnt_imageCloseClick);
			self.closeMouseMove();
			model.updateUrl()
		},				
		evnt_categoryCloseClick:function(e) {
			self.closeOn = false;
			self.view.closeToolTip(true);
			view.displayCategory(true);
			self.category = '';
			view.displayMobileNavigation();
			view.displayNavigation();
			model.updateUrl()
		},
		evnt_projectCloseClick:function(e) {
			self.closeOn = false;
			self.view.closeToolTip(true);
			view.displayProject(true);
			self.project = '';
			view.fadeInCategoryElements();
			model.updateUrl()
		},
		evnt_imageCloseClick:function(e) {
			self.closeOn = false;
			self.view.closeToolTip(true);
			view.displayImage(true);
			self.image = '';
			model.updateUrl()
		}		
	}
})

// Project Description expand/collapse
ViewDescription = (function(){
	var tab = jQuery('#project_view_desc');
	var container = jQuery('#project_desc');
	var paragraph = jQuery('#project_desc p.desc');
		
	return {
		name:'View Description Tab',
		init:function() {
			tab.toggle(cp(this).expand, cp(this).collapse);
			return this;
		},
		expand:function() {
			var _height = jQuery(window).height() - 60;
			container.animate({'height': _height + 'px'}, 600, function() { paragraph.fadeIn() });
			jQuery(this).blur()
		}, 
		collapse:function() {
			paragraph.fadeOut()
			container.animate({'height': 0}, 600);	
			jQuery(this).blur()
		}
	}
});

(function($) {
  var cache = [];
  // Arguments are image paths relative to the current page.
  $.preLoadImages = function() {
	var args_len = arguments.length;
	for (var i = args_len; i--;) {
	  var cacheImage = document.createElement('img');
	  cacheImage.src = arguments[i];
	  cache.push(cacheImage);
	}
  }
})(jQuery)

NavigationResizer = (function(){
	var navigation = jQuery('#navigation');
	
	return {
		name:"NavigationResizer",
		init:function() {
			jQuery(window).resize(cp(this).resize);
			/* set initial size */
			this.resize()
			
			return cp(this);	
		},
		resize:function() {
			var height = jQuery(window).height() - 124;
			navigation.height(height);
		}
	}
});

// Ensures 'this' is maintained 
// in callback functions
var cp = function(self) {
	var _this = self;
	return _this;	
}

// Flash callback function
var category_click = function (data) {
	misweb.evnt_categoryClick(data);
	return false;
}
