
jQuery.fn.audioPlayer = function(params)
{
	function clone(obj) {
		return jQuery.extend({}, obj);
	}

	var defaultCustomFields = {
		icon_id : 108,
		bg_color: '656565',
		text_color: 'FFFFFF'
	}

	var defaults = {
		id: 'activePlayer',
		title: '',
		handler: {media: clone(defaultCustomFields)},
		customable: false
	};

	var settings = jQuery.extend(true /* deep merge */, defaults, params);

	if (!settings.customable) {
		settings.handler.media = jQuery.extend(settings.handler.media, defaultCustomFields);
	}

//	if (params.handler.media == undefined)
//		params.handler.media = params.media;

	this.each(function() {

		$this = jQuery(this);

		var so = new SWFObject("http://muzicons.com/musicon_v_srv_new.swf?v2", settings.id, "150", "50", "8");
		so.addParam("quality", "high");
		so.addParam("wmode", "transparent");
		so.addParam("menu", "false");
		so.addParam("align", "middle");

		so.addVariable('nomuz', 'Temporarily unavailable');
		so.addVariable('site', 'http://muzicons.com/');
		so.addVariable('partner_key', 'NP736vA1RL48jGDB');
		so.addVariable('no_buy_link', '1');

		if (settings.title == undefined || settings.title == '')
		{
			so.addVariable('type_of_clip', 'whith_bar');
			so.addVariable('text_message', '');
		}
		else
		{
			so.addVariable('type_of_clip', 'simple_text');
			so.addVariable('text_message', settings.title);
		}

		so.addVariable('music_file', settings.url);
		so.addVariable('icon_pic',  settings.handler.media.icon_id + '.png');
		so.addVariable('bg_color', settings.handler.media.bg_color);
		so.addVariable('text_color', settings.handler.media.text_color);

		so.write($this.attr('id'));

		$this.data('settings', settings)

		//if (!(params.title == '' && params.handler.media == undefined))
			new AudioPlayerHandler($this.attr('id'), settings.handler);
	})

	return this;
}

AudioPlayerHandler = function(playerId, params)
{
	var instance = this;

	var defaults = {
		items: [
			{label: $translation.get('media menu 0'), action: this.addToMyPlaylist},
			{label: $translation.get('media menu 1'), action: this.setMyMood},
			{label: $translation.get('media menu 2'), action: this.goSearch}
		],
		enabled_items: [0,1,2]
	};

	params = jQuery.extend(defaults, params);
	params.media.customized = 0;

	if (q.userId == 0) {
		// remove by value
		var pos = jQuery.inArray(0, params.enabled_items);
		pos > -1 && params.enabled_items.splice(pos, 1);

		var pos = jQuery.inArray(1, params.enabled_items);
		pos > -1 && params.enabled_items.splice(pos, 1);
	}

	if (params.enabled_items.length == 0 || !params.media.title)
		return;

	$player = jQuery('#'+playerId);

	var randId = 'apwrap' + Math.floor(Math.random()*9999);

	$wrap = jQuery('<div class="apwrapper" id="'+randId+'"></div>');
	$wrap.css('float', $player.css('float'));
	$player.css('float', '');
	$player.wrap($wrap);

	$handler = jQuery('<div class="aphandler"></div>');

	jQuery.each(params.enabled_items, function() {
		var item = params.items[this];
		$item = jQuery('<div><a href="javascript:" class="aptext">'+item.label+'</a></div>');
		$item.find('a').bind('click', {instance: instance}, item.action);
		$handler.append($item);
	})

	$handler.appendTo($player);

	params.handler = $handler;
	params.player = $player;

	inEvent = function() {
		$h = jQuery('#'+randId).find('.aphandler');
		$h.stop(true, true);
		$h.animate({'border-color': 0}, 500).slideDown(200);
	}

	outEvent = function() {
		$h = jQuery('#'+randId).find('.aphandler');
		$h.stop(true, true);
		$h.animate({'border-color': 0}, 1000).slideUp(200);
	}

	$player.hover(inEvent, outEvent);

	instance.settings = params;
}

