var Events = {

	registry : [],

	register: function(method)
	{
		Events.registry[Events.registry.length] = method;
	},

	init: function()
	{
		setTimeout(function(){
			Events.bind($('body'));
		}, 1);
	},

	bind: function(elements)
	{
		$.each(Events.registry, function() {
			this(elements);
		});
		return elements;
	}

};
$(Events.init);


var Utils = {

	getUrl: function(url)
	{
		if (!url) {
			var url = window.location.href;
		}
		var hash = url.indexOf('#');
		if (hash != -1) {
			return url.substring(0, hash);
		} else {
			return url;
		}
	},

	reflowHighslide: function()
	{
		if (top.hs) {
			var expander = top.hs.getExpander();
			if (expander) {
				expander.reflow();
			}
		}
	},
	
	parseClass: function(obj, sClass)
	{
		var ret;
		$.each(obj.attr('className').split(' '), function(key, val) {
			if (val.indexOf(sClass) === 0) {
				ret = val.replace(sClass, '');
			}
		});
		return ret;
	}

};

var ExternalLink = {

	bind: function(elements)
	{
		var expression =
			'a[href^="http"]:not(.confirm):not(.hs):not(.lang),' +
			'a[href^="ftp"]:not(.confirm):not(.hs):not(.lang),' +
			'a[rel*="external"]:not(.confirm):not(.hs):not(.lang)'
		;
		$(expression, elements).click(ExternalLink.onClick);
	},

	onClick: function(event)
	{
		open($(this).attr('href'));
		return false;
	}

};
Events.register(ExternalLink.bind);

var Animation = {

	bind: function(elements)
	{
		$('.animation', elements).each(Animation.loop);
	},

	loop: function()
	{
		var container = $(this);
		var link = container.find('a:first');
		var swf = container.find('param[name="movie"]:first').val();

		var id = container.attr('id');
		if (!id) {
			id = 'animation' + Utils.uniqueInt();
			container.attr('id', id);
		}

		var flashvars = {};
			if (link.length) {
				flashvars.clickTAG = link.attr('href');
				flashvars.target = link.hasClass('external') ? '_blank' : '';
			}
		var params = {};
			params.allowfullscreen = 'true';
			params.wmode = 'transparent';
			params.width = parseInt(container.css('width'));
			params.height = parseInt(container.css('height'));
		var attributes = {};
		swfobject.embedSWF(swf, id, params.width, params.height, '9.0.0', false, flashvars, params, attributes);
	}

};
Events.register(Animation.bind);

var Video = {

	bind: function(elements)
	{
		$('.video', elements).each(Video.loop);
	},

	loop: function()
	{
		var container	= $(this);
		var flv			= container.find('a:first').attr('href');
		var img			= container.find('a:first img').attr('src');
		var autoplay	= container.find('a:first input[name="autoplay"]').val() ? true : false;

		var flashvars = {};
			flashvars.config = "{ " +
				"'playerId': '" + container.attr('id') + "', " +
				"'playlist': [" +
					(img ? "{ 'url': '" + img + "', 'scaling': 'fit' }, " : "") +
					"{ 'url': '" + flv + "', 'autoPlay': " + autoplay + ", 'scaling': 'orig' }" +
				"], " +
				"'play': { 'label': null, 'replayLabel': null }" +
			" }";
		var params = {};
			params.allowfullscreen = true;
			params.wmode = 'transparent';
			params.bgcolor = '#000000';
		var attributes = {};

		swfobject.embedSWF(
			'/media/js/flowplayer/flowplayer.swf',
			container.attr('id'),
			parseInt(container.css('width')),
			parseInt(container.css('height')),
			'9.0.0',
			null,
			flashvars,
			params,
			attributes
		);
	}

};
Events.register(Video.bind);

