/**
 * Eases browser scroll position to include element with el_id.
 * Will call highlight_border on  el_to_highlight_border_id when done
 * 
 * @param el_id
 * @param el_to_highlight_border_id
 */
function scroll_to_with_ease(el_id, el_to_highlight_border_id)
{
	el=$(el_id);
	var scrollOffsets = document.viewport.getScrollOffsets();
	var elementOffsets = Element.cumulativeOffset(el);
	var end_x = scrollOffsets.left;
	var end_y;
	
	if(scrollOffsets.top > elementOffsets.top)
		end_y = elementOffsets.top;
	else if(scrollOffsets.top + document.viewport.getDimensions().height < elementOffsets.top + Element.getHeight(el))
		end_y = elementOffsets.top + Element.getHeight(el) - document.viewport.getDimensions().height;
	
	// Its quite unlikely to happen but incase we need to perform horizontal scroll
	if(scrollOffsets.left + document.viewport.getDimensions().width < elementOffsets.left + Element.getWidth(el))
		end_x = elementOffsets.left + Element.getWidth(el) - document.viewport.getDimensions().width;
	else if(scrollOffsets.left > elementOffsets.left)
		end_x = elementOffsets.left;
	

	if(end_y != undefined)
		// Scrolling vertically, do it smoothely.. If we have an end_x, just jump ther at the end
		new Effect.Tween(null,scrollOffsets.top, end_y, {afterFinish: function(el_to_highlight_border){return function(){
			highlight_border(el_to_highlight_border_id);
		}}(el_to_highlight_border_id)}, function(p){window.scrollTo(end_x,p);}
		);
	else if(end_x != scrollOffsets.left)
		// Only horizontal scrolling, we might as well do it smoothely
		new Effect.Tween(null,scrollOffsets.left, end_x, {afterFinish: function(el_to_highlight_border){return function(){
			highlight_border(el_to_highlight_border_id);
		}}(el_to_highlight_border_id)}, function(p){window.scrollTo(p,scrollOffsets.top);}
		);
	else
		// No scrolling needed
		highlight_border(el_to_highlight_border_id);
	
	var el_X = elementOffsets.left + Element.getWidth(el);
	var el_Y = elementOffsets.top + Element.getHeight(el) - document.viewport.getDimensions().height
}

function highlight_border(el_id)
{
	if(el_id)			// Give border for 500ms
	{
		$(el_id).addClassName('highlight');
		setTimeout("$('"+el_id+"').removeClassName('highlight')", 500);
	}
}


function getDivId(response){
  //were going to use split to get the id here, 
  //because I can't seem to do it easily with a dom object..
  temp=response.split('"');
  divId=temp[1];
  return divId;
}

function strip_div_tag(response, divId){
  //now I'm going to remove the div tags with substring..(yuk!)
  response=trim(response);
  lengthstarttag=divId.length + '<div id="">'.length;
  lengthendtag=6;
  stop=response.length -lengthendtag;
  innerHtml=response.substring(lengthstarttag, stop);
  return innerHtml;
}


function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

/**
 * get DB widget ID from HTML widget content id str
 */
function get_widget_id_from_html_id(widget_id)
{
	return widget_id.replace(/[a-z_]*/ig, '');
}


/**
 * Puffs a message_flash div with text in position relative to location
 * 
 * @param string filter_text
 * @param mixed location
 * @param mixed position (default: before)
 */
function puff_message(text, location, position )
{
	pos = position ? position : 'before';
	id="text_"+(new Date).getTime() +((Math.random() + "").replace('.',''));
	text = '<div style="display:none" id="'+id+'" class="message_flash"><p>'+text+'</p><div class="clear"></div></div>';
	Element.insert($(location), position=='after'?{after:text}:{before:text});
	// Effect.Appear($(id));
	// setTimeout("Effect.Fade($(\""+id+"\"))", 2000);
	$jqcspi('#'+id).fadeIn(1000).delay(2000).fadeOut(1000);
}

// Stores el's which have user bubbles open
var publici_visible_user_profile_balloon = null;

/**
 * Shows a user profile balloon
 * @param Element the span or div what contains the username
 */
