/** This nice bit of software is used courtesy of the webtoolkit group; the file 
    was renamed to be more informative. **/

/**
*
*  AJAX IFRAME METHOD (AIM)
*  http://www.webtoolkit.info/
*
**/

var Ajax_Status_Updater;
 
AIM = {
 
	frame : function(c) {
 
		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);
 
		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}
 
		return n;
	},
 
	form : function(f, name) {
		f.setAttribute('target', name);
	},
 
	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},
 
	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}
 
		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
 
}

function startAjaxUpload(upload_id) {
  var status       = $(upload_id + '_status');
  var upload_form  = $(upload_id + '_form');
  upload_form.hide();
  var cancel_script = 'Controller.cancel_upload("'+upload_id+'_status","'+upload_id+'");'
  
  status.update("<image src='/gbrowse2/images/spinner.gif' />");
  status.insert(new Element('span').update('<b>Uploading...</b>'));
  status.insert(new Element('a',{   href: 'javascript:void(0)',
                                 onClick: cancel_script
                                }
		            ).update(' Cancel'));

  if (Ajax_Status_Updater == null)
      Ajax_Status_Updater = new Hash();
  var updater = new Ajax.PeriodicalUpdater(
       {success: status.down('span')},
       '#',
       {parameters: {   action: 'upload_status',
                        upload_id: upload_id
                    },
        onSuccess: function(transport) {
	   if (transport.responseText.match(/complete/)) {
	   	    Ajax_Status_Updater.get(upload_id).stop();
	            Controller.update_sections(new Array(userdata_table_id,
							 userimport_table_id,
							 track_listing_id));
	    }
        }
       });
  Ajax_Status_Updater.set(upload_id,updater);
  return true;
}

function completeAjaxUpload(response,upload_id,field_type) {

  var r;

  try {
    r = response.evalJSON(true);
  } catch(e) { 
               r = {success:     false, 
                    uploadName: 'Uploaded file',
                    error_msg:   'The server returned an error during upload'}}

    if (r.success) {

        var fields = field_type == 'upload' ? new Array(track_listing_id,userdata_table_id)
                    :field_type == 'edit'   ? new Array(track_listing_id,userdata_table_id,userimport_table_id)
                                            : new Array(track_listing_id,userimport_table_id);

	if (r.tracks != null && r.tracks.length > 0) {
  	  Controller.add_tracks(r.tracks,
			      function() { 
				  Controller.update_sections(
                                      fields,
				      '',false,false,
                                      function() {
                                          var updater = Ajax_Status_Updater.get(upload_id);
				          if (updater != null)
					  	updater.stop();
                                          $(upload_id).remove();
                                        }
				     )}
				);
	} else {
            var updater = Ajax_Status_Updater.get(upload_id);
            if (updater != null) updater.stop();
            $(upload_id).remove();
        }
    } else {
        if (Ajax_Status_Updater.get(upload_id) !=null)
             Ajax_Status_Updater.get(upload_id).stop();
	Ajax_Status_Updater.unset(upload_id);
        var status = $(upload_id + '_status');
	var uploadName = r.uploadName;
    	var msg =  '<div style="background-color:pink">';
	msg    +=  '<b>'+uploadName+'</b>: '+r.error_msg+'<br>';
	msg    +=  '<a href="javascript:void(0)" onClick="\$\(\''+upload_id+'\').remove()">[Remove Message]</a>';
	msg    +=  '</div>';
    	status.update(msg);
    }
    return true;
}

// NOTE: these functions should be migrated to Controller

function deleteUploadTrack (fileName) {
   var indicator = fileName + "_stat";
   $(indicator).innerHTML = "<image src='/gbrowse2/images/spinner.gif' />";
   new Ajax.Request(document.URL, {
        method:      'post',
        parameters:  {action: 'delete_upload',
	              file:  fileName
		      },
        onSuccess:   function (transport) {
	       var tracks = transport.responseJSON.tracks;
	       if (tracks != null)
		   tracks.each(function(tid) { Controller.delete_track(tid) });
	       Controller.update_sections(new Array(userdata_table_id,userimport_table_id,track_listing_id));
	    }
        }
   );
}

