function callSvFunction(clicker, functionName){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
	var args = [];
	for(var i=2;i<arguments.length;i++){
		args.push(arguments[i]);
	}
	args.push(function (response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	});
	sv[functionName].apply(this, args);
}
function callReloadFunction(obj, clicker, functionName){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
	var args = [];
	for(var i=3;i<arguments.length;i++){
		args.push(arguments[i]);
	}
	args.push(function (response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	});
	obj[functionName].apply(this, args);
}
function removeWidget(svId, t){
	var oldPanel = getPanel(t);
	$('div.Spinner', oldPanel).show();
	sv.dropWidget(svId, function(response){
		$(oldPanel).remove();
		//$('#LinkWidgets').append(response.result);
		equaliseHeights();
		var adder = $('#WidgetAdderControl');
		if (adder.length > 0){
			var panel = getPanel(adder[0]);
			reloadPanel(panel);
		}
	});
}
function addWidget(wtId, clicker){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
	sv.addWidget(wtId, function(response){
		var newPanel = $($('.WidgetWrapper')[0]).append(response.result);
		justReplaced(newPanel);
		beginSorter();
		reloadPanel(panel);
	})
}
function reloadPanel(panel){
	var vwId = panel.getAttribute('rel');
	$('div.Spinner', panel).show();
	sv.reloadWidget(vwId, 0, function(response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	})
}
function getPanel(clicker){
	var panel;
	for (;clicker && !panel && clicker.tagName != 'body';clicker = clicker.parentNode)
		if (clicker.className && clicker.className.indexOf('WidgetPanel') >= 0)
			panel = clicker;
	return panel;
}
function equaliseHeights(){
	var max = 0;
	$('.WidgetWrapper').each(function(){
		this.style.minHeight = '';
		max = Math.max(max, this.clientHeight);
	});
	$('.WidgetWrapper').each(function(){
		this.style.minHeight = max + 'px';
	});
}
function addMessage(vwId, clicker){
	var panel = getPanel(clicker);
	var message = $('textarea', panel).val();
	$('div.Spinner', panel).show();
	sv.addMessage(vwId, message, function(response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
		//$('div.WidgetWrapper').SortableAddItem(panel);
	});
}
function deleteMessage(msgId, vwId, clicker){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
	sv.deleteMessage(msgId, vwId, function(response){
		$(panel).replaceWith(response.result);
		beginSorter();
	});
}
function addRating(vwId, clicker){
	var panel = getPanel(clicker);
	var message = $('textarea', panel).val();
	if (message == 'Review (optional)')
		message = '';
	var rating = $("input:hidden", panel)[1].value;
	if (rating =='')
		rating = 0;
	$('div.Spinner', panel).show();
	sv.addRating(vwId, message, rating, function(response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	});
}
function changeStatus(vwId, clicker){
	var panel = getPanel(clicker);
	var message = $('textarea', panel).val();
	$('div.Spinner', panel).show();
	sv.changeStatus(vwId, message, function(response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	});
}
function setWidgetPage(vwId, pageNum, clicker){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
	sv.reloadWidget(vwId, pageNum, function(response){
		panel = $(panel).replaceWith(response.result)[0];
		justReplaced(panel);
		beginSorter();
	})
}
var sorterbegun = false;
function beginSorter() {
	if (!sorterbegun || true){
		sorterbegun = true;
		$('div.WidgetWrapper').Sortable(
			{
				accept: 'AdminWidgetPanel',
				helperclass: 'sortHelper',
				activeclass : 	'sortableactive',
				hoverclass : 	'sortablehover',
				handle: 'div.Handle',
				tolerance: 'pointer',
				onChange : function(ser)
				{
				},
				onStart : function()
				{
					$.iAutoscroller.start(this, document.getElementsByTagName('body'));
				},
				onStop : function()
				{
					var ret = [];
					var wrappers = $('.WidgetWrapper');
					for (var i=0;i<wrappers.length;i++){
						var reti = [];
						var elems = $('.WidgetPanel',wrappers[i]);
						elems.css({'top':0,'left':0});
						for (var j=0; j<elems.length; j++){
							reti.push(parseInt(elems[j].getAttribute('rel')));
						}
						ret.push(reti);
					}
					sv.updateWidgetOrder(ret, function (){});
					$.iAutoscroller.stop();
				}
			}
		);
	}
	equaliseHeights();
}
function setProfileImage(me, image){
	sv.setProfileImage(me, image, function(response){
		$.prompt('Profile Image Set');
	});
}
function changeSubjectLinkingPrivacy(privacyLevel, clicker){
	var panel = getPanel(clicker);
	$('div.Spinner', panel).show();
}
var included_files = new Array();
function includeOnce(scripts, ondone){
	if (typeof scripts == 'string')
		scripts = [scripts];
	scripts = $.grep(scripts, function(n){
		return $.inArray(n, included_files);
	});
	included_files = $.merge(included_files, scripts);
	var labber = $LAB;
	for (var i=0;i<scripts.length;i++){
		labber = labber.script(scripts[i]).block();
	}
	labber.block(function(){ondone()});
	/*var includeJS = function(scripts){
		if (scripts.length == 0){
			debugger;
			return ondone();
		}
		var currentScript = scripts.pop();
		$.include(currentScript,function(){
			includeJS(scripts);
		});
	}
	includeJS(scripts.reverse(), ondone);*/
}
function justReplaced(panel){
	panel = $(panel);
	//if ($(panel).parent().hasClass('WidgetWrapper'));
	//	$(panel).parent().SortableAddItem(panel);
	var ondone = null;
	var cr = $('input.onclientreload', panel).val() || '';
	var cs = $('input.clientscripts', panel).val() || '';
	if (cr != ''){
		ondone = function(){
		eval(cr)
		};
	}
	if (cs != ''){
		var scripts = eval(cs);
		includeOnce(scripts, ondone);
	}else if (ondone)
		ondone();
}