Array.prototype.unique =
  function() {
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++) {
      for(var j=i+1; j<l; j++) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.push(this[i]);
    }
    return a;
  };
  
Array.prototype.diff =
  function() {
    var a1 = this;
    var a = a2 = null;
    var n = 0;
    while(n < arguments.length) {
      a = [];
      a2 = arguments[n];
      var l = a1.length;
      var l2 = a2.length;
      var diff = true;
      for(var i=0; i<l; i++) {
        for(var j=0; j<l2; j++) {
          if (a1[i] === a2[j]) {
            diff = false;
            break;
          }
        }
        diff ? a.push(a1[i]) : diff = true;
      }
      a1 = a;
      n++;
    }
    return a.unique();
  };


function updateMyTextures (TextureField) {
	var myt = document.getElementById("backgrounds"+TextureField);
	var i = document.getElementById(TextureField+"hidden");
	if (i.contentDocument) { 
		var d = i.contentDocument;
	} else if (i.contentWindow) {
		var d = i.contentWindow.document;
	} else {
		var d = window.frames[TextureField+"hidden"].document;
	}
	if (d.body.innerHTML == "") { return true; }
	var texture_dict = eval( "(" + d.body.innerHTML + ")" );
	var new_cookie_texture_list = texture_dict["cookie"];
	var new_folder_texture_list = texture_dict["folder"];
	try { new_cookie_texture_list = new_cookie_texture_list.reverse(); } catch (e) {}
	
	// Make list of all texture filenames in updated list, compare to old list of textures
	// based on TexturePaths indices to figure out which texture, if any, was just added
	// so we can set the select field to that option, or select the texture after the one
	// that was deleted, as the case may be.
	var new_filename_list = []
	for (i=0; i<new_cookie_texture_list.length; i++) {  
		new_filename_list.push(new_cookie_texture_list[i][1]); 
	}
	for (i=0; i<new_folder_texture_list.length; i++) {
		new_filename_list.push(new_folder_texture_list[i]["filename"]); 
	}
	var old_filename_list = [];
	for (i=0; i< myt.options.length; i++) {
		old_filename_list.push(myt.options[i].value);
	}
	var added_list = new_filename_list.diff(old_filename_list);
	var deleted_list = old_filename_list.diff(new_filename_list);
	var selected_texture = "";
	if (added_list.length > 0) { 
		selected_texture = added_list[0]; 
	} else if (deleted_list.length > 0) { 
		deleted_texture = deleted_list[0]; 
		dt_idx = old_filename_list.indexOf(deleted_texture);
		selected_texture = new_filename_list[dt_idx];
	}  else {
		return;
	}

	myt.innerHTML = "";
	var newOptGroup = document.createElement('optgroup');
	newOptGroup.label = "Recently Used:";
	myt.appendChild(newOptGroup);	
	if (new_cookie_texture_list.length > 0) {
		for (i=0; i<new_cookie_texture_list.length; i++) {
			filepath = new_cookie_texture_list[i][0];
			filename = new_cookie_texture_list[i][1];
			resultid = new_cookie_texture_list[i][2];
			var newOp = document.createElement('option');
			TexturePaths[filename] = filepath;
			TextureOrigins[filename] = "archive";
			newOp.id = filename;
			newOp.value = filename;
			newOp.innerHTML = filename;
			newOptGroup.appendChild(newOp);
			if (resultid) {
				newOp.title = "result";
				TextureResultIDs[filename] = resultid;
			} else {
				newOp.title = "archive";
			}
			
			if (filename == selected_texture) { newOp.selected = true; }
		}		
	} else {
		var newOp = document.createElement('option');
		newOp.value = "";
		newOp.innerHTML = "None";
		newOptGroup.appendChild(newOp);			
	}
	
	var newOptGroup = document.createElement('optgroup');
	newOptGroup.label = "In Your Folder:";
	myt.appendChild(newOptGroup);	
	if (new_folder_texture_list.length > 0) {	
		for (i=0; i<new_folder_texture_list.length; i++) {
			filepath = new_folder_texture_list[i]["path"];
			filename = new_folder_texture_list[i]["filename"];
			longname = new_folder_texture_list[i]["longname"];
			id = new_folder_texture_list[i]["id"];
			resultid = new_folder_texture_list[i]["resultid"];
			origin = new_folder_texture_list[i]["origin"];
			var newOp = document.createElement('option');
			TexturePaths[filename] = filepath;
			TextureOrigins[filename] = origin;
			TextureRSIds[filename] = id;
			TextureResultIDs[filename] = resultid;
			newOp.id = filename;
			newOp.value = filename;
			newOp.innerHTML = longname || (id + " - " + filename);
			newOptGroup.appendChild(newOp);
			if (filename == selected_texture) { newOp.selected = true; }
		}
	} else {
		var newOp = document.createElement('option');
		newOp.value = "";
		newOp.innerHTML = "None";
		newOptGroup.appendChild(newOp);
	}
	updateimg(TextureField);
	return true;
}

function togglePreviewTile (TextureField, toggleCheckbox) {
	var c = document.getElementById('prevtile'+TextureField);
	if (toggleCheckbox) {
		if (c.checked == true) {
			c.checked = false;
		} else {
			c.checked = true;
		}
	}
	var p = document.getElementById('previm'+TextureField);
	if (c.checked) {
		p.style.backgroundRepeat = "repeat";
	} else {
		p.style.backgroundRepeat = "no-repeat";
	}
}

function updateimg (TextureField) {
	if ( document.getElementById("backgrounds"+TextureField) && document.getElementById("backgrounds"+TextureField).value && document.getElementById(document.getElementById("backgrounds"+TextureField).value) )  {
		var selectedOption = document.getElementById(document.getElementById("backgrounds"+TextureField).value);
		var txfilename = selectedOption.value;
		var txorigin = TextureOrigins[txfilename];
		var txrsid = TextureRSIds[txfilename];
		var txpath = TexturePaths[txfilename];
		document.getElementById(TextureField+"field").value = txfilename;
		var url = MEDIA_URL + txpath + txfilename;
		document.getElementById("previm"+TextureField).style.backgroundImage = "url(" + url + ")";
		document.getElementById("previmlink"+TextureField).href = url;
		if (txorigin == 'archive') {
			document.getElementById(TextureField+"custlink").href = "/archive/textures/view/source=/id=/dir="+ txpath +",fn="+ txfilename +"/";
			document.getElementById(TextureField+"dellink").style.visibility = "visible"; 
		} else if (txorigin == "result") {
			document.getElementById(TextureField+"custlink").href = "/generate/generator/?parentresultid="+TextureResultIDs[txfilename];
			document.getElementById(TextureField+"dellink").style.visibility = "visible";
		} else if (txorigin == "folders-archive") {
			document.getElementById(TextureField+"custlink").href = "/archive/textures/view/source=folders/id="+txrsid+"/";
			document.getElementById(TextureField+"dellink").style.visibility = "hidden";
		} else if (txorigin == "folders-generator") {
			document.getElementById(TextureField+"custlink").href = "/generate/generator/?parentresultid="+TextureResultIDs[txfilename]+"&resultsavedid="+txrsid;
			document.getElementById(TextureField+"dellink").style.visibility = "hidden";
		}
		document.getElementById(TextureField+"dellink").onclick = function() { sendReq("/generate/removefrom/?texture="+document.getElementById(TextureField+"field").value, window["reqBGList"+TextureField] ); return false; };
	}
}