function editUploadData (fileName,sourceFile) {
   editUpload(fileName,sourceFile);
}

function editUploadConf (fileName) {
    editUpload(fileName,'conf');
}

function editUpload (fileName,sourceFile) {
    var editDiv = fileName + "_editfield";
    var editID  = 'edit_' + Math.floor(Math.random() * 99999);
    $(editDiv).innerHTML = '<p><b>Editing '+sourceFile+'</b></p>'
             		  +'<textarea id="'+editID+'" cols="120" rows="20" wrap="off">'
			  + 'fetching...'
                          +'</textarea>'
		          +'<p>'
		          +'<a href="javascript:void(0)" onClick="'
                          +'$(\''+editDiv+'\').innerHTML=\'\'">[Cancel]</a>'
			  +'<button onClick="Controller.uploadUserTrackSource(\''+ editID     +'\','
                                                                            +'\''+ fileName   +'\','
                                                                            +'\''+ sourceFile +'\','
								            +'\''+ editDiv    +'\')">Submit</button>'
			  +'</p>'
                       ;
    Controller.downloadUserTrackSource(editID,fileName,sourceFile);
}

function addAnUploadField(after_element,action,upload_prompt,remove_prompt,field_type,help_link) {

    if (field_type == null) field_type='upload';

    var upload_tag  = 'upload_' + Math.floor(Math.random() * 99999);

    var script      = 'return AIM.submit(this,{onStart:  function() {';
    script         +=                                      'startAjaxUpload(\''+upload_tag+'\')';
    script         +=                                    '},';
    script         +=                         'onComplete: function(response) {'
    script         +=                                      'completeAjaxUpload(response,\''+upload_tag+'\',\''+field_type+'\')';
    script         +=                         '}})';

    var html = '<div id=UPLOAD_TAG>'
                + '<form name=ajax_upload'
                +        ' id="UPLOAD_TAG_form"'
                +        ' onSubmit="SCRIPT"'
                +        '   action="ACTION"'
                +        '  enctype="multipart/form-data"'
                +        '  method="POST">'
                +    '<p>'
                +    '<a href="HELP_LINK" target="_blank"><i>[Help with the file format]</i></a>'
                + '<br /><b>UPLOAD_PROMPT</b><br />';

   if (field_type=='upload') {
       html += '<input type="hidden" name="action" value="upload_file"  />'
              +'<input type="file"   name="file"      id="upload_field" />';
   }
   else if (field_type=='edit') {
       html += '<input type="hidden" name="action" value="upload_file"  />'
             + '<input type="hidden" name="name"   value="UPLOAD_TAG"   />'
             + '<textarea name="data" id="edit_field" rows="20" cols="100" wrap="off"></textarea>'
             + '<br />';
   }
   else {
       html += '<input type="hidden" name="action" value="import_track" />'
             + '<input type="text"   name="url" id="import_field" size="50" />';
   }

   html += '<input type="submit" name="submit"    value="Upload" />'
         + '<input type="hidden"  name="upload_id" value="UPLOAD_TAG" />'
         + '&nbsp;<a href="javascript:void(0)" onClick="Element.extend(this);this.up(\'div\').remove()">'
         + 'REMOVE_PROMPT</a>';

   html  += '</p></form><div id="UPLOAD_TAG_status"></div></div>';

   // do string subsitutions
   html = html.gsub(/SCRIPT/,script);
   html = html.gsub(/ACTION/,action);
   html = html.gsub(/UPLOAD_TAG/,upload_tag);
   html = html.gsub(/UPLOAD_PROMPT/,upload_prompt);
   html = html.gsub(/REMOVE_PROMPT/,remove_prompt);
   html = html.gsub(/HELP_LINK/,help_link);

   var el = $(after_element);
   el.insert({before:html});
}