// prepare selection information in code application form before submitting
function prepare_code_application_form() {
	var selection = current_selection();
	if (selection.is_empty()) {
	    if (show_origin_type == 'AudioFile') {
	        $('code_application_origin_type').value = show_origin_type;
	        $('code_application_origin_id').value = show_origin_id;
		    if (current_player) 
		        $('code_application_paragraph_index').value = parseInt(current_player.position()/1000);
		    else
		        $('code_application_paragraph_index').value = 0;
		    return true;
		    
		} else { // there is no selection, so cancel the request
    		alert("You need to select some data before applying a code.");
    		return false;
    	}
	} else {
		// otherwise set the form values and allow the request
		$('code_application_form_cover').clonePosition($('new_code_application')).show();
		selection.set_form_values('code_application');
		return true;
	}
}

function delete_code_application(code_application_id) {
    new Ajax.Request('/code_applications/delete/' + code_application_id, {
		onSuccess : function(request) {
		    var element = $('block_code_application_' + code_application_id);
		    
		    // a div element wrapping all of the applications for an origin
		    var parent = $(element.parentNode);
		    
		    // a container with all code applications for a given code
		    var container = parent.up(".code_with_block_applications");

	        // hide the deleted code application
	        Effect.SlideUp(element, {duration:0.5, queue:'end', afterFinish:function() {
	            $('notice_content').update("Coding deleted");
	            show_notice();
	            
	            element.remove();
	            
	            // if element is the last application in the parent, hide the parent
	            if (parent.select('.code_application').size() == 0) {
	                Effect.SlideUp(parent, {duration:0.2, queue:'end'});
	            }
	            
	            // if the container now has no code applications hide it!
	            if (container.select('.code_application').size() == 0) {
	                Effect.SlideUp(container, {duration:0.2, queue:'end'});
	            }
	        }});
		},
		onFailure : function(request) {
			alert("Saturate seems to be having some problems. Please try again in a few minutes.");
		}
	});
}

function delete_inline_code_application(link, code_application_id) {
	new Ajax.Request('/code_applications/delete/' + code_application_id, {
		parameters : {
			'code_application_inline_coding_id': $(link).up('.inline_coding').id,
		},
		onSuccess : function(response) {
		},
		onFailure : function(response) {
		    failure();
		}
	});
}

function apply_code_by_id(code_id) {
	var selection = current_selection();
	if (selection.is_empty()) {
	    if (show_origin_type == 'AudioFile') {
	        
    	    params = {
    	      'code_id':code_id,
      	      'code_application[origin_id]': show_origin_id,
      	      'code_application[origin_type]': show_origin_type };
        	      
	        if (current_player) {
	            params['code_application[paragraph_index]'] = parseInt(current_player.position()/1000);
    	    } else {
    	        params['code_application[paragraph_index]'] = 0;
    	    }
	        
	    } else { // there is no selection, so cancel the request
		    alert("You need to select some data before applying a code.");
		    return false;
	    }
	} else {
	    params = {
	      'code_id':code_id,
		  'code_application_inline_coding_id': selection.inline_coding().id,
	      'code_application[origin_id]': selection.origin_id(),
	      'code_application[origin_type]': selection.origin_type(),
	      'code_application[selection]' : selection.to_string(),
	      'code_application[start_word_index]' : word_index(selection.start_word),
	      'code_application[end_word_index]' : word_index(selection.end_word),
	      'code_application[paragraph_index]' : selection.paragraph_index() };
	}
	
	$('code_application_form_cover').clonePosition($('new_code_application')).show();
	
	new Ajax.Request('/code_applications/local_create_by_id', {
	    parameters : params,
	    onComplete : function(r) {resize_code_list();default_text("code_name", "Code");},
	    onFailure  : function(request) {
			alert("Saturate seems to be having some problems. Please try again in a few minutes.");
		}
	  });
	
}

var current_container = null;

// asynchronously get a list of apps for this given code
function showInlineCodeApps(category_id, code_id, link) {
  var container = codeAppsContainer(category_id, code_id);
  if (container.visible()) {
    hideInlineCodeApps(container);
    
  } else {
    new Ajax.Updater(container, '/code_applications', 
      {
        onComplete:function(transport) {
          Effect.Appear('background-cover', {queue:'end', to:0.6, duration:0.25});
          Effect.Appear(container, {duration:0.25, queue:'end'});
          current_container = container;
        },
        asynchronous:true, 
        evalScripts:true, 
        method:'get', 
        parameters:{code_id:code_id,category_id:category_id}
      }
    );
  }
}

function hideInlineCodeApps(container) {
  if (!container) {
      container = current_container;
  } else {
      container = $(container);
  }
  
  if (container && container.visible()) {
    Effect.Fade(container, {duration:0.25, queue:'end'});
    Effect.Fade('background-cover', {queue:'end', duraction:0.25});
    current_container = null;
  }
}

function codeAppsContainer(category_id, code_id) {
  if (!category_id) category_id = '';
  return $('apps_wrapper_' + category_id + '_' + code_id);
}

// move to the next code application (possibly wrapping back to the start)
function showNextCodeApp(container) {
  // container = $(container);
  // 
  // if (!container.visible()) {
  //   Effect.SlideDown(container, {duration:0.25, queue:'end'});
  // }
    // 
    // var parent = container.down('.code_applications_wrapper');
    // 
    // if (parent.childElements().size() == 0) {
    //   container.hide();
    //   return;
    // }
    // 
    // var current = null;
    // var next = null;
    // 
    // parent.childElements().each(function (app_container) {
    //   if (app_container.visible())
    //     current = app_container;
    // });
    // 
    // // if there is a currently visible element ...
    // if (current) {
    //   if (current.next()) { // grab next sibling (if there is one)
    //     next = current.next();
    //   }
    // }
    // 
    // if (!next) { // otherwise go (back) to beginning
    //   next = parent.down();
    // }
    // 
    // if (current) Effect.Fade(current, {duration:0.25, queue:'end'});
    // if (next)    Effect.Appear(next, {duration:0.25, queue:'end'});
}

function resize_code_list() {
    var div = $('apply_code_by_id');
    var wrapper = $('new_code_application_wrapper');
    
    if (wrapper && wrapper.visible()) {
        var div_top = div.viewportOffset().top;
        var scroll_top = document.viewport.getScrollOffsets().top;
        var offset = div_top + scroll_top;
        var height = document.viewport.getHeight()-offset;
        div.setStyle({maxHeight:height+'px'});
        console.log("setting height to " + height + "px");
    }    
}

Event.observe(window, 'load', function(event) {
    Event.observe(window, "resize", function() {
        resize_code_list();
    });
    resize_code_list();
});