(function($){$.fn.dashboard=function(options){var dashboard={};dashboard.element=this.empty();dashboard.ready=false;dashboard.columns=Array();dashboard.widgets=Array();dashboard.saveColumns=function(){for(var c in dashboard.columns){var col=dashboard.columns[c];if(typeof col=='object'){if(col.element.children(':visible').not(col.emptyPlaceholder).length>0){col.emptyPlaceholder.hide();}
else{col.emptyPlaceholder.show();}}}
if(!dashboard.ready){return;}
var params={};for(var c in dashboard.columns){if(typeof dashboard.columns[c]=='object')var ids=dashboard.columns[c].element.sortable('toArray');for(var w in ids){if(typeof ids[w]=='string')var id=ids[w].substring('widget-'.length);if(typeof dashboard.widgets[id]=='object')params['columns['+ c+']['+ id+']']=(dashboard.widgets[id].minimized?'1':'0');}}
$.extend(params,opts.ajaxCallbacks.saveColumns.data);$.post(opts.ajaxCallbacks.saveColumns.url,params,function(response,status){invokeCallback(opts.callbacks.saveColumns,dashboard);if(window.console&&console.log){console.log(response);}});};dashboard.enterFullscreen=function(element){for(var c in dashboard.columns){if(typeof dashboard.columns[c]=='object')dashboard.columns[c].element.hide();}
if(!dashboard.fullscreen){var markup='<a id="full-screen-header" class="full-screen-close-icon">'+ opts.fullscreenHeaderInner+'</a>';dashboard.fullscreen={headerElement:$(markup).prependTo(dashboard.element).click(dashboard.exitFullscreen).hide()};}
dashboard.fullscreen.headerElement.slideDown();dashboard.fullscreen.currentElement=element.show();dashboard.fullscreen.displayed=true;invokeCallback(opts.callbacks.enterFullscreen,dashboard,dashboard.fullscreen.currentElement);};dashboard.exitFullscreen=function(){if(!dashboard.fullscreen.displayed){return;}
dashboard.fullscreen.headerElement.slideUp();dashboard.fullscreen.currentElement.hide();dashboard.fullscreen.displayed=false;for(var c in dashboard.columns){if(typeof dashboard.columns[c]=='object')dashboard.columns[c].element.show();}
invokeCallback(opts.callbacks.exitFullscreen,dashboard,dashboard.fullscreen.currentElement);};var asynchronousRequestCounter=0;var currentReSortEvent=null;var opts=$.extend({},$.fn.dashboard.defaults,options);var throbber=$(opts.throbberMarkup).appendTo(dashboard.element);$.getJSON(opts.ajaxCallbacks.getWidgetsByColumn.url,opts.ajaxCallbacks.getWidgetsByColumn.data,init);asynchronousRequestCounter++;return dashboard;function init(widgets,status){asynchronousRequestCounter--;throbber.remove();var markup='<li class="empty-placeholder">'+ opts.emptyPlaceholderInner+'</li>';var emptyDashboard=true;for(var c=0;c<opts.columns;c++){var col=dashboard.columns[c]={initialWidgets:Array(),element:$('<ul id="column-'+ c+'" class="column column-'+ c+'"></ul>').appendTo(dashboard.element)};col.emptyPlaceholder=$(markup).appendTo(col.element).hide();for(var id in widgets[c]){var widgetID=id.split('-');col.initialWidgets[id]=dashboard.widgets[widgetID[1]]=widget({id:widgetID[1],element:$('<li class="widget"></li>').appendTo(col.element),initialColumn:col,minimized:(widgets[c][widgetID[1]]>0?true:false)});emptyDashboard=false;}}
if(emptyDashboard){emptyDashboardCondition();}
invokeCallback(opts.callbacks.init,dashboard);}
function emptyDashboardCondition(){cj(".show-refresh").hide();cj("#empty-message").show();}
function completeInit(){if(asynchronousRequestCounter>0){return;}
dashboard.sortableElement=$('.column').sortable({connectWith:['.column'],handle:'.widget-header',placeholder:'placeholder',items:'> .widget',forcePlaceholderSize:true,update:resorted,start:hideEmptyPlaceholders});dashboard.saveColumns();dashboard.ready=true;invokeCallback(opts.callbacks.ready,dashboard);}
function resorted(e,ui){if(!currentReSortEvent||e.originalEvent!=currentReSortEvent){currentReSortEvent=e.originalEvent;dashboard.saveColumns();}}
function hideEmptyPlaceholders(e,ui){for(var c in dashboard.columns){if(typeof dashboard.columns[c]=='object ')dashboard.columns[c].emptyPlaceholder.hide();}}
function invokeCallback(callback,theThis,parameterOne){if(callback){callback.call(theThis,parameterOne);}}
function widget(widget){widget=$.extend({},$.fn.dashboard.widget.defaults,widget);widget.toggleMinimize=function(){if(widget.minimized){widget.maximize();}
else{widget.minimize();}
widget.hideSettings();dashboard.saveColumns();};widget.minimize=function(){$('.widget-content',widget.element).slideUp(opts.animationSpeed);$(widget.controls.minimize.element).addClass('maximize-icon');$(widget.controls.minimize.element).removeClass('minimize-icon');widget.minimized=true;};widget.maximize=function(){$('.widget-content',widget.element).slideDown(opts.animationSpeed);$(widget.controls.minimize.element).removeClass('maximize-icon');$(widget.controls.minimize.element).addClass('minimize-icon');widget.minimized=false;};widget.toggleSettings=function(){if(widget.settings.displayed){widget.maximize();widget.hideSettings();invokeCallback(opts.widgetCallbacks.hideSettings,widget);}
else{widget.minimize();widget.showSettings();invokeCallback(opts.widgetCallbacks.showSettings,widget);}};widget.showSettings=function(){if(widget.settings.element){widget.settings.element.show();if(widget.settings.ready){getJavascript(widget.settings.script);}}
else{initSettings();}
widget.settings.displayed=true;};widget.hideSettings=function(){if(widget.settings.element){widget.settings.element.hide();}
widget.settings.displayed=false;};widget.saveSettings=function(){var params={};var fields=widget.settings.element.serializeArray();for(var i in fields){var field=fields[i];params['settings['+ field.name+']']=field.value;}
widget.toggleSettings();var settingsElement=widget.settings.element;widget.settings.innerElement.empty();initThrobber();widget.settings.element=widget.throbber.hide();widget.settings.ready=false;$.extend(params,opts.ajaxCallbacks.widgetSettings.data,{id:widget.id});$.post(opts.ajaxCallbacks.widgetSettings.url,params,function(response,status){$.extend(widget.settings,response);widget.settings.element=settingsElement;widget.settings.innerElement.empty().append(widget.settings.markup);widget.settings.ready=true;if(widget.settings.displayed){widget.throbber.hide();widget.showSettings();invokeCallback(opts.widgetCallbacks.saveSettings,dashboard);}},'json');return false;};widget.enterFullscreen=function(){if(!widget.fullscreen){return;}
if(!widget.fullscreen.element){var markup='<div id="widget-'+ widget.id+'-full-screen">'+ widget.fullscreen+'</div>';widget.fullscreen={initialMarkup:widget.fullscreen,element:$(markup).appendTo(dashboard.element)};getJavascript(widget.fullscreenInitScript);}
dashboard.enterFullscreen(widget.fullscreen.element);getJavascript(widget.fullscreenScript);widget.fullscreen.displayed=true;};widget.exitFullscreen=function(){dashboard.exitFullscreen();};widget.addControl=function(id,control){var markup='<a class="widget-icon '+ id+'-icon" alt="'+ control.description+'" title="'+ control.description+'"></a>';control.element=$(markup).prependTo($('.widget-controls',widget.element)).click(control.callback);};widget.reloadContent=function(){getJavascript(widget.reloadContentScript);invokeCallback(opts.widgetCallbacks.reloadContent,widget);};widget.remove=function(){if(confirm('Are you sure you want to remove "'+ widget.title+'"?')){invokeCallback(opts.widgetCallbacks.remove,widget);widget.element.fadeOut(opts.animationSpeed,function(){$(this).remove();dashboard.saveColumns();});}};widget.controls={settings:{description:'Configure this dashlet',callback:widget.toggleSettings},minimize:{description:'Collapse or expand this dashlet',callback:widget.toggleMinimize},fullscreen:{description:'View this dashlet in full screen mode',callback:widget.enterFullscreen},close:{description:'Remove this dashlet from your dashboard',callback:widget.remove}};var throbber=$(opts.throbberMarkup).appendTo(widget.element);var params=$.extend({},opts.ajaxCallbacks.getWidget.data,{id:widget.id});$.getJSON(opts.ajaxCallbacks.getWidget.url,params,init);asynchronousRequestCounter++;return widget;function init(data,status){asynchronousRequestCounter--;$.extend(widget,data);if(!widget.settings){delete widget.controls.settings;}
if(!widget.fullscreen){delete widget.controls.fullscreen;}
widget.element.attr('id','widget-'+ widget.id).addClass(widget.classes);throbber.remove();$(widgetHTML()).appendTo(widget.element);widget.contentElement=$('.widget-content',widget.element);$.each(widget.controls,widget.addControl);widget.minimized=!widget.minimized;widget.toggleMinimize();getJavascript(widget.initScript);invokeCallback(opts.widgetCallbacks.get,widget);completeInit();}
function widgetHTML(){var html='';html+='<div class="widget-wrapper">';html+='  <div class="widget-controls"><h3 class="widget-header">'+ widget.title+'</h3></div>';html+='  <div class="widget-content">'+ widget.content+'</div>';html+='</div>';return html;}
function initSettings(){initThrobber();widget.settings={element:widget.throbber.show(),ready:false};var params=$.extend({},opts.ajaxCallbacks.widgetSettings.data,{id:widget.id});$.getJSON(opts.ajaxCallbacks.widgetSettings.url,params,function(response,status){$.extend(widget.settings,response);widget.settings.element=$(widgetSettingsHTML()).appendTo($('.widget-wrapper',widget.element)).submit(widget.saveSettings);widget.settings.cancelButton=$('.widget-settings-cancel',widget.settings.element).click(cancelEditSettings);widget.settings.innerElement=$('.widget-settings-inner',widget.settings.element).append(widget.settings.markup);widget.settings.ready=true;if(widget.settings.displayed){widget.throbber.hide();widget.showSettings();}
getJavascript(widget.settings.initScript);});}
function widgetSettingsHTML(){var html='';html+='<form class="widget-settings">';html+='  <div class="widget-settings-inner"></div>';html+='  <div class="widget-settings-buttons">';html+='    <input id="'+ widget.id+'-settings-save" class="widget-settings-save" value="Save" type="submit" />';html+='    <input id="'+ widget.id+'-settings-cancel" class="widget-settings-cancel" value="Cancel" type="submit" />';html+='  </div>';html+='</form>';return html;}
function initThrobber(){if(!widget.throbber){widget.throbber=$(opts.throbberMarkup).appendTo($('.widget-wrapper',widget.element));}};function cancelEditSettings(){widget.toggleSettings();return false;};function getJavascript(url){if(url){$.getScript(url);}}};};$.fn.dashboard.defaults={columns:2,emptyPlaceholderInner:'There are no dashlets in this column of your dashboard.',fullscreenHeaderInner:'Back to dashboard mode',throbberMarkup:'<div class="crm-loading-element">Loading...</div>',animationSpeed:200,callbacks:{},widgetCallbacks:{}};$.fn.dashboard.widget={defaults:{minimized:false,settings:false,fullscreen:false}};})(jQuery);
