function pr() {
	if (!$.browser.mozilla) {
		return;
	}
	if (typeof window.console !== 'undefined') { //  && typeof window.console.log === 'function'
		window.loadFirebugConsole();
		console.log(pr.arguments);
	}
}

(function($) {
	
	$(function() {
		// Generate a Page-Object to bind events on
		window.Page = $('body');
		
		//Take care about the non-js fallback-version of the site 
		$('body').addClass('js').removeClass('no-js');
		 
		// Make external links open in a new window
		$('a[rel=external]').live('click', function() {
			window.open(this.href);
			return false;
		});
	});

	// Produces correct URLs relative to Router::url('/)
	$.url = function(url) {
		return $('meta[name=identifier-url]').attr('content')+url.substr(1);
	}	
	
	$.fn.field = function(field, val, accessor, map) {
		var r = [], one = (this.length == 1), get = true, fields = field, customAccessor = !!accessor, customMap = map;
		var multi = (field.constructor == Array)
			? 'get'
			: (typeof fields == 'object')
				? 'set'
				: false;
		if (multi == 'get') {
			fields = {};
			$.each(field, function() {
				fields[this] = undefined;
			});
		} else if (multi == false) {
			fields = {}
			fields[field] = val;
		}
		this.each(function(i) {
			map = customMap || $.data(this, 'fields');
			var $this = $(this), self = this;
			for (var f in fields) {
				var v = fields[f];
				accessor = accessor || {
					get: function(f) {return map[f].get.call(this);},
					set: function(f, v) {map[f].set.call(this, v)}
				};
				if (get = get && (typeof v == 'undefined')) {
					if (multi == 'get') {
						r[i] = r[i] || {};
						r[i][f] = accessor.get.call($this, f);
					} else {
						r.push(accessor.get.call($this, f));
					}
				} else {
					accessor.set.call($this, f, v);
					if (!customAccessor && 'Page' in window) {
						Page.trigger('changeField', [$this, f, v]);
					}
				}
			}
		});
		return (!get)
			? this
			: (one)
				? r[0]
				: r;
	};

	$.fn.semantic = function(options, key, val) {
		if (typeof options == 'string') {
			val = key;
			key = options;
			options = undefined;
		}

		arguments.callee.helpers = arguments.callee.helpers || {
			get: function(key, options) {
				var m = (this.attr(options.attr) || "").match(options.regex);
				return (m)
					? m[1]
					: false;
			},
			set: function(key, val, options) {
				var attrVal = this.attr(options.attr) || "", newAttrVal;
				if ((newAttrVal = attrVal.replace(options.regex, key+'-'+val)) == attrVal && !options.regex.test(attrVal)) {
					newAttrVal = (attrVal)
						? attrVal+' '+key+'-'+val
						: key+'-'+val;
				}
				this.attr(options.attr, newAttrVal);
			}
		};
		options = $.extend({
			attr: 'class',
			get: arguments.callee.helpers.get,
			set: arguments.callee.helpers.set,
			regex: new RegExp(key+'-([^\\s]+)')
		}, options || {});

		return this.field(key, val, {
			get: function(k) {return options.get.call(this, k, options);},
			set: function(k, v) {options.set.call(this, k, v, options);}
		}, {});
	};

	$.httpSerialize = function(items, parentName) {
		var serializedItems = [], serialize = arguments.callee, encodeItem =  function(key, value) {
			if (value === null || typeof value == 'undefined') return value;
			if (value.constructor == Array) {return serialize(value, key);}
			return (value.constructor == Object)
				? serialize(value, key)
				: (value === true || value === false)
					? key+"="+new Number(value)
					: key+"="+encodeURIComponent(value);
		};

		if (items.constructor == Array)  {
			parentName = parentName || 'item';
			for (var i = 0; i < items.length; i++) {
				var key = parentName+'['+i+']', value = items[i];
				serializedItems.push(encodeItem(key, value));
			}
		} else {
			parentName = parentName || '';
			for (var key in items) {
				var value = items[key];
				if (parentName) {
					serializedItems.push(encodeItem(parentName+'['+encodeURIComponent(key)+']', value));
				} else {
					serializedItems.push(encodeItem(encodeURIComponent(key), value));
				}
			}
		}
		return serializedItems.join("&");
	};
})(jQuery);
(function($) {
	$(function() {
		if (!$('div.twitter-chat').length) {
			return;
		}
		
		// Load twitter-chat
		$('div.twitter-chat').each(function() {
			var $this = $(this);
			
			var limit = parseInt($this.semantic('limit') || 10);
			$this.data('limit', limit);
			var exact = parseInt($this.semantic('exact') || 0);
			var nocontrols = parseInt($this.semantic('nocontrols') || 0);
			
			$.get($.url('/tweets/index/'+limit+'/'+nocontrols), function(data) {
				var $data = $(data);
				if (exact) {
					$this.data('exact', true);
					$data.find('.more').remove();
				}
				$this
					.html($data)
					.twitterchat();
				$('#chat-teaser').find('.tease').remove();
			});
			
		});
		
		$('.twitter-chat .login a').live('click', function(){
			login = window.open($.url('/tweets/oAuth'), "TwitterLogin", "width=800,height=364,resizable=no,scrollbars=yes");
			login.focus();
			return false;
		});
		
		Page.bind('twitterchat-loginerror', function(e, error, form) {
			var $err = $(form).closest('.login').find('.error');
			$err
				// .text('Fehler beim Login, bitte überprüfe die Eingabe.')
				.stop(true)
				.fadeIn('slow')
				.animate({ opacity: 1 }, 6000)
				.fadeOut('slow');
		});

		Page.bind('twitterchat-messageerror', function(e, error, form) {
			var $err = $(form).closest('.message').find('.error');
			$err
				.text('Fehler beim Speichern der Nachricht: "'+error+'"')
				.stop(true)
				.fadeIn('slow')
				.animate({ opacity: 1 }, 6000)
				.fadeOut('slow');
		});
		$('div.twitter-chat .loading').show().hide();
	}); // end onReady
	
	$.activateFollow = function(e, error, form) {
		$('a.twitter-followlink').live('click', function() {
			var $this = $(this);
			var user = ($this.attr('href')).split('/');
			var url = $.url('/tweets/follow/'+user[3]+'.json');
			$.getJSON(url, function(data) {
				var follow = data.follow;
				if (follow.error) {
					alert(follow.error);
					return;
				}
				$this.addClass('followed');
			});
			return false;
		});
	};
	
	$.toggleLoading = function(chat){
		if ($(chat).find('.submit').hasClass('hidden')) {
			$(chat).find('.submit').removeClass('hidden').show();
			$(chat).find('.control .loading').hide();
			return;
		}
		$(chat).find('.submit').addClass('hidden').hide();
		$(chat).find('.control .loading').show();
	};
	
	$.showLogin = function() {
		$('div.twitter-chat')
			.find('.submit').removeClass('hidden').show().end()
			.find('.loading').hide().end()
			.find('.login')
			.find(':text,:password').val('').end()
			.find('.error').hide().end()
			.fadeOut('slow').end()
			.find('.message')
			.fadeIn('slow');
		$.activateFollow();	
	};
	
	$.fn.atLink = function(text) {
		return $(this).each(function() {
			var $area = $(this)
				.closest('.twitter-chat')
				.find('textarea');
			var maxlen = parseInt($area.closest('.message').find('.remaining span').semantic('maxlen'));
			var cur = $area.val();
			// if (cur[0] == '@') {
			// 	return false;
			// }
			if (cur.length && cur[cur.length-1] != ' ') {
				cur = cur+' ';
			}
			var txt = cur+'@'+text+' ';
			if (txt.length > maxlen) {
				return false;
			}
			$area.val(txt).focus();
		})
	}
	
	$.fn.twitterchat = function() {
		return $(this).each(function() {
			var $this = $(this);
			
			$this.find('.login form').bind('submit', function() {
				var $this = $(this);
				if ($this.closest('.twitter-chat').find('.submit').hasClass('hidden')) {
					return false;
				}
				$.toggleLoading($this.closest('.twitter-chat'));
				$.ajax({
					type: 'POST',
					url: $this.attr('action')+'.json',
					data: $this.serialize(),
					dataType: 'json',
					success: function (data, status) {
						$.toggleLoading();
						if (data.error) {
							Page.trigger('twitterchat-loginerror', [data.error, $this]);
							return;
						}
						$('div.twitter-chat')
							.find('.submit').removeClass('hidden').show().end()
							.find('.loading').hide().end()
							.find('.login')
							.find(':text,:password').val('').end()
							.find('.error').hide().end()
							.fadeOut('slow').end()
							.find('.message')
							.fadeIn('slow');
						Page.trigger('activateFollow');
					},
					error: function (XMLHttpRequest, status, error) {
						$.toggleLoading();
						Page.trigger('twitterchat-loginerror', [status, $this]);
					}
				});
				return false;
			});

			$this.find('.logout a').live('click', function() {
				var $this = $(this);
				$this.closest('.twitter-chat').find('logout').hide();
				$this.closest('.twitter-chat').find('.loading').show();
				$.ajax({
					url: $this.attr('href')+'.json',
					dataType: 'json',
					success: function (data, status) {
						$this.closest('.twitter-chat').find('logout').show();
						$this.closest('.twitter-chat').find('.loading').hide();
						if (data.error) {
							alert('Error logging out.');
							return;
						}
						$('div.twitter-chat')
							.find('.message')
							.find('textarea').val('').end()
							.fadeOut('slow').end()
							.find('.login')
							.fadeIn('slow');
						$('div.twitter-chat .loading').hide();
					},
					error: function (XMLHttpRequest, status, error) {
						$this.closest('.twitter-chat').find('logout').show();
						$this.closest('.twitter-chat').find('.loading').hide();
						alert('Error logging out.');
					}
				});
				return false;
			});

			$this.find('.message form').bind('submit', function() {
				var $this = $(this);
				$.toggleLoading();
				$.ajax({
					type: 'POST',
					url: $this.attr('action')+'.json',
					data: $this.serialize(),
					dataType: 'json',
					success: function (data, status) {
						$.toggleLoading();
						if (data.error || !data.tweet) {
							Page.trigger('twitterchat-messageerror', [data.error, $this]);
							return;
						}
						$this.find('textarea').val('');

						var $container = $this
							.closest('.twitter-chat')
							.find('.tweets ul');
						var $data = $(data.tweet);
						
						// Check whether chat is currently refreshing
						if ($this.closest('.twitter-chat').data('refreshing')) {
							return;
						}
						
						// Check whether entry has already been fetched by periodic refresh in between
						var twitter_id = $data.filter('li:first').semantic('twitter_id');
						
						if ($container.find('.twitter_id-'+twitter_id).length) {
							return;
						}
						$data.hide().prependTo($container).fadeIn('slow');
						if ($this.closest('.twitter-chat').data('exact')) {
							$container.find('li:last').remove();
							// .fadeOut('fast', function() {
							// 								$(this).remove();
							// 							});
						}
					},
					error: function (XMLHttpRequest, status, error) {
						$.toggleLoading();
						Page.trigger('twitterchat-messageerror', [status, $this]);
					}
				});
				return false;
			});

			$this.find('.text a.username,.text a:contains(@)[href*=twitter.com]').live('click', function() {
				if (!$('.twitter-chat .message:not(:hidden)').length) {
					window.open(this.href);
					return false;
				}
				$(this).atLink($(this).text().replace(/^@/, ''));
				return false;
			});
			$this.find('.thumb').live('click', function() {
				if (!$('.twitter-chat .message:not(:hidden)').length) {
					window.open(this.href);
					return false;
				}
				$(this).atLink($(this).text());
				return false;
			});
			
			$this.find('.message textarea').live('keyup', function(e) {
				var $this = $(this);
				var $counter = $this.closest('.message').find('.remaining span');
				var maxlen = $this.data('maxlen');
				if (!maxlen) {
					maxlen = parseInt($this.closest('.twitter-chat').semantic('maxlen'));
					if (!maxlen) {
						maxlen = parseInt($counter.semantic('maxlen'));
					}
					$this.data('maxlen', maxlen);
				}
				var critical = $this.data('critical');
				if (!critical) {
					critical = parseInt($this.closest('.twitter-chat').semantic('critlen') || 90)/100;
					$this.data('critical', critical);
				}
				var len = $this.val().length;
				var percent = len/maxlen;
				if (percent > 1) {
					$counter.addClass('exceeded');
				} else if (percent > critical) {
					$counter.addClass('critical');
				} else {
					$counter.removeClass('critical').removeClass('exceeded');
				}
				// This would hard prevent the user to insert more chars than allowed
				// if(len >= maxlen) {
				// 					$this.val($this.val().substr(0, maxlen));
				// 				}
				$counter.text(maxlen-len);
			});
			
			$this.find('.tweets .more a').live('click', function() {
				var $this = $(this);
				var limit = $this.closest('.twitter-chat').data('limit');
				var till_id = parseInt($this.closest('.tweets').find('ul li:last').semantic('twitter_id'));
				var url = $this.attr('href')+'/'+till_id+'/'+limit;
				$this.closest('.twitter-chat').find('.tweets .more a').hide();
				$this.closest('.twitter-chat').find('.more .loading').show();
				$.getJSON(url+'.json', function(data) {
					$this.closest('.twitter-chat').find('.tweets .more a').show();
					$this.closest('.twitter-chat').find('.more .loading').hide();
					if ($(data.more).is('.disabled')) {
						$this.closest('.more').addClass('disabled');
					}
					$this
						.closest('.tweets')
						.find('ul')
						.append($(data.tweets))
						.end()
						.end()
						.replaceWith($(data.more));
				});
				return false;
			});
			
			// Auto-Refresh
			var refresh = parseInt($this.semantic('refresh') || 30);
			refresh = refresh*1000;
			var timer = setInterval(function(){
				var since_id = parseInt($this.find('.tweets ul li:first').semantic('twitter_id'));
				if (!since_id) {
					return;
				}
				if ($this.data('refreshing')) {
					return false;
				}
				$this.data('refreshing', true);
				$.getJSON($.url('/tweets/since/'+since_id+'.json'), function(data) {
					if (!data.tweets) {
						$this.removeData('refreshing');
						return;
					}
					var $data = $(data.tweets).filter('li').hide().end();
					$this
						.find('.tweets ul')
						.prepend($data)
						.end()
						.find('.tweets ul li:hidden')
						.fadeIn();
					var newCount = $data.filter('li').length;
					if ($this.closest('.twitter-chat').data('exact')) {
						$this.find('li:gt('+($this.closest('.twitter-chat').data('limit')-1)+')').remove();
					}
					$this.removeData('refreshing');
				});
			}, refresh);
		})
	};
	window.twitterLogin = function() {
		$.showLogin();
	}
	
})(jQuery);
