// ######## Generic Sortable Methods ###############
function prepareSortableList(){
	sortable_options = { 
		update: function(e,ui){
			$.ajax({
				type: 'PUT',
				url: $(this).attr('jqueryUpdateUrl'),
				data: $(this).sortable('serialize') + $(this).attr('jqueryUpdateParameters')
			})
		}
	}
	if($("[jquery_handle='drag_handle']")){
		sortable_options.drag_handle = $("[jquery_handle='drag_handle']");
	}
	$('ul').each(function(){
		$(this).sortable(sortable_options);
	});
}

// ######## Start Sortable Tree methods ############

jQuery.extend({tree_sort: { 
	sortable_options: {axis: 'y', handle: $("[jquery_handle='item_name']")},
	expansion_html: '<a onclick="showChildren($(this).parent().parent().parent().parent())"><img src="/images/li_expand.png" class="collapse"></img</a>',
	contraction_html: '<a onclick="hideChildren($(this).parent().parent().parent().parent())"><img src="/images/li_expanded.png" class="collapse"></img></a>',
	expansion_placeholder: '<img src="/images/li_placeholder.png"></img>'
}});

function moveListItem(subject,target){
	$.ajax({
		type: 'PUT', 
		url: '/manage/pages/' + subject.attr('db_id'),
		data: { 'page[parent_id]' : target.attr('db_id')}, 
		success: function(data,textStatus){moveListItemClientOnly(subject,target)},
		error: function(XMLHttpRequest, textStatus, errorThrown){subject.children('*:not(ul)').contents().find("[jquery_handle='error_messages']").html(XMLHttpRequest.responseText)}
	});
}
function moveListItemClientOnly(subject,target){
	if(target.children("ul").length == 0){
		target.append('<ul jquery_handle="sortable_list"/>');
		$(target.children("ul")).sortable($.tree_sort.sortable_options);
	};
	if(subject.siblings().length == 0){
		removeParent = subject.parent();
		subject.parent().parent().children('div').contents().find("[jquery_handle='expansion_controls']").html($.tree_sort.expansion_placeholder);
	} else {
		removeParent = false;
	}
	target.children("ul").prepend(subject);
	refreshDownLinks();
	showChildren(target);
	if(removeParent){
		removeParent.remove();
	}
};
function refreshDownLinks(){
	$("[jquery_handle='activeMoveToHereLink']").remove();
	$("[jquery_handle='cancelMoveLink']").hide();
	$("[jquery_handle='moveDownLink']").show();
	$("[jquery_handle='error_messages']").empty();
	$("div.move_subject").removeClass('move_subject');
};

function showMoveLinks(subject) {
	$(subject).children('.list_bar:first').addClass('move_subject');
	lists = $("ul[jquery_handle='sortable_list']");
	lists.each(	function(){
		$(this).children('li').each( function(){
			$(this).children('div').contents().find("[jquery_handle='moveDownLink']").hide();
		});
	});
	subject.children('div').contents().find("[jquery_handle='cancelMoveLink']").show();
	subject_child_list_ids = [subject.children('ul').attr('id')];
	subject.contents().find('ul').each(function(){
		 subject_child_list_ids.push( $(this).attr('id') );
	});
	subject_parent = subject.parent().parent();
	container_parent = $('#tree_sort_container')
	lists.add(container_parent).each(	function(){
		if ($.inArray($(this).attr('id'),subject_child_list_ids) == -1 ){
			$(this).children("[jquery_handle='move_target']").each(function(){
				if($(this).attr('id') != subject.attr('id')
				 &&
				($(this).attr('id') != subject_parent.attr('id'))){
					subject_move_link = subject.children('div').contents().find("[jquery_handle='moveToHereLink']").clone();
					subject_move_link.attr({jquery_handle:'activeMoveToHereLink'});
					$(this).children('div').contents().find("[jquery_handle='moveToHereLinkContainer']").html(subject_move_link);
					$(this).children('div').contents().find("[jquery_handle='activeMoveToHereLink']").show();
				}
			});
		}
	});
}