AudioPlayerHandler.prototype.handleResponse = function(response, $outElement)
{
	if (response.popup != undefined) {
		var $apwrapper = $outElement.parents('.apwrapper');
		$apwrapper.find(':hidden').show();
		$apwrapper.find('.temp').remove();

		var offset = $apwrapper.offset();

		jQuery('.ypop').remove();

		var popTimer;

		var removePopup = function() {
			$popup.fadeOut(300, function() {
				$popup.remove();
			})
		};

		$apwrapper.find('.aphandler').hide();

		var $popup = jQuery('<div class="ypop"></div>')
			.append('<div>'+response.popup+'</div>')
			.hover(function() {clearInterval (popTimer);}, function(){popTimer = setTimeout(removePopup, 3000);})
			.css(offset)
			.appendTo('body')
			.fadeIn(500);

		popTimer = setTimeout(removePopup, 12000);

//		setTimeout(function() {
//			top = jQuery(window).scrollTop();
//			off = $popup.offset();
//
//			off.top = jQuery(window).height() - $popup.height() + jQuery(window).scrollTop();
//			off.left = jQuery(window).width() - $popup.width();
//
//			$popup.animate(off, 1000);
//
//			jQuery(window).scroll(function() {
//				off = $popup.offset();
//				off.top = jQuery(window).height() - $popup.height() + jQuery(window).scrollTop();
//				$popup.animate(off, 200);
//			});
//
//		}, 3000);
	} else if (response.message != undefined) {
		$outElement.html(response.message);
	}

	if (response.redirect != undefined)
		location.href = response.redirect;
}

AudioPlayerHandler.prototype.addToMyPlaylist = function(e)
{
	var el = this;var instance = e.data.instance;
	var outEl = jQuery(el).parent().html($translation.get('adding'));

	jQuery.post('/do/media/addMediaToPlaylist', instance.settings.media, function(response) {
		instance.handleResponse(response, outEl);
	}, 'json');
}

AudioPlayerHandler.prototype.setMyMood = function(e)
{
	var el = this;var instance = e.data.instance;
	var outEl = jQuery('<div class="temp">'+$translation.get('please wait')+'</div>');
	jQuery(el).parent().hide().after(outEl);

	jQuery.post('/do/media/setUserMood', instance.settings.media, function(response) {
		instance.handleResponse(response, outEl);
	}, 'json');
}

AudioPlayerHandler.prototype.goSearch = function(e)
{
	var el = this;var instance = e.data.instance;

	var id = instance.settings.media.id ? instance.settings.media.id : 0;
	var url = '/do/media/searchSiteMedia/?id='+id + '&q=' + encodeURIComponent(instance.settings.media.title);

	if (window.event != undefined) window.event.returnValue=false; //ie6

	location.href = url;
}


MediaWidget = function(settings) {
	var defaults = {
		title:			'',
		mainContainerId:'#mediabody',
		searchInputId:	'#msearch-input',
		searchSubmitId:	'#msearch-submit',
		mediaListId:	'#medialist',
		pagerContainerId:'#widgetpager',
		anchor:			'',
		playerParams:	{id: 'activePlayer', handler: {}}
	};

	var instance = this;

	instance.settings = jQuery.extend(defaults, settings);
	instance.prevMediaId = -1;

	jQuery(function() {
		setTimeout(function(){
			jQuery(instance.settings.searchInputId).focus();
		}, 200);

		var $pagerContainer = jQuery(instance.settings.pagerContainerId);

		$pagerContainer.find('a').click(function(){
			$pagerContainer.loading();
			instance.goRelative(this.href);
			return false;
		});

		jQuery(instance.settings.searchInputId).keypress(function(e){

			if (e.which == 13) {
				jQuery(instance.settings.searchSubmitId).trigger('click');
				return false;
			}
		});
	})
}

MediaWidget.prototype.goRelative = function(url)
{
	var instance = this;

	setTimeout(function(){
		jQuery.ajaxSetup({cache: true});

		jQuery(instance.settings.mainContainerId).load(url, function() {
			jQuery.ajaxSetup({cache: false});
		});
	}, 400)
}

MediaWidget.prototype.expand = function(containerId, id, mediaList)
{
	var instance = this;

	jQuery('#'+instance.settings.activePlayerId).remove();

	var $container = jQuery('#'+containerId);

	$mediaList = jQuery(this.settings.mediaListId);
	$mediaList.find('.extended .flplaceholder').hide();

	if (!jQuery.browser.msie) // f*cken IE :(
		$mediaList.find('.extended:visible').slideUp(600);
	else
		$mediaList.find('.extended:visible').hide();

	var $extended = $container.find('.extended'+id);

	if (instance.prevMediaId != id || !$extended.is(':visible'))
	{
		instance.prevMediaId = id;

		showPlayer = function() {
			var playerParams = instance.settings.playerParams;
			playerParams.url = mediaList[id].file_url;

			if (playerParams.handler == undefined)
				playerParams.handler = {media: mediaList[id]};
			else
				playerParams.handler.media = mediaList[id];

			$container.find('.flplaceholder'+id)
				.audioPlayer(playerParams)
				.show();
		};

		if (!jQuery.browser.msie)
			$extended.slideDown(300, showPlayer);
		else
		{
			$extended.show();
			showPlayer();
		}
	}

	return false;
}

