function run(variable) {
	jQuery(function($) {
		variable.run();
	});
}

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

var Events = {

	registry : [],

	register: function(method)
	{
		Events.registry[Events.registry.length] = method;
	},

	init: function()
	{
		Events.bind($('body'));
	},

	bind: function(elements)
	{
		$.each(Events.registry, function() {
			this(elements);
		});
	}

}
$(Events.init);


var Utils = {

	uniqueInts: new Object(),

	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;
		}
	},

	getUrlParam: function(name)
	{
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp(regexS);
		var results = regex.exec(window.location.href);
		return results == null ? '' : results[1];
	},

	uniqueInt: function(n)
	{
		if (!n) {
			var n = 1000;
		}
		do  {
			var i = Math.floor(Math.random() * n + 1);
		} while (Utils.uniqueInts[i]);
		Utils.uniqueInts[i] = true;
		return i;
	},

	scrollTo: function(element)
	{
		$.scrollTo(element, 500, { axis: 'y' });
	}

}


var ConfirmLink = {

	bind: function(elements)
	{
		$('a.confirm', elements).click(ConfirmLink.onClick);
	},

	onClick: function(event)
	{
		var link = $(this);
		if (confirm(link.attr('title'))) {
			if (link.is('[href^="http"],[href^="ftp"],[rel*="external"]')) {
				open(link.attr('href'));
				return false;
			}
		} else {
			return false;
		}
	}

}
Events.register(ConfirmLink.bind);


var ExternalLink = {

	bind: function(elements)
	{
		var expression =
			'a[href^="http"]:not(.confirm),' +
			'a[href^="ftp"]:not(.confirm),' +
			'a[rel*="external"]:not(.confirm)'
		;
		$(expression, elements).click(ExternalLink.onClick);
	},

	onClick: function(event)
	{
		open($(this).attr('href'));
		return false;
	}

}
Events.register(ExternalLink.bind);


var Loader = {

	image: null,

	run: function()
	{
		$('body').prepend('<div id="loading"></div>');
		Loader.image = $('#loading').hide();
	},

	show: function(element)
	{
		if (element.pageX || element.pageY) {
			var x = element.pageX;
			var y = element.pageY;
			x -= parseInt(this.image.width() / 2);
			y -= parseInt(this.image.height() / 2);
		} else {
			var position = element.position();
			var x = position.left;
			var y = position.top;
		}
		this.image.css('left', x).css('top', y).show();
	},

	hide: function()
	{
		this.image.hide();
	}

}
run(Loader);


var DropDownMenu = {

	run: function()
	{
		$('.dropdown ul a').removeAttr('title');
	    $('.dropdown ul li').hover(DropDownMenu.hoverOver, DropDownMenu.hoverOut);
	},

	hoverOver: function()
	{
		$(this).addClass('hover').find('a:first').addClass('hover');
		$('ul:first', this).css('display', 'block');
	},

	hoverOut: function()
	{
		$(this).removeClass('hover').find('a:first').removeClass('hover');
		$('ul:first', this).css('display', 'none');
	}

}
run(DropDownMenu);


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 configuration = {
			src: '/media/js/flowplayer/flowplayer.swf'
		};

		if (img) {
			var playlist = [
			    {url: img, scaling: 'fit'},
			    {url: flv, autoPlay: false}
			];
		} else {
			var playlist = [
			    {url: flv, autoPlay: false}
			];
		}

		var flashvars = {};
			flashvars.config = "{ " +
				"'playerId': '" + container.attr('id') + "', " +
				"'playlist': [" +
					(img ? "{ 'url': '" + img + "', 'scaling': 'fit' }, " : "") +
					"{ 'url': '" + flv + "', 'autoPlay': false }" +
				"], " +
				"'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 = {

	run: function()
	{
		$('.tabbed .tabs a').bind('click', this.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('.active_tab');
			var next = $('#tab' + parseInt(result[1]));
			current.show().removeClass('active_tab');
			next.hide().addClass('active_tab');

			current.hide();
			next.show();

			parent.find('.tabs li,.tabs li a').removeClass('active');
			link.addClass('active').closest('li').addClass('active');
		}
	}

}
run(Tabs);


var MultiCheckboxSelect = {

	bind: function(elements)
	{
		$('input.multi_select[type="checkbox"][value!=""]', elements).click(MultiCheckboxSelect.onClick);
	},

	onClick: function(event)
	{
		var checkbox = $(this);
		var inputs = $('input.'+ checkbox.attr('value')+'[type="checkbox"]', checkbox.closest('.plugin'));
		if (checkbox.attr('checked')) {
			inputs.attr('checked', 'checked');
		} else {
			inputs.removeAttr('checked');
		}
	}

}
Events.register(MultiCheckboxSelect.bind);


var VerticalHeightAlign = {

	items: null,

	bind: function(elements)
	{
		VerticalHeightAlign.items = new Object;
		$('.vha', elements).each(VerticalHeightAlign.each);
		VerticalHeightAlign.setHeights();
	},

	each: function()
	{
		var item = $(this);
		var classNames = item.attr('className').split(' ');
		jQuery.each(classNames, function(i, n) {
			var temp = n.split('_');
			if (temp[0] == 'vhag') {
				if (!VerticalHeightAlign.items[n]) {
					VerticalHeightAlign.items[n] = new Object;
				}
				var nextI = Object.size(VerticalHeightAlign.items[n]);
				VerticalHeightAlign.items[n][nextI] = item;
				return false;
			}
		});
	},

	setHeights: function()
	{
		jQuery.each(VerticalHeightAlign.items, function(key, array) {
			if (Object.size(array) < 2) {
				return;
			}
			var maxHeight = 0;
			jQuery.each(array, function(i, item) {
				var currentHeight = item.height();
				if (maxHeight < currentHeight) {
					maxHeight = currentHeight;
				}
			});
			jQuery.each(array, function(i, item) {
				item.css('height', maxHeight + 'px');
			});
		});
	}

}
Events.register(VerticalHeightAlign.bind);


var IEpngFix = {

	bind: function(elements)
	{
		$.ifixpng('/media/dsg/spacer.gif');

		var expression =
			'img[src$=".png"]:visible,' +
			'#copyright a:visible'
		;
		$(expression, elements).ifixpng();
	}

}
Events.register(IEpngFix.bind);