function hideChildren(subject){
	$.ajax({
		type: 'PUT', 
		url: '/manage/pages/' + subject.attr('db_id'),
		data: { 'page[expanded]' : 'false'}, 
		success: function(data,textStatus){hideChildrenClientOnly(subject)},
		error: function(XMLHttpRequest, textStatus, errorThrown){subject.children('*:not(ul)').contents().find("[jquery_handle='error_messages']").html(XMLHttpRequest.responseText)}
	})
}
function hideChildrenClientOnly(subject){
	if(subject.children('ul').length > 0){
		subject.children('ul').hide();
		subject.children('div').contents().find("[jquery_handle='expansion_controls']").html($.tree_sort.expansion_html);
	}
}
function showChildren(subject){
	$.ajax({
		type: 'PUT', 
		url: '/manage/pages/' + subject.attr('db_id'),
		data: { 'page[expanded]' : 'true'}, 
		success: function(data,textStatus){showChildrenClientOnly(subject)},
		error: function(XMLHttpRequest, textStatus, errorThrown){subject.children('*:not(ul)').contents().find("[jquery_handle='error_messages']").html(XMLHttpRequest.responseText)}
	})
}
function showChildrenClientOnly(subject){
	if(subject.children('ul').length > 0){
		subject.children('ul').show();
		subject.children('div').contents().find("[jquery_handle='expansion_controls']").html($.tree_sort.contraction_html);
	}
}

function prepareSortableTree(){
	$('ul').each(function(){
		$(this).sortable({ 
			handle: $("[jquery_handle='drag_handle']"),
			update: function(e,ui){
				$.ajax({
					type: 'PUT', 
					url: '/manage/pages/multiple',
					data: $(this).sortable('serialize')
				})
			}
		});
	});
}
function prepareExpandableTree(collapsed_page_ids){
	$("[jquery_handle='move_target']:not('#tree_sort_root')").each(function(){
		if($.inArray(parseInt($(this).attr('db_id')),collapsed_page_ids) != -1){
			hideChildrenClientOnly($(this));
		}	else {
			showChildrenClientOnly($(this))
		}
	});
}
//########## End Sortable Tree methods ###########
//########## Begin Page Tree Content Editing Methods ##########
function publishPage(page_id){
	$.ajax({ 
		type: 'PUT', 
		url: '/manage/pages/' + page_id,
		data: {'page[active]':'true'}, 
		success: function(data,textStatus){
			$('#controls_publish_' + page_id).hide();
			$('#controls_unpublish_' + page_id).show();
			$('#list_bar_' + page_id).addClass('published');
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			$('#page_' + page_id).children('*:not(ul)').contents().find("[jquery_handle='error_messages']").html(XMLHttpRequest.responseText)
		}
	})
}
function unpublishPage(page_id){
	$.ajax({ 
		type: 'PUT', 
		url: '/manage/pages/' + page_id,
		data: {'page[active]':'false'}, 
		success: function(data,textStatus){
			$('#controls_unpublish_' + page_id).hide();
			$('#controls_publish_' + page_id).show();
			$('#list_bar_' + page_id).removeClass('published');
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			$(this).parents('.list_bar_controls:first').children('.controls_publish').append(XMLHttpRequest.responseText)
		}
	})
}
//########## End Page Tree Content Editing Methods ##########

//########## Begin Theme Methods ############

function updateCompanyTheme(company_id,company_name,theme_id){
	if(confirm("Are you sure you want to change the theme for " + company_name + "?")){
		$.ajax({ 
			type: 'PUT', 
			url: '/manage/companies/' + company_id,
			data: {'company[theme_id]':theme_id}
		})
	}
}
//########### End Theme Methods ##############

//########### Begin Design Methods ###########

function bindAjaxElements(target_document){
	if(!target_document){
		target_document = document;
	}
	$("[jqueryHandle='ajax_form']",target_document).unbind('submit', bindAjaxForms);	
	$("[jqueryHandle='ajax_form']",target_document).bind('submit', bindAjaxForms);
	$("[jqueryHandle='ajax_link']",target_document).unbind('click', bindAjaxLinks);	
	$("[jqueryHandle='ajax_link']",target_document).bind('click', bindAjaxLinks);
}