MediaWidget.prototype.selectMedia = function(btn, containerId, id)
{
	var instance = this;
	var media = instance.settings.media[id];

	$loader = jQuery(btn).loading();

	jQuery.post(instance.settings.selectMediaURL, media, function(result){
		if (result.redirect != undefined) {
			location.href = result.redirect;
		} else if ((typeof result == 'object' && result.success) || typeof result != 'object') {
			instance.goRelative(instance.settings.currentURI + instance.settings.anchor);
		} else {
			jQuery('<div class="zam zam2">'+result.message+'</div>').insertAfter($loader);
			$loader.remove();
		}
	}, 'json');
}

MediaWidget.prototype.removeMedia = function(btn, containerId, id)
{
	var instance = this;
	jQuery(btn).loading();

	jQuery.post(instance.settings.removeMediaURL, {id: id}, function(){
		instance.goRelative(instance.settings.currentURI + instance.settings.anchor);
	});
}

MediaWidget.prototype.search = function(btn)
{
	jQuery(btn).loading();
	this.goRelative(this.settings.currentURI + '?msearch=' + encodeURIComponent(jQuery(this.settings.searchInputId).val()) + this.settings.anchor);
}

MediaWidget.prototype.rgb2hex = function(src)
{
	var rgb = src.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);

	function hex(x) {
		var hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
		return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
	}

	return rgb ? hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) : src.replace('#', '');
}

MediaWidget.prototype.openCustomizer = function(btn, mediaId, mediaList)
{
	var instance = this;
	var $itemBody = jQuery(btn).parents('._media_item:first').find('._item_body');

	var initCustomizer = function() {
		var $customizer = instance.$customizer.appendTo($itemBody).slideDown(300);
		$customizer.corners('10px').find('._media_customizer_events').corners('10px');

		$customizer.find('._media_customizer_events').unbind('click').click(function(e) {
			var $target = jQuery(e.target);

			if ($target.hasClass('_icon') || $target.hasClass('_color')) {
				var $audioPlayer = $itemBody.find('._audioplayer');
				var $flash = $audioPlayer.find('._flash');
				var settings = $flash.data('settings');

				$flash = $flash.clone().empty();
				$audioPlayer.empty().append($flash);

				if ($target.hasClass('_icon')) {
					settings.handler.media.icon_id = mediaList[mediaId].icon_id = $target.attr('icon_id');
				} else {
					settings.handler.media.bg_color = mediaList[mediaId].bg_color = instance.rgb2hex($target.css('background-color'));
				}

				settings.handler.media.customized = 1;
				mediaList[mediaId].customized = 1;

				$flash.audioPlayer(settings);
			}
		})

		$customizer.find('._save_action').unbind('click').click(function() {
			if (instance.settings.hasOwnProperty('updateMediaURL') && mediaList[mediaId].customized) {
				jQuery.post(instance.settings.updateMediaURL, mediaList[mediaId]);
			}

			$customizer.slideUp(300);
		})
	}

	if (instance.$customizer == undefined) {
		jQuery.ajaxSetup({cache: true});

		jQuery.get('/do/media/customizer', function(data) {
			jQuery.ajaxSetup({cache: false});
			
			instance.$customizer = jQuery(data);
			initCustomizer();
		})
	}
	else
		initCustomizer();
}

objectToForm = function(obj, form, field)
{
	jQuery.each(obj, function(key, value){
		var id = '_ar' + key;

		var $input = jQuery('#' + id);

		if ($input.length == 0)
		{
			$el = jQuery('<input type="hidden" id="'+id+'" name="'+field+'['+key+']"/>');
			$el.val(value).appendTo(form);
		}
		else
		{
			$input.attr('value', value);
		}
	});
}




Comment = function() {
	this.attachedMedia = false;
}

Comment.prototype.attachMedia = function() {
	jQuery('#add-audio-link').loading();

	jQuery('#mediaplace').load('/do/media/widget/audio', {}, function(){
		$loader.remove();
		jQuery(this).show();
	})

	return false;
}

Comment.prototype.insertMedia = function (btn, media)
{
	if (btn) jQuery(btn).loading();

	this.attachedMedia = media;

	jQuery('#add-audio-link').hide();

	var mediaTitle = this.attachedMedia.title;

	if (mediaTitle.length > 12) {
		mediaTitle = mediaTitle.substring(0, 9) + '...';
	}

	jQuery('#mediaplace').empty().hide();

	jQuery('#prelisten-place').audioPlayer({
		url: this.attachedMedia.file_url, title: mediaTitle, handler: {enabled_items: []}
	});
	jQuery('#prelisten').show();
	jQuery('#delmedialink').show();
}

Comment.prototype.removeMedia = function()
{
	jQuery('#prelisten').hide();
	jQuery('#delmedialink').hide();
	jQuery('#add-audio-link').show();
	jQuery('#prelisten-place').empty();
	this.attachedMedia = false;
}

Comment.prototype.submit = function(btn, action)
{
	document.forms.replier.action='threadedcomments/' + action;

	if (this.attachedMedia)
		objectToForm(this.attachedMedia, document.forms.replier, 'media');

	return true;
}
