$(document).ready(function(){
init_flash_messages();
init_delete_confirmations();
init_sortable_menu();
init_submit_continue();
init_modal_dialogs();
init_tooltips();
// focus first field in an admin form.
$('form input[type=text]:first').focus();
});
init_delete_confirmations = function() {
$('a.confirm-delete').click(function(e) {
if (confirm("Are you sure you want to " + (t=($(this).attr('title') || $(this).attr('tooltip')))[0].toLowerCase() + t.substring(1) + "?")) {
$("
")
.append("")
.append("")
.appendTo('body').submit();
}
e.preventDefault();
});
}
init_flash_messages = function(){
$('#flash').fadeIn(550);
$('#flash_close').click(function(e) {
$('#flash').fadeOut({duration: 330});
e.preventDefault();
});
}
init_modal_dialogs = function(){
$('a[href*="dialog=true"]').not('#dialog_container a').each(function(i, anchor)
{
$(anchor).click(function(e){
iframe = $("");
iframe.dialog({
title: $(anchor).attr('title') || $(anchor).attr('name') || $(anchor).html() || null,
modal: true,
resizable: false,
autoOpen: true,
width: (parseInt($(anchor.href.match("width=([0-9]*)")).last().get(0))||928),
height: (parseInt($(anchor.href.match("height=([0-9]*)")).last().get(0))||473)/*,
beforeclose: function(){
$(document.body).removeClass('hide-overflow');
}*/
});
if ($.browser.msie) {
iframe.css({'margin':'-2px 2px 2px -2px'});
}
//$(document.body).addClass('hide-overflow');
e.preventDefault();
});
});
}
init_sortable_menu = function(){
var $menu = $('#menu');
if($menu.length == 0){return}
$menu.sortable({
axis: 'x',
cursor: 'crosshair',
items: '.tab',
update: function(){
var ser = $menu.sortable('serialize', {key: 'menu[]'}),
token = escape($('#admin_authenticity_token').val());
$.get('/admin/update_menu_positions?' + ser, {authenticity_token: token});
}
});
//Initial status disabled
$menu.sortable('disable');
$menu.find('#menu_reorder').click(function(e){
e.preventDefault();
$('#menu_reorder, #menu_reorder_done').toggle();
$('#header >*:not(#menu, script), #content, #logout').fadeTo(500, 0.2);
$menu.find('.tab a').click(function(ev){
ev.preventDefault();
});
$menu.sortable('enable');
});
$menu.find('#menu_reorder_done').click(function(e){
e.preventDefault();
$('#menu_reorder, #menu_reorder_done').toggle();
$('#header >*:not(#menu, script), #content, #logout').fadeTo(500, 1);
$menu.find('.tab a').unbind('click');
$menu.sortable('disable');
});
}
init_submit_continue = function(){
$('#submit_continue_button').click(function(e) {
// ensure wymeditors are up to date.
if ($(this).hasClass('wymupdate')) {
$.each(WYMeditor.INSTANCES, function(index, wym)
{
wym.update();
});
}
$('#continue_editing').val(true);
$('#flash').fadeOut(250)
$('.fieldWithErrors').removeClass('fieldWithErrors').addClass('field');
$('#flash_container .errorExplanation').remove();
$.post(this.form.action, $(this.form).serialize(), function(data) {
if ((flash_container = $('#flash_container')).length > 0) {
flash_container.html(data);
$('#flash').css('width', 'auto').fadeIn(550);
$('.errorExplanation').not($('#flash_container .errorExplanation')).remove();
if ((error_fields = $('#fieldsWithErrors').val()) != null) {
$.each(error_fields.split(','), function() {
$("#" + this).wrap("");
});
}
$('.fieldWithErrors:first :input:first').focus();
$('#continue_editing').val(false);
}
});
e.preventDefault();
});
}
init_tooltips = function(args){
$($(args != null ? args : 'a[title], span[title], #image_grid img[title], *[tooltip]')).each(function(index, element)
{
// create tooltip on hover and destroy it on hoveroff.
$(element).hover(function(e) {
tooltip = $("").html($(this).attr('tooltip')).appendTo($('#tooltip_container'));
tooltip.css({
'left': ((left = $(this).offset().left - (tooltip.outerWidth() / 2) + ($(this).outerWidth() / 2)) >= 0 ? left : 0)
, 'top': $(this).offset().top - tooltip.outerHeight() - 6
}).show();
}, function(e) {
$('.tooltip').remove();
});
if ($(element).attr('tooltip') == null) {
$(element).attr({'tooltip': $(element).attr('title'), 'title': ''});
}
// wipe clean the title on any children too.
$(element).children('img').attr('title', '')
});
}
var link_dialog = {
init: function(test_url, test_email){
this.test_url = test_url;
this.test_email = test_email;
this.init_tabs();
this.init_resources_submit();
this.init_close();
this.page_tab();
this.web_tab();
this.email_tab();
},
init_tabs: function(){
var radios = $('#dialog_menu_left input:radio');
var selected = radios.parent().filter(".selected_radio").find('input:radio').first() || radios.first();
radios.click(function(){
link_dialog.switch_area($(this));
});
selected.attr('checked', 'true');
link_dialog.switch_area(selected);
},
init_resources_submit: function(){
$('#dialog-form-actions #submit_button').click(function(e){
e.preventDefault();
if((resource_selected = $('#existing_resource_area_content ul li.linked a')).length > 0) {
resourceUrl = parseURL(resource_selected.attr('href'));
relevant_href = resourceUrl.pathname;
if (resourceUrl.protocol == "" && resourceUrl.hostname == "system") {
relevant_href = "/system" + relevant_href;
}
// Add any alternate resource stores that need a absolute URL in the regex below
if( resourceUrl.hostname.match(/s3.amazonaws.com/) ) {
relevant_href = resourceUrl.protocol + '//' + resourceUrl.host + relevant_href;
}
if (typeof(resource_picker.callback) == "function") {
resource_picker.callback({
id: resource_selected.attr('id').replace("resource_", "")
, href: relevant_href
, html: resource_selected.html()
});
}
}
if(parent && typeof(parent.tb_remove) == "function"){
parent.tb_remove();
}
});
$('#dialog-form-actions #cancel_button').click(function(e){
e.preventDefault();
parent.tb_remove();
});
},
init_close: function(){
$('#dialog-form-actions #cancel_button').click(function(e){
if (parent && typeof(parent.$) == "function") {
// parent.$(document.body).removeClass('hide-overflow');
parent.$('.ui-dialog').dialog('close').remove();
} else {
$('.ui-dialog').dialog('close').remove();
// $(document.body).removeClass('hide-overflow');
}
});
},
switch_area: function(area){
$('#dialog_menu_left .selected_radio').removeClass('selected_radio');
$(area).parent().addClass('selected_radio');
$('#dialog_main .dialog_area').hide();
$('#' + $(area).val() + '_area').show();
},
//Same for resources tab
page_tab: function(){
$('.link_list li').click(function(e){
e.preventDefault();
$('.link_list li.linked').removeClass('linked');
$(this).addClass('linked');
var link = $(this).children('a.page_link').get(0);
var port = (window.location.port.length > 0 ? (":" + window.location.port) : "");
var url = link.href.replace(window.location.protocol + "//" + window.location.hostname + port, "");
link_dialog.update_parent(url, link.rel.replace(/\ ?.+?<\/em>/, ''));
});
},
web_tab: function(){
$('#web_address_text').change(function(){
var prefix = '#web_address_',
icon = '';
$(prefix + 'test_loader').show();
$(prefix + 'test_result').hide();
$(prefix + 'test_result').removeClass('success_icon').removeClass('failure_icon');
$.getJSON(link_dialog.test_url, {url: this.value}, function(data){
if(data.result == 'success'){
icon = 'success_icon';
}else{
icon = 'failure_icon';
}
$(prefix + 'test_result').addClass(icon).show();
$(prefix + 'test_loader').hide();
});
link_dialog.update_parent( $(prefix + 'text').val(),
$(prefix + 'text').val(),
($(prefix + 'target_blank').checked ? "_blank" : "")
);
});
$('#web_address_target_blank').click(function(){
parent.document.getElementById('wym_target').value = this.checked ? "_blank" : "";
});
},
email_tab: function() {
$('#email_address_text, #email_default_subject_text, #email_default_body_text').change(function(e){
var default_subject = $('#email_default_subject_text').val(),
default_body = $('#email_default_body_text').val(),
mailto = "mailto:" + $('#email_address_text').val(),
modifier = "?",
icon = '';
$('#email_address_test_loader').show();
$('#email_address_test_result').hide();
$('#email_address_test_result').removeClass('success_icon').removeClass('failure_icon');
$.getJSON(link_dialog.test_email, {email: mailto}, function(data){
if(data.result == 'success'){
icon = 'success_icon';
}else{
icon = 'failure_icon';
}
$('#email_address_test_result').addClass(icon).show();
$('#email_address_test_loader').hide();
});
if(default_subject.length > 0){
mailto += modifier + "subject=" + default_subject;
modifier = "&";
}
if(default_body.length > 0){
mailto += modifier + "body=" + default_body;
modifier = "&";
}
link_dialog.update_parent(mailto, mailto.replace('mailto:', ''));
});
},
update_parent: function(url, title, target) {
if (parent != null) {
if ((wym_href = parent.document.getElementById('wym_href')) != null) {
wym_href.value = url;
}
if ((wym_title = parent.document.getElementById('wym_title')) != null) {
wym_title.value = title;
}
if ((wym_target = parent.document.getElementById('wym_target')) != null) {
wym_target.value = target || "";
}
}
}
}
var page_options = {
init: function(enable_parts, new_part_url, del_part_url){
// set the page tabs up, but ensure that all tabs are shown so that when wymeditor loads it has a proper height.
// also disable page overflow so that scrollbars don't appear while the page is loading.
$(document.body).addClass('hide-overflow');
page_options.tabs = $('#page-tabs').tabs({tabTemplate: '#{label}'});
part_shown = $('#page-tabs .page_part.field').not('.ui-tabs-hide');
$('#page-tabs .page_part.field').removeClass('ui-tabs-hide');
this.enable_parts = enable_parts;
this.new_part_url = new_part_url;
this.del_part_url = del_part_url;
this.show_options();
this.title_type();
// Hook into the loaded function. This will be called when WYMeditor has done its thing.
WYMeditor.loaded = function(){
// hide the tabs that are supposed to be hidden and re-enable overflow.
$(document.body).removeClass('hide-overflow');
$('#page-tabs .page_part.field').not(part_shown).addClass('ui-tabs-hide');
}
if(this.enable_parts){
this.page_part_dialog();
}
},
show_options: function(){
$('#toggle_advanced_options').click(function(e){
e.preventDefault();
$('#more_options').toggle();
});
},
title_type: function(){
$("input[name=page\[custom_title_type\]]").change(function(){
$('#custom_title_text, #custom_title_image').hide();
$('#custom_title_' + this.value).show();
});
},
page_part_dialog: function(){
$('#new_page_part_dialog').dialog({
title: 'Create Content Section',
modal: true,
resizable: false,
autoOpen: false,
width: 600
});
$('#add_page_part').click(function(e){
e.preventDefault();
$('#new_page_part_dialog').dialog('open');
});
$('#new_page_part_save').click(function(e){
e.preventDefault();
var part_title = $('#new_page_part_title').val();
if(part_title.length > 0){
var tab_title = part_title.toLowerCase().replace(" ", "_");
if ($('#part_' + tab_title).size() == 0) {
$.get(page_options.new_part_url,
{
title: part_title
, part_index: $('#new_page_part_index').val()
, body: ''
}
, function(data, status){
// Add a new tab for the new content section.
$('#page_part_editors').append(data);
page_options.tabs.tabs('add', '#page_part_new_' + $('#new_page_part_index').val(), part_title);
page_options.tabs.tabs('select', '#page_part_new_' + $('#new_page_part_index').val());
// turn the new textarea into a wymeditor.
$('#page_parts_attributes_' + $('#new_page_part_index').val() + "_body").wymeditor(wymeditor_boot_options);
// Wipe the title and increment the index counter by one.
$('#new_page_part_index').val(parseInt($('#new_page_part_index').val()) + 1);
$('#new_page_part_title').val('');
$('#page-tabs').tabs();
}
);
}else{
alert("A content section with that title already exists, please choose another.");
}
}else{
alert("You have not entered a title for the content section, please enter one.");
}
$('#new_page_part_dialog').dialog('close');
});
$('#new_page_part_cancel').click(function(e){
e.preventDefault();
$('#new_page_part_dialog').dialog('close');
$('#new_page_part_title').val('');
});
$('#delete_page_part').click(function(e){
e.preventDefault();
var stab_id = page_options.tabs.tabs('option', 'selected');
var part_id = $('#page_parts_attributes_' + stab_id + '_id').val();
//console.log('stab_id: ' + stab_id + ' part_id: ' + part_id);
var result = confirm("This will remove the content section '" + $('#page_parts .ui-tabs-selected a').html() + "' and erase all content that has been entered into it even if you don't save the page, are you sure?");
if(part_id && result) {
$.ajax({
url: page_options.del_part_url + '/' + part_id,
type: 'DELETE'
});
page_options.tabs.tabs('remove', stab_id);
//WYMeditor.loaded();
}
});
}
}
var image_dialog = {
callback: null
, init: function(callback){
this.callback = callback;
this.init_tabs();
this.init_select();
this.init_actions();
return this;
}
, init_tabs: function(){
var radios = $('#dialog_menu_left input:radio');
var selected = radios.parent().filter(".selected_radio").find('input:radio').first() || radios.first();
radios.click(function(){
link_dialog.switch_area($(this));
});
selected.attr('checked', 'true');
link_dialog.switch_area(selected);
}
, switch_area: function(radio){
$('#dialog_menu_left .selected_radio').removeClass('selected_radio');
$(radio).parent().addClass('selected_radio');
$('#dialog_main .dialog_area').hide();
$('#' + radio.value + '_area').show();
}
, init_select: function(){
$('#existing_image_area_content ul li img').click(function(){
image_dialog.set_image(this);
});
//Select any currently selected, just uploaded...
if ((selected_image = $('#existing_image_area_content ul li.selected img')).length > 0) {
image_dialog.set_image(selected_image.first());
}
}
, set_image: function(img){
if ($(img).length > 0) {
$('#existing_image_area_content ul li.selected').removeClass('selected');
$(img).parent().addClass('selected');
var imageUrl = parseURL($(img).attr('src'));
var relevant_src = imageUrl.pathname.replace('_dialog_thumb', '');
if (imageUrl.protocol == "" && imageUrl.hostname == "system") {
relevant_src = "/system" + relevant_src;
}
if(imageUrl.hostname.match(/s3.amazonaws.com/)){
relevant_src = imageUrl.protocol + '//' + imageUrl.host + relevant_src;
}
if (parent) {
if ((wym_src = parent.document.getElementById('wym_src')) != null) {
wym_src.value = relevant_src;
}
if ((wym_title = parent.document.getElementById('wym_title')) != null) {
wym_title.value = $(img).attr('title');
}
if ((wym_alt = parent.document.getElementById('wym_alt')) != null) {
wym_alt.value = $(img).attr('alt');
}
}
}
}
, submit_image_choice: function(e) {
e.preventDefault();
if((img_selected = $('#existing_image_area_content ul li.selected img').get(0)) && typeof(this.callback) == "function") {
this.callback(img_selected);
}
this.close_dialog(e);
}
, close_dialog: function(e) {
if (parent && typeof(parent.$) == "function") {
// parent.parent.$(document.body).removeClass('hide-overflow');
parent.$('.ui-dialog').dialog('close').remove();
} else {
$('.ui-dialog').dialog('close').remove();
// $(document.body).removeClass('hide-overflow');
}
e.preventDefault();
}
, init_actions: function(){
var _this = this;
$('#dialog-form-actions #submit_button').click($.proxy(_this.submit_image_choice, _this));
$('#dialog-form-actions #cancel_button').click($.proxy(_this.close_dialog, _this));
}
}
var list_reorder = {
init: function() {
$('#reorder_action').click(list_reorder.enable_reordering);
$('#reorder_action_done').click(list_reorder.disable_reordering);
}
, enable_reordering: function(e) {
if(e) { e.preventDefault(); }
list_reorder.sortable_list.find('li').each(function(index, li) {
if ($('ul', li).length) { return; }
$("").appendTo(li);
});
list_reorder.sortable_list.add(list_reorder.sortable_list.find('ul')).sortable({
'connectWith': $(list_reorder.sortable_list.find('ul'))
, 'tolerance': 'pointer'
, 'placeholder': 'placeholder'
, 'cursor': 'drag'
, 'items': 'li'
, 'axis': 'y'
});
$('#reorder_action').hide();
$('#reorder_action_done').show();
}
, parse_branch: function(indexes, li) {
branch = "&sortable_list";
$.each(indexes, function(i, index) {
branch += "[" + index + "]";
});
branch += "[id]=" + $($(li).attr('id').split('_')).last().get(0);
// parse any children branches too.
$(li).find('> li[id], > ul li[id]').each(function(i, child) {
current_indexes = $.merge($.merge([], indexes), [i]);
branch += list_reorder.parse_branch(current_indexes, child);
});
return branch;
}
, disable_reordering: function(e) {
if(e) { e.preventDefault(); }
if (list_reorder.update_url != null) {
serialized = "";
list_reorder.sortable_list.find('> li[id]').each(function(index, li) {
if (list_reorder.tree) {
serialized += list_reorder.parse_branch([index], li);
}
else {
serialized += "&sortable_list[]=" + $($(li).attr('id').split('_')).last().get(0);
}
});
serialized += "&tree=" + list_reorder.tree + "&authenticity_token=" + encodeURIComponent($('#reorder_authenticity_token').val() + "&continue_reordering=false");
$.post(list_reorder.update_url, serialized, function(data) {
$(list_reorder.sortable_list.get(0)).html(data);
$(list_reorder.sortable_list).removeClass('reordering').sortable('destroy');
$('#reorder_action_done').hide();
$('#reorder_action').show();
});
} else {
$(list_reorder.sortable_list).removeClass('reordering').sortable('destroy');
$('#reorder_action_done').hide();
$('#reorder_action').show();
}
}
}
var image_picker = {
options: {
selected: '',
thumbnail: 'dialog_thumb',
field: '#image',
image_display: '#current_picked_image',
no_image_message: '#no_picked_image_selected',
image_container: '#current_image_container',
remove_image_button: '#remove_picked_image',
image_toggler: null
}
, init: function(new_options){
this.options = $.extend(this.options, new_options);
$(this.options.remove_image_button).click($.proxy(this.remove_image, this));
$(this.options.image_toggler).click($.proxy(this.toggle_image, this));
}
, remove_image: function(e) {
e.preventDefault();
$(this.options.image_display).removeClass('brown_border')
.attr({'src': '', 'width': '', 'height': ''})
.css({'width': 'auto', 'height': 'auto'})
.hide();
$(this.options.field).val('');
$(this.options.no_image_message).show();
$(this.options.remove_image_button).hide();
$(this).hide();
}
, toggle_image: function(e) {
$(this.options.image_toggler).html(($(this.options.image_toggler).html() == 'Show' ? 'Hide' : 'Show'));
$(this.options.image_container).toggle();
e.preventDefault();
}
, changed: function(image) {
$(this.options.field).val(image.id.replace("image_", ""));
image.src = image.src.replace('_dialog_thumb', '_' + this.options.thumbnail).replace(/\?\d*/, '');
current_image = $(this.options.image_display);
current_image.replaceWith($(""));
$(this.options.remove_image_button).show();
$(this.options.no_image_message).hide();
}
}
var resource_picker = {
callback: null
, init: function(callback) {
this.callback = callback;
}
}
//parse a URL to form an object of properties
parseURL = function(url)
{
//save the unmodified url to href property
//so that the object we get back contains
//all the same properties as the built-in location object
var loc = { 'href' : url };
//split the URL by single-slashes to get the component parts
var parts = url.replace('//', '/').split('/');
//store the protocol and host
loc.protocol = parts[0];
loc.host = parts[1];
//extract any port number from the host
//from which we derive the port and hostname
parts[1] = parts[1].split(':');
loc.hostname = parts[1][0];
loc.port = parts[1].length > 1 ? parts[1][1] : '';
//splice and join the remainder to get the pathname
parts.splice(0, 2);
loc.pathname = '/' + parts.join('/');
//extract any hash and remove from the pathname
loc.pathname = loc.pathname.split('#');
loc.hash = loc.pathname.length > 1 ? '#' + loc.pathname[1] : '';
loc.pathname = loc.pathname[0];
//extract any search query and remove from the pathname
loc.pathname = loc.pathname.split('?');
loc.search = loc.pathname.length > 1 ? '?' + loc.pathname[1] : '';
loc.pathname = loc.pathname[0];
//return the final object
return loc;
}