function show_user_profile_balloon(el)
{
	if(publici_visible_user_profile_balloon === el || !(balloon_div = el.down('.user_balloon')))
		return;
	
	publici_visible_user_profile_balloon = el;
	
	var new_balloon_innerhtml = el.down('.user_balloon').innerHTML;
	var new_balloon_html = '<div id="new_balloon" class="user_balloon" style="display:none;">' + new_balloon_innerhtml + '</div>';
	
	var orig_position = el.cumulativeOffset(); // absolute offset
	var orig_scroll = el.cumulativeScrollOffset(); // internal html scrolls
	var orig_window_scroll = document.viewport.getScrollOffsets(); // window scroll
	
	if( $('new_balloon') ) {
		$('new_balloon').innerHTML = new_balloon_innerhtml;
	}
	else {
		el.up('.pi_widget_body').insert({
				top : new_balloon_html
		});
	}
	
	var new_balloon_top = orig_position.top + 20 - orig_scroll.top + orig_window_scroll.top - 107 - 46; // link top + link height[20 - bit extra] - htmlscrollOffset + window scroll offset - balloon height [107] - balloon padding [46]
	var new_balloon_left = orig_position.left - orig_scroll.left + orig_window_scroll.left - 100; // link left - htmlscrollOffset + window scroll offset - 100 for luck
	
	$('new_balloon').setStyle({
			position : 'absolute',
			zIndex : 1,
			top : new_balloon_top + 'px',
			left : new_balloon_left + 'px'
	})
	
	$('new_balloon').show();
	$('new_balloon').focus();
	
  	Event.observe($('new_balloon'), 'mouseleave', function()
	{
  		close_user_profile_balloon(el);
	});
  	Event.observe($('new_balloon'), 'blur', function()
	{
  		close_user_profile_balloon(el);
	});
}

/**
 * Closes a user profile balloon
 * @param Element the span or div what contains the username
 */
function close_user_profile_balloon(el)
{
	if(publici_visible_user_profile_balloon !== el || !(balloon_div = $('new_balloon')))
		return;
	
	publici_visible_user_profile_balloon = null;
	Event.stopObserving($('new_balloon'), 'blur');
	Event.stopObserving($('new_balloon'), 'mouseout');
	$('new_balloon').hide();
}

Event.observe(window, 'load', function() {
	pi_initiate_user_balloons();
});

function pi_initiate_user_balloons(selector)
{
	if( typeof(selector) == 'undefined' ) {
		selector = '.user_profile_balloon_username';
	}
	  $$(selector).each(function(el) {
			Event.observe(el, 'focus', function() {
					show_user_profile_balloon(el);
			});
			Event.observe(el, 'mouseover', function() {
					show_user_profile_balloon(el);
			});
	});
}


function travelling_set_referer_uri(server)
{
  new Ajax.JSONRequest(server + '/core/event/set_referer_uri', { callbackParamName: "jsoncallback", parameters:{'referer_uri':window.location.href}});
}

function close_share(embed)
{
  $(embed).removeClassName('activated');
  $(embed).addClassName('disabled');
  $jqcspi('#' + embed).parents('.pi_widget').find('.pi_widget_title .icons.functions a.share').removeClass('share_active')
}

function open_share(embed)
{
  $(embed).removeClassName('disabled');
  $(embed).addClassName('activated');
}

function jq_identify(el) {
	if( $jqcspi(el).attr('id') ) {
		return $jqcspi(el).attr('id');
	}
	else {
		var i = 0;
		
	}
	
	var i = 0;
	do {
		i++;
		var id = 'jq_anon_' + '_' + i;
	} while($jqcspi('#' + id).length > 0);
	$jqcspi(el).attr('id', id);
	return id;
}

function refresh_travelling_widget(cs_domain, widget_id) {
	showLoader('pi_loading_' + widget_id);
	// jsonp type call to /core/justwidget/{$widget_id}/tr/1/
	$jqcspi('head').append('<script type="text/javascript" src="http://'+cs_domain+'/core/justwidget/'+widget_id+'/tr/1/" ></script>');
}

function refresh_travelling_widget_callback(refresh_data) {
	hideLoader('pi_loading_' + refresh_data.widget_id);
	if( refresh_data.widget_id && refresh_data.refreshed_widget_html ) {
		$jqcspi('#pi_widget_content_'+refresh_data.widget_id).html(refresh_data.refreshed_widget_html);
		if(typeof window['on_refresh_'+refresh_data.widget_id] != 'undefined') {
			window['on_refresh_'+refresh_data.widget_id]();
		}
	}
}

function textLimit(field, maxlen) {
  if (field.value.length > maxlen + 1)
    if (field.value.length > maxlen)
      field.value = field.value.substring(0, maxlen);
}