function bindAjaxForms(e){
	our_form = $(e.target);
	$.ajax({
		type: our_form.attr('jqueryRequestMethod'),
		data: our_form.serializeArray(),
		dataType: 'html',
		url: our_form.attr('action'),
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			if(jquery_error_element = our_form.attr('jqueryErrorElement')){
				switch( our_form.attr('jqueryErrorPlacement') ) {
					case 'after':
						$('#' + jquery_error_element).after(XMLHttpRequest.responseText);
						break;
					case 'html':
						$('#' + jquery_error_element).html(XMLHttpRequest.responseText);
						break;
					case 'before':
						$('#' + jquery_error_element).before(XMLHttpRequest.responseText);
						break;
					case 'prepend':
						$('#' + jquery_error_element).prepend(XMLHttpRequest.responseText);
						break;
					case 'append':
						$('#' + jquery_error_element).append(XMLHttpRequest.responseText);
						break;
					default:
						$('#' + jquery_error_element).html(XMLHttpRequest.responseText);
						break;
				}
			} else {
				alert(XMLHttpRequest.responseText);
			}
		},
		success: function(data,textStatus) {
			if(jquery_success_element = our_form.attr('jquerySuccessElement')){
				switch( our_form.attr('jquerySuccessPlacement') ) {
					case 'after':
						$('#' + jquery_success_element).after(data);
						break;
					case 'html':
						$('#' + jquery_success_element).html(data);
						break;
					case 'before':
						$('#' + jquery_success_element).before(data);
						break;
					case 'prepend':
						$('#' + jquery_success_element).prepend(data);
						break;
					case 'append':
						$('#' + jquery_success_element).append(data);
						break;
					default:
						$('#' + jquery_success_element).html(data);
						break;
				}
			};
			if(our_form.attr('jquerySuccessCallback')){
				eval(our_form.attr('jquerySuccessCallback'));
			};
			bindAjaxElements();
		}
	});
	return false;
}

function bindAjaxLinks(e){
	our_link = $(e.target);
	
	if( our_link.attr('nodeName').toUpperCase() != 'A'){
		our_link = our_link.parents('a');
	};
	$.ajax({
		type: our_link.attr('jqueryRequestMethod'),
		dataType: 'html',
		url: our_link.attr('href'),
		beforeSend: function(XMLHttpRequest) {
			if(our_link.attr('jqueryBeforeCallback')){
				eval(our_link.attr('jqueryBeforeCallback'));
			};
			if(our_link.attr('jqueryConfirm')) {
				return confirm(our_link.attr('jqueryConfirm'));
			} else {
				return true;
			};
			
		},
		success: function(data,textStatus) {
			if(jquery_success_element = our_link.attr('jquerySuccessElement')){
				switch( our_link.attr('jquerySuccessPlacement') ) {
					case 'after':
						$('#' + jquery_success_element).after(data);
						break;
					case 'html':
						$('#' + jquery_success_element).html(data);
						break;
					case 'before':
						$('#' + jquery_success_element).before(data);
						break;
					case 'prepend':
						$('#' + jquery_success_element).prepend(data);
						break;
					case 'append':
						$('#' + jquery_success_element).append(data);
						break;
					default:
						$('#' + jquery_success_element).html(data);
						break;
				}
			};
			if(our_link.attr('jquerySuccessCallback')){
				eval(our_link.attr('jquerySuccessCallback'));
			};
			bindAjaxElements();
		}
	});
	return false;
}

function bindColorPicker(){
	$("[jqueryHandle='colorInput']").click(function(e){
		our_picker = $('#' + $(e.target).attr('jqueryAssociatedColorPicker')).clone();
		our_picker.attr({id:'cloned_' + our_picker.attr('id')});
		our_picker.ColorPicker({
			flat: true,
			color: $('#' + $(e.target).attr('jqueryAssociatedInput')).val(),
			onChange: function(hsb, hex, rgb) {
				$(e.target).css('background-color','#' + hex);
				$('#' + $(e.target).attr('jqueryAssociatedInput')).val(hex);
				if ($(e.target).attr('jqueryOnChange')) {
					eval($(e.target).attr('jqueryOnChange'))
				};
			},
			onSubmit: function(hsb, hex, rgb) {
				our_picker.remove();
			}
		});
		$('#colorpickerHolder').html(our_picker);
		our_picker.show();
		$('#colorpickerHolder').show();
		$("[jqueryHandle='selected_swatch_indicator']").removeClass('selected_swatch_indicator');
		$(e.target)
			.parents("[jqueryHandle='selected_swatch_indicator']")
			.addClass('selected_swatch_indicator');
		$('#color_swatch_refresh').click(function(re){
			our_picker.ColorPickerSetColor($('.colorpicker_hex > input').val());
		})
	});
}

function resetEditButtons(){
	$("[jqueryHandle='editing_image']").each(function(i){
    this_edit_image = $('#prototype_edit_image').clone();
    this_edit_image
      .attr({
        id: null,
        jqueryHandle: 'edit_image',
        jqueryAssociatedResource: $(this).attr('jqueryAssociatedResource')
      });
    this_edit_image.show();
    $(this).replaceWith(this_edit_image);
  });
}
