var app = {
	start : function() {
		$.each(app.init, function(name, func) {
			if ($.isFunction(func)) {
				if (func()===false) {
					return false;
				}
			}
		});
	},
	event : {
		resize : function() {
			var top, left;
			var splash = $('div.splash');
			top = ($(window).height()-splash.height())/2;
			left = ($(window).width()-splash.width())/2;
			if (top<0) top = 0;
			if (left<0) left = 0;
			splash.css({
				top: top,
				left: left
			});
			var box = $('.floating-box-holder');
			top = ($(window).height()-box.height())/2;
			left = ($(window).width()-box.width())/2;
			if (top<0) top = 0;
			if (left<0) left = 0;
			box.css({
				top: top,
				left: left
			});
		},
		linkOnClick : function() {
			var name = app.page.name(this.href);
			if (name) {
				app.page.load(name);
				return false;
			}
			return true;
		}
	},
	init : {
		event : function() {
			app.event.resize();
			$(window).resize(app.event.resize);
			$(window).scroll(app.event.resize);
		},
		splash : function() {
			$('div.splash').css('background-image', 'url('+$('img.splash').attr('src')+')');
			$('img.splash').attr('src','css/images/spacer.gif').css({width: '100%', height: '100%'});
			$('a.splash, .content-menu a').click(function() {
				this.blur();
			});
		},
		links : function(target) {
			if (!target) {
				target = $('a');
			}
			var pages = app.config.ajaxPages;
			$.each(target, function(i, a) {
				if (a && a.href) {
					if (app.page.name(a.href) && !a.onclick) {
						a.onclick = app.event.linkOnClick;
					}
				}
			});
		},
		urlDetection : function() {
			var pageName = app.page.name(window.location.hash ? window.location.hash.substring(1) : null);
			if (pageName) {
				window.location = pageName;
				return false;
			} else {
				setInterval("app.page.detect()", 100);
			}
		},
		menu : function() {
			$.each($('.content-menu li'), function(i, item) {
				item = $(item);
				var anchor = item.find('a');
				var name;
				
				if (anchor.length) {
					name = anchor.html();
					anchor.html('<div class="menu-item '+name+' clickable"></div>');
					item.addClass('clickable');
				} else {
					name = item.html();
					item.html('<div class="menu-item '+name+'"></div>');
				}
				
			});
		},
		language : function() {
			app.language.get();
			$('.content-language-option').click(function(){
				var it = $(this);
				var options = app.language.options;
				for (var i=0; i<options.length; i++) {
					if (it.hasClass(options[i])) {
						app.language.set(options[i]);
						return;
					}
				}
			});
		}
	},
	config : {
		ajaxPages : {
			'' : {
				className : 'index'
			},
			'index.php' : {
				className : 'index'
			},
			'julie-h-profile.php' :{
				className : 'about-me'
			},
			'my-contacts.php' :{
				className : 'my-contacts'
			},
			'films.php' :{
				className : 'films'
			},
			'stage-posters.php' :{
				className : 'stage-posters'
			},
			'stage-makeup.php' :{
				className : 'stage-makeup'
			},
			'makeup-class.php' :{
				className : 'makeup-class'
			},
			'wedding.php' :{
				className : 'wedding'
			},
			'my-book.php' :{
				className : 'my-book'
			}
		}
	},
	menu : {
		select : function(className) {
			$('.menu-pointer').removeClass().addClass('menu-pointer '+className);
			$('.content-menu li.selected').removeClass('selected');
			$('div.menu-item.'+className).parentsUntil('li').parent().addClass('selected');
		}
	},
	page : {
		current : null,
		detect : function() {
			var name = app.page.name(window.location.hash ? window.location.hash.substring(1) : window.location.toString());
			if (name && (!app.page.current || name != app.page.current)) {
				 app.page.load(name);
			}
		},
		name : function(href) {
			if (href && typeof(href)=='string') {
				href = href.replace(/(.*\/|\#.*)/g,'');
				if (href==='') {
					href = 'index.php';
				}
				if (app.config.ajaxPages[href]) {
					return href;
				}
			}
			return null;
		},
		getConfig : function(href) {
			var name = app.page.name(href);
			if (name) {
				return app.config.ajaxPages[name];
			}
			return null;
		},
		load : function(name) {
			if (app.page.current == name) {
				return;
			}
			var config = app.page.getConfig(app.page.current);
			if (config && app.page.current != name && app[config.className] && app[config.className].onUnload && $.isFunction(app[config.className].onUnload)) {
				app[config.className].onUnload();
			}
			config = app.page.getConfig(name);
			if (config) {
				if (!name) name = '';
				if (app.page.name(window.location.toString()) != name) {
					window.location = '#'+name;
				} else {
					window.location = '#';
				}
				if (config.className) {
					app.menu.select(config.className);
				}
				app.page.current = name;
				var box = $('.floating-box-holder');
				box.css({
					top: ($(window).height()-box.height())/2,
					left: ($(window).width()-box.width())/2
				}).show();
				if (!app.page.use(name)) {
					var setting = {
						url : name+'?content-only=1',
						success : app.page.loaded,
						context : {
							name : name
						}
					};
					$.ajax(setting);
				}
			}
		},
		data : {},
		loaded : function(data) {
			var config = $.parseJSON(data.substring(0,data.indexOf("\n")));
			config.content = data.substring(data.indexOf("\n")+1);
			app.page.data[this.name] = config;
			app.page.use(this.name);
		},
		use : function(name) {
			var data = app.page.data[name];
			if (data) {
				if (app.page.current != name && app[app.page.current] && app[app.page.current].onUnload && $.isFunction(app[app.page.current].onUnload)) {
					app[app.page.current].onUnload();
				}
				app.page.current = name;
				var className = app.config.ajaxPages[name].className;
				document.title = data.title;
				$('.content').hide();
				if (!$('.content.'+className).show().length) {
					var content = $('<div class="content '+className+'">').html(data.content).appendTo('.content-holder');
					app.init.links(content);
				}
				app.language.update();
				app.page.include(className);
				return true;
			}
			return false;
		},
		include : function(name) {
			if (!name) {
				return false;
			}
			if (app[name]) {
				$('.content.'+name).focus();
				if (app[name].onLoaded && $.isFunction(app[name].onLoaded)) {
					app[name].onLoaded();
				}
				$('div.floating-box-border div.icon.loading').hide();
				return true;
			}
			$('div.floating-box-border div.icon.loading').show();
			var jsLoader=document.createElement('script');
			var jsUrl = 'pages/'+name+'/page.js';
			jsLoader.setAttribute("type","text/javascript");
			jsLoader.setAttribute("src", jsUrl);
			document.getElementsByTagName("head")[0].appendChild(jsLoader);
			var cssLoader = document.createElement("link");
			var cssUrl = 'pages/'+name+'/page.css';
			cssLoader.setAttribute("rel", "stylesheet");
			cssLoader.setAttribute("type", "text/css");
			cssLoader.setAttribute("href", cssUrl);
			document.getElementsByTagName("head")[0].appendChild(cssLoader);
			return false;
		}
	},
	declare : function(name, object) {
		app[name] = object;
		if (app[name].onLoad && $.isFunction(app[name].onLoad)) {
			app[name].onLoad();
		}
		$('div.floating-box-border div.icon.loading').hide();
	},
	scrollbar : {
		init : function(name, onSlide) {
			$('.content.'+name+' .content-scroller').css('overflow','hidden').attr('scrollTop', 0);
			$('.content.'+name+' .content-scrollbar').slider({
				orientation: "vertical",
				range: "min",
				min: 0,
				max: 100,
				value: 100,
				slide: onSlide
			});
		}
	},
	lightbox : {
		show : function(callback, loading) {
			var box = $('div.lightbox');
			if (!box.length) {
				box = $('<div class="lightbox">')
					.appendTo('body')
					.hide();
				app.lightbox.resize();
				$(window).resize(app.lightbox.resize);
			}
			if (loading) {
				box.addClass('loading');
			} else {
				box.removeClass('loading');
			}
			box.fadeTo(500, .65, callback);
		},
		hide : function(callback) {
			$('div.lightbox').fadeOut(callback);
		},
		resize : function() {
			$('div.lightbox').css({
				width: $(window).width()+'px',
				height: $(window).height()+'px'
			});
		}
	},
	language : {
		options : ['en', 'zh'],
		current : null,
		detect : function() {
			var options = app.language.options;
			var lang = (navigator.language) ? navigator.language : navigator.userLanguage;
			for (var i=0; i<options.length; i++) {
				if (lang.indexOf(options[i])==0) {
					return options[i];
				}
			}
			return options[0];
		},
		get : function() {
			var lang = app.language.current;
			if (!lang) {
				lang = app.cookie.get('lang');
			}
			if (!lang) {
				lang = app.language.detect();
			}
			if (!lang) {
				lang = 'en';
			}
			if (!app.language.current) {
				app.language.set(lang);
			}
			return lang;
		},
		set : function(lang) {
			if (!lang) lang = 'en';
			app.cookie.set('lang', lang);
			app.language.current = lang;
			app.language.update();
		},
		update : function() {
			$('.content-language-option.selected').removeClass('selected');
			$('.content-language-option.'+app.language.get()).addClass('selected');
			$('.lang').hide();
			$('.lang.'+app.language.get()).show();
		},
		is : function(lang) {
			return (app.language.get().indexOf(lang) != -1);
		}
	},
	cookie : {
		set : function(name, value, days) {
			var exdate=new Date();
			exdate.setDate(exdate.getDate()+days);
			document.cookie=name+ "=" +escape(value)+ ((days==null) ? "" : ";expires="+exdate.toUTCString());			
		},
		get : function(name) {
			if (document.cookie.length>0) {
				var c_start=document.cookie.indexOf(name + "=");
				if (c_start!=-1) {
					c_start=c_start + name.length+1;
					var c_end=document.cookie.indexOf(";",c_start);
					if (c_end==-1) c_end=document.cookie.length;
					return unescape(document.cookie.substring(c_start,c_end));
				}
			}
			return "";			
		}
	},
	photo : {
		current : null,
		show : function(imageSrc, options) {
			var func;
			if (options && options['onShow'] && $.isFunction(options['onShow'])) {
				func = options['onShow'];
				func();
			}
			app.lightbox.show(null, true);
			var holder = $('div.photo');
			var wrapper = $('div.photo-wrapper');
			var frame = $('div.photo div.frame');
			var scrollbar = $('div.photo div.scrollbar');
			var closeBtn = $('div.photo div.close');
			if (!holder.length) {
				holder = $('<div class="photo">')
					.appendTo('body')
					.hide();
				wrapper = $('<div class="photo-wrapper">')
					.appendTo(holder);
				frame = $('<div class="frame">')
					.appendTo(wrapper)
					.css('overflow','hidden')
					.attr('scrollTop', 0)
					.click(app.photo.hide);
				closeBtn = $('<div class="close">')
					.appendTo(wrapper)
					.click(app.photo.hideNow)
					.mouseover(app.photo.cancelHide);
				$(window).resize(app.photo.resize);
			}
			closeBtn.hide();
			holder.fadeTo(500, 1);
			frame.children().remove();
			var img;
			if (options && options['preview']) {
				img = $('<img src="'+options['preview']+'" />');
			} else {
				img = $('<img src="images/spacer.gif" />');
			}
			img.appendTo(frame);
			if (options && options['autoHide']) {
				img.bind('mouseout', app.photo.hide);
			}
			app.photo.current = {
				imageSrc: imageSrc,
				options: options
			};
			app.photo.resize();
			img.css('visibility', 'hidden')
				.attr('src', imageSrc)
				.load(function(event) {
					app.photo.resize();
					$(this).css('visibility', 'visible').fadeIn();
					$('div.photo div.close').fadeIn();
				});
		},
		hideTimer : null,
		hide : function() {
			app.photo.cancelHide();
			app.photo.hideTimer = setTimeout("app.photo.hideNow()",100);
		},
		cancelHide : function() {
			clearTimeout(app.photo.hideTimer);
		},
		hideNow : function() {
			app.lightbox.hide();
			$('div.photo').fadeOut();
			if (app.photo.current) {
				var func, options = app.photo.current.options;
				if (options && options['onHide'] && $.isFunction(options['onHide'])) {
					func = options['onHide'];
					func();
				}
			}
		},
		resize : function() {
			var newHeight = $('div.photo div.frame img').height();
			var newWidth = $('div.photo div.frame img').width();
			$('div.photo').css({
				left: ($(window).width()-newWidth)/2+'px',
				top: ($(window).height()-newHeight)/2+'px'
			});
		}
	}
};