var GoogleMap = {

	bind: function(elements)
	{
		$('.google_map', elements).each(GoogleMap.loop);
	},

	loop: function()
	{
		var container = $(this);
		var img = container.find('a:first img');

		if (typeof GBrowserIsCompatible == 'function' && GBrowserIsCompatible()) {
			var x = container.find('input[name="x"]').val();
			var y = container.find('input[name="y"]').val();
			var zoom = parseInt(container.find('input[name="zoom"]').val());

			var width = img.css('width');
			container
				.css('width', width)
				.css('height', img.css('height'))
				.empty()
			;
			width = parseInt(width);

			var point = new GLatLng(x, y);
			map = new GMap2(container.get(0));
			map.setCenter(point, zoom);
			if (width > 400) {
				map.addControl(new GLargeMapControl());
			} else {
				map.addControl(new GSmallZoomControl());
			}
			if (width >= 250) {
				map.addControl(new GMapTypeControl());
			}
			map_xy_marker = new GMarker(point);
			map.addOverlay(map_xy_marker);
		}
	}

};
Events.register(GoogleMap.bind);

var Tabs = {

	bind: function()
	{
		$('.tabbed .tabs a').bind('click', Tabs.onClick);
	},

	onClick: function(event)
	{
		event.preventDefault();

		var link = $(this);
		var result = link.attr('id').match(/^tab_link(.+)$/);
		if (result && result[1]) {
			var parent = link.closest('.tabbed');
			var current = parent.find('div.active');
			var next = $('#tab' + parseInt(result[1]));
			current.show().removeClass('active');
			next.hide().addClass('active');
			current.hide();
			next.show();
			parent.find('.tabs li,.tabs li a').removeClass('active');
			link.addClass('active').closest('li').addClass('active');
		}
	}

};
Events.register(Tabs.bind);

var IEpngFix = {

	bind: function(elements)
	{
		$.ifixpng('/media/dsg/spacer.gif');
		$('img[src$=".png"]:visible', elements).ifixpng();
	}

};
Events.register(IEpngFix.bind);

var FCKBcomplete = {

	bind: function(elements)
	{
        $('select.fcbkcomplete', elements).each(function(){
        	var input = $(this);
        	var post_data = 'ajax_plugin=' + ajax_plugin[input.attr('id')] + '&ajax_action=' + ajax_action[input.attr('id')];
        	if (typeof(ajax_params)!="undefined" && typeof(ajax_params[input.attr('id')])!="undefined") {
        		post_data = post_data + '&' + ajax_params[input.attr('id')];
        	}
        	$(this).fcbkcomplete({
	            complete_text: complete_text[input.attr('id')],
	            json_url: Utils.getUrl(input.parents('form.form').attr('action')),
	            post_data: post_data,
		        cache: false,
		        filter_hide: true,
		        firstselected: true,
		        filter_selected: true,
		        maxshownitems: 100,
		        maxitems: 1,
		        newel: false
        	});
        });
    }
};
Events.register(FCKBcomplete.bind);

var Notice = {

	bind: function(elements)
	{
		$('.notice.hide', elements).animate({'opacity': 100}, 4000, function(){
			$(this).slideUp(500);
		});
	}
};
Events.register(Notice.bind);

var Facebook = {

	run: function()
	{
		if (!Facebook.isFB()) {
			return;
		}
		Facebook.init();
		Facebook.fbml();
		Facebook.invite();
	},

	isFB: function()
	{		
		return !(typeof FB == 'undefined');
	},

	init: function()
	{
		var fbApiId = $('input[name="fb_api_id"]:first').val();
		FB.init({
			appId  : fbApiId,
			status : true, // check login status
			cookie : true, // enable cookies to allow the server to access the session
			xfbml  : true,  // parse XFBML
            oauth  : true		
		});
	},

	fbml: function()
	{
		$('.fbml').each(function() {
			var element = $(this);
			var tag = element.find('input[name="plugin"]').val();

			var settings = {};
			element.find('input:not([name="plugin"])').each(function() {
				var input = $(this);
				settings[input.attr('name')] = input.val();
			});

			var xfbml = '<fb:' + tag;
			jQuery.each(settings, function(key, val) {
				xfbml += ' ' + key + '="' + val + '"';
			});
			xfbml += '></fb:' + tag + '>';

			element.show().html(xfbml);
		});
	},

	invite: function()
	{
		$('#fbInvite').click(function(event) {
			event.preventDefault();
			try {
				FB.ui({
					method: 'apprequests',
					filters: ['app_non_users'],
					message: fbInviteMessage
				});
			} catch(e) {
				console.log(e);
			}
		});
	}	

};
window.fbAsyncInit = function() {
	Facebook.run();
};
