// (c) SZOK.IT 2009 - Krzysztof Frankiewicz

var colors = 
	{
		red : '#9F261F',
		green : '#12891F',
		yellow : '#D2B203'
	};


/*
* na wstepie laduje moduly: logo, login, top, left, right
*/

var szok = {
	// parametry okna
	window : { w : 0 , h : 0 },
	// obiekt przechowujacy zaladowane moduly
	userName : null,
	modules : {},
	// parametry do wczytywania modulow
//	moduleSetup : { dir : 'js/modules/', ext : '.module.js' },
	moduleSetup : { dir : '', ext : '.mod' },
	// tutaj przechowywany jest aktualnie zaladowany modul w prawym komponencie strony
	moduleLoaded : null,
	// tutaj jest PHPSESSID do sprawdzania logowania
	SESSIONID : null,
	comment : {
		add : function (t,i) {
//			szok.comment.createBox(table,id);
			if ($('#commentBox').size() > 0 ) return;
			var f = $('<div id="commentBox" />');
			f.load('komentarz.html',{table:t,id:i},function () {
				if (f.find('.loginbox').size() > 0)
				{
					szok.comment.dim();
					f.attr('id','floaterBox').appendTo('body').css({left:0,top:0,opacity: 0});
					$(window).bind('scroll',szok.comment.floaterPosition);
					$(window).bind('resize',szok.comment.floaterPosition);
				}
				else
				{
					$('#comment #footer > .add').hide();
					f.appendTo('#comment #footer');
				}
			});
		},
		writePost : function (i) {
//			szok.comment.createBox(table,id);
			if ($('#commentBox').size() > 0 ) return;
			var f = $('<div id="commentBox" />');
			f.load('forum.html',{newpost:true,id:i},function () {
				if (f.find('.loginbox').size() > 0)
				{
					szok.comment.dim();
					f.attr('id','floaterBox').appendTo('body').css({left:0,top:0,opacity: 0});
					$(window).bind('scroll',szok.comment.floaterPosition);
					$(window).bind('resize',szok.comment.floaterPosition);
				}
				else
				{
					$('#comment #footer > .add').hide();
					f.appendTo('#comment #footer');
				}
			});
		},
		previewPost : function () {
			if ($('#floaterBox').size() > 0) return;
			var data = $('textarea#komentarz').serializeArray();
			data[data.length] = {name:'newpostpreview', value: true};
			var f = $('<div id="floaterBox" />').appendTo('body').css({left:0,top:0,opacity: 0});
			szok.comment.dim();
			f.load('forum.html',data,szok.comment.floaterPosition);
			
		},
		postPreviewHide : function () {
			$('#floaterBox').unbind();
			$('div[id="dim"],div[id="floaterBox"]').remove();
		},
		sendPost : function (i) {
			var k = $('textarea#komentarz').val();
			$.post('forum.html',{komentarz: k, mode: 'ajax', newpostsubmit: true, id: i},function () { szok.comment.reload('forum__topic',i); });
			szok.comment.close();
		},
		createBox : function (t,i) {
			if ($('#dim').size() > 0 ) return;
			szok.comment.dim();
			szok.comment.floater(t,i);
		},
		dim : function () {
			var w = $(document).width();
			var h = $(document).height();
//			$('.embed > *').hide();
			$('#dim').remove();
			$('<div id="dim" />').appendTo('body').css({opacity:0.6,width: w, height: h}).click(szok.comment.close);
		},
		floater : function (t,i) {
			if ($('#floaterBox').size() > 0 ) return;
			var f = $('<div id="floaterBox" />').appendTo('body').css({left:0,top:0,opacity: 0});
			f.load('komentarz.html',{table:t,id:i},szok.comment.floaterPosition);
			$(window).bind('scroll',szok.comment.floaterPosition);
			$(window).bind('resize',szok.comment.floaterPosition);
		},
		floaterPosition : function () {
			szok.cufon();
			var d = $(document).width();
			$('#dim').width(d);
			var w = $(window).width();
			var h = $(window).height();
			var f = $('#floaterBox');
			var l = $(window).scrollLeft() + (w - f.outerWidth()) / 2;
			var t = $(window).scrollTop() + (h - f.outerHeight()) / 2;
			f.css({left:l,top:t}).css({opacity:1});
			$('textarea#komentarz').focus();
		},
		close : function (e) {
			if (e) e.preventDefault();
//			$('.embed > *').show();
			$(window).unbind('scroll',szok.comment.floaterPosition);
			$(window).unbind('resize',szok.comment.floaterPosition);
			$('div[id="dim"],div[id="floaterBox"],div[id="commentBox"],div[id="floaterBox_hidden"]').remove();
			$('#comment #footer > .add').show();
		},
		send : function (t,i) {
			var k = $('textarea#komentarz').val();
			$.post('komentarz.html',{komentarz: k, mode: 'ajax', table: t, id: i},function () { szok.comment.reload(t,i); });
			szok.comment.close();
		},
		login : function (t,i) {
			var data = $('#logowanie').serializeArray();
			data[data.length] = {name: 'mode',value: 'ajax'};
			data[data.length] = {name: 'post',value: 'logowanie'};
			$.post('konto.html',data,function (d) {
				if (d.logged)
				{
					szok.comment.close();
					szok.comment.add(t,i);
				}
				else
					$.jGrowl('Złe hasło lub login',{ header: 'Błąd logowania' , background: colors.red });
			},'json');
		},
		forumLogin : function (node) {
			var data = $('#logowanie').serializeArray();
			data[data.length] = {name: 'mode',value: 'ajax'};
			data[data.length] = {name: 'post',value: 'logowanie'};
			$.post('konto.html',data,function (d) {
				if (d.logged)
				{
					szok.comment.close();
					szok.comment.newForumTopic(node);
				}
				else
					$.jGrowl('Złe hasło lub login',{ header: 'Błąd logowania' , background: colors.red });
			},'json');
		},
		reload : function (t,i) {
			var c = $('#comment #feed');
			$.post('komentarz.html',{table:t,id:i,reload:true},function (d) { $(d).insertAfter(c); c.remove(); szok.cufon(); szok.comment.transformLinks(); },'html');
		},
		transformLinks : function () {
			$('#comment #feed .tresc').each(function (i,e) {
				$(this).html((' '+$(this).html()).replace(/\s(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, ' <a href=$1 target=_blank>$1</a>'));
				$(this).children('a[href$=jpeg],a[href$=jpg],a[href$=gif],a[href$=png]').addClass('fancylink').fancybox();
			});
			$('#comment object').movieResize(460);
			$('#comment #feed .tresc a[href*=youtube]').click(function (e) {e.preventDefault();})
			.each(function (i,e) { 
				var h = $(this).attr('href');
				h = h.replace("watch?v=","v/");
				$('<div id="fancy'+i+'" style="display:none; width: 640px; height: 505px;">\
				<object width="640" height="505">\
				<param name="movie" value="'+h+'"></param>\
				<param name="allowFullScreen" value="true"></param>\
				<param name="allowscriptaccess" value="always"></param>\
				<embed src="'+h+'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed>\
				</object>\
				</div>').insertAfter(this);
				$(this).addClass('fancylink').attr('href','#fancy'+i);
			});
			$('.fancylink').fancybox({frameWidth:640,frameHeight: 505});
		},
		newForumTopic : function (node) {
			if ($('#floaterBox').size() > 0 ) return;
			szok.comment.dim();
			var f = $('<div id="floaterBox" />').appendTo('body').css({left:0,top:0,opacity: 0});
			f.load('forum.html',{node:node,newtopic:true},szok.comment.floaterPosition);
			$(window).bind('scroll',szok.comment.floaterPosition);
			$(window).bind('resize',szok.comment.floaterPosition);
		},
		newTopicPreview : function () {
			if ($('#floaterBox_hidden').size() > 0) return;
			$('#floaterBox').attr('id','floaterBox_hidden').hide();
			var data = $('form#forumNewTopic').serializeArray();
			data[data.length] = {name:'newtopicpreview', value: true};
			var f = $('<div id="floaterBox" />').appendTo('body').css({left:0,top:0,opacity: 0});
			f.load('forum.html',data,szok.comment.floaterPosition);
			
		},
		newTopicPreviewHide : function () {
			$('#floaterBox').unbind().remove();
			$('#floaterBox_hidden').attr('id','floaterBox').show();
		},
		newTopicSubmit : function () {
			var data = $('form#forumNewTopic').serializeArray();
			data[data.length] = {name:'newtopicsubmit', value: true};
			data[data.length] = {name:'mode', value: 'ajax'};
			$.ajax({
					url: 'forum.html',
					data: data,
					async: false,
					type: 'post',
					success: function (data) {
						if (data.error)
							$.jGrowl(data.error,{ header: 'Jest błąd' , background: colors.red });
						else
						{
							szok.comment.close();
							location.hash = data.link;
						}
					},
					dataType: 'json'
			});
		}
	},
	cufon : function () {
		Cufon.replace('.bluehighway',{ fontFamily: 'Blue Highway' });
		Cufon.replace('.hemi',{ fontFamily: 'Hemi Head 426', textShadow: '#DDD 1px 1px' });
		Cufon.replace('.steelfish',{ fontFamily: 'Steelfish' });
		Cufon.now();
	},
	// build buduje panel
	build : function () {
		szok.window.w = $(window).width();
		szok.window.h = $(window).height();
		
		$('.heightmaker').height(szok.window.h - 122);
		
		
		// zaladuj moduly
		szok.moduleLoader.loadAndBuild('newest').loadAndBuild('jokes');
		// zacznij sluchac zmian hasha
		hashListener.add(szok.controller);
		szok.starter();
		szok.controller();
		$('.wrapper .bottom').fadeIn();
	},
	loadHTML : function (fn,addr) {
		fn = ($.isFunction(fn)) ? fn : function () {};
		addr = (addr) ? addr : location.hash.substr(1);
		var url = addr+'.html';
		$('.main .left').attr({ url : url }).animate({opacity: 0},150,function () {
			$.ajax({
				type : 'POST',
				url : url,
				dataType : 'html',
				data : {include:true},
				cache : true,
				async : false,
				beforeSend : function () {
				},
				success : function (data) {
					if ($('.main .left').attr('url') == url)
					{
						$('.main .left').html(data).animate({opacity: 1},150);
						szok.comment.transformLinks();
						szok.mendLinks();
						
						fn();
					}
				},
				error : function (rq, txt, err) {
					$('.main .left').animate({opacity: 1},200);
					$.jGrowl(url+': '+txt,{ header: 'Błąd pobierania strony', background : colors.red });
				}
			});
		});
	},
	
	mendLinks : function () {
		$('a:not(a.fancylink)').unbind().click(function (e) {
				var hr = $(this).attr('href');
				e.preventDefault();
				if (hr.substr(0,14) == 'http://szok.it')
				{
					if (hr.search('#') >= 0)
						location.href = hr;
					else
						location.hash = hr.substr(14).split('.')[0];
					return;
				}
				if (hr.substr(0,1) == '/')
					location.hash = hr.split('.')[0];
				else if (hr.substr(0,4) == 'http') {
					$.jGrowl('<small>'+hr+'</small>',{header: 'Nowe okno'});
					window.open(hr);
				}
				else if (hr.substr(0,10) == 'javascript')
					eval(hr.substr(11));
				return;
				
				if (hr.substr(0,14) != 'http://szok.it' && hr.substr(0,10) != 'javascript')
				{
					e.preventDefault();
				}
		});
	},

	// nasluchuje zmian rozmiarow okna, aby spozycjonowac na nowo panel
	resizeListener : function (e) {
		szok.window.w = $(window).width();
		szok.window.h = $(window).height();
		
		$('.heightmaker').height(szok.window.h - 122);
	},
	// startuje z loginem lub panelem gdy zaladuja sie moduly podstawowe
	starter : function () {
		location.hash = (!location.hash) ? '#/media' : location.hash;
	},
	controller : function () {
		var hash = location.hash.substr(1);
		
		szok.comment.close();
		
		var moduleName = szok.readHash();
		if (moduleName != szok.moduleLoaded)
		{
			szok.load(moduleName);
		}
		else if (typeof(szok.modules[moduleName]) != 'undefined')
		{
			szok.modules[moduleName].controller(szok.readHash(true));
		}
	},
	// metoda do ladowania modulow do prawej komponenty strony
	load : function (name) {
//		szok.modules[szok.moduleLoaded].destroy();

			if (szok.moduleLoaded !== null)
				if (szok.modules[szok.moduleLoaded] != null)
					szok.modules[szok.moduleLoaded].destroy();
//			szok.modules.right.container.hide().empty();
			szok.moduleLoaded = name;
			if (szok.modules[name])
				szok.modules[name].build();
			else
				szok.moduleLoader.addFunction(function () { szok.modules[name].build(); }).load(name).executeStack();
	},
	// metoda zczytujaca parametry z hasha
	readHash : function (tail) {
		if (tail)
			return location.hash.substr(2).split('/');
		else
			return location.hash.substr(2).split('/')[0];
	},
	// mechanizm ladowania modulow
	moduleLoader :
	{
		items : 0, // licznik stosu ladujacych sie modulow
		notifications : false, // wlacz/wylacz powiadomienia o ladowaniu i sukcesie
		load : function (name) // load(nazwamodulu) nazwamodulu odpowiada nazwie pliku
		{
			if (szok.modules[name]) return this;
			this.items++;
			try	
			{
				if (szok.moduleLoader.notifications)
					$.jGrowl(name,{ header: 'Ładowanie modułu' , background: colors.yellow });
				$.ajax({
					type : 'GET',
					url : szok.moduleSetup.dir+name+szok.moduleSetup.ext,
					dataType : 'json',
					cache : true,
					success : function (data) {
						if (data.built !== null || data.build !== null || data.destroy !== null || data.controller !== null)
						{
							szok.modules[name] = data;
							szok.moduleLoader.items--;
							if (szok.moduleLoader.notifications)
								$.jGrowl(name,{ header: 'Ładowanie modułu powiodło się' , background: colors.green });
						}
						else
						{
							$.jGrowl(name+': structureerror',{ header: 'Błąd ładowania modułu' , background: colors.red });
						}
					},
					error : function (rq, txt, err) {
						$.jGrowl(name+': '+txt,{ header: 'Błąd ładowania modułu', background : colors.red });
					}
				});
				
			}
			catch (e)
			{
				$.jGrowl(name,{ header: 'Błąd ładowania modułu', background : colors.red });
			}
			return this;
		},
		loadAndBuild : function (name) // load(nazwamodulu) nazwamodulu odpowiada nazwie pliku
		{
			if (szok.modules[name]) return this;
			this.items++;
			try	
			{
				if (szok.moduleLoader.notifications)
					$.jGrowl(name,{ header: 'Ładowanie modułu' , background: colors.yellow });
				$.ajax({
					type : 'GET',
					url : szok.moduleSetup.dir+name+szok.moduleSetup.ext,
					dataType : 'json',
					cache : true,
					success : function (data) {
						if (data.built !== null || data.build !== null || data.destroy !== null || data.controller !== null)
						{
							szok.modules[name] = data;
							szok.modules[name].build();
							szok.moduleLoader.items--;
							if (szok.moduleLoader.notifications)
								$.jGrowl(name,{ header: 'Ładowanie modułu powiodło się' , background: colors.green });
						}
						else
						{
							$.jGrowl(name+': structureerror',{ header: 'Błąd ładowania modułu' , background: colors.red });
						}
					},
					error : function (rq, txt, err) {
						$.jGrowl(name+': '+txt,{ header: 'Błąd ładowania modułu', background : colors.red });
					}
				});
				
			}
			catch (e)
			{
				$.jGrowl(name,{ header: 'Błąd ładowania modułu', background : colors.red });
			}
			return this;
		},
		functionStack : [], // stos z funkcjami do wykonania po zaladowaniu modulow
		addFunction : function (fn)
		{
			if (!$.isFunction(fn)) fn = function () {};
			szok.moduleLoader.functionStack.push(fn);
			return this;
		},
		executeStack : function () 
		{
			if (this.items <= 0)
			{
				for (i in this.functionStack) { this.functionStack[i](); }
				this.functionStack = [];
			}
			else setTimeout('szok.moduleLoader.executeStack()',10);
		}
	},
	message : function (t) {
		var hide = function() {
			$('#message,#messageBack').fadeOut(200,function() { $(this).remove(); });
			$(window).unbind('resize',position).unbind('scroll',position);
		}
		
		var position = function () {
			var h = $(window).height();
			var w = $(window).width();
			var st = $(window).scrollTop();
			var sl = $(window).scrollLeft();
			$('#messageBack').css({width:w,height:h,top:st,left:sl,opacity:0.6});
			
			var vis = ($('#message').css('display') == 'block');
			$('#message').show();
			var mw = $('#message').outerWidth();
			var mh = $('#message').outerHeight();
			$('#message').css({top:st+(h-mh)/2, left:sl+(w-mw)/2});
			if (!vis) $('#message').hide();
		}
		
		$('<div id="messageBack" /><div id="message">'+t+'</div>')
			.appendTo('body')
			;
		
		position();
		
		$('#messageBack,#message').fadeIn(200).click(hide);
		$(window).resize(position).scroll(position);	
	}
};
