// Set up the task list onclick handler
addEvent(window,'load',setUpTasklistTable);

function Disable(formid) {
   document.formid.buSubmit.disabled = true;
   document.formid.submit();
}

function showstuff(boxid, type){
   if (!type) type = 'block';
   $(boxid).style.display= type;
   $(boxid).style.visibility='visible';
}

function hidestuff(boxid){
   $(boxid).style.display='none';
}

function hidestuff_e(e, boxid){
   e = e || window.event;
   if (Event.element(e).getAttribute('id') !== 'lastsearchlink' ||
	(Event.element(e).getAttribute('id') === 'lastsearchlink' && $('lastsearchlink').className == 'inactive')) {
	if (!Position.within($(boxid), Event.pointerX(e), Event.pointerY(e))) {
	   //Event.stop(e);
	   if (boxid === 'mysearches') {
		activelink('lastsearchlink');
	   }
	   $(boxid).style.visibility='hidden';
	   $(boxid).style.display='none';
	   document.onmouseup = null;
   	}
   }
}

function showhidestuff(boxid) {
   if (boxid === 'mysearches') {
	activelink('lastsearchlink');
   }
   switch ($(boxid).style.visibility) {
      case '':
	$(boxid).style.visibility='visible';
	break;
      case 'hidden':
	$(boxid).style.visibility='visible';
	break;
      case 'visible':
	$(boxid).style.visibility='hidden';
	break;
   }
   switch ($(boxid).style.display) {
      case '':
	$(boxid).style.display='block';
	document.onmouseup = function(e) { hidestuff_e(e, boxid); };
	break;
      case 'none':
	$(boxid).style.display='block';
	document.onmouseup = function(e) { hidestuff_e(e, boxid); };
	break;
      case 'block':
	$(boxid).style.display='none';
	document.onmouseup = null;
	break;
      case 'inline':
	$(boxid).style.display='none';
	document.onmouseup = null;
	break;
   }
}

function setUpTasklistTable() {
  if (!$('tasklist_table')) {
    // No tasklist on the page
    return false;
  }
  addEvent($('tasklist_table'), 'click',tasklistTableClick);
  addEvent($('tasklist_table'), 'dblclick',tasklistTableClick);
  return false;
}

// doube click vars
var dcTime = 250;
var dcDelay = 100;
var dcAt = 0;
var savEvent = null;
var savEvtTime = 0;
var savTO = null;
 
function hadDoubleClick() {
	var d = new Date();
	var now = d.getTime();
	if ((now - dcAt) < dcDelay) {
		return true;
	}
	return false;
}

function doDoubleClick(which, src) {
	var d = new Date();
	dcAt = d.getTime();
	if (savTO != null) {
		clearTimeout( savTO ); // Clear pending Click  
		savTO = null;
	}
	var taskid = ($('tasklist_table')) ? src.parentNode.id.substr(4) : $('task_id').title;
	new Ajax.Updater( { success: src }, $('baseurl').href + 'javascript/callbacks/editfield.php',
					  { evalScripts: true, parameters: {classname : src.className, task_id: taskid} });
}
 
  
function doClick(src, alt) {
	// preempt if DC occurred after original click.
	if (savEvtTime - dcAt <= 0) {
	 return false;
	}
	if ($('tasklist_table')) {
	  if (src.hasChildNodes()) {
		var checkBoxes = src.getElementsByTagName('input');
		if (checkBoxes.length > 0) {
		  // User clicked the cell where the task select checkbox is
		  if (checkBoxes[0].checked) {
			checkBoxes[0].checked = false;
		  } else {
			checkBoxes[0].checked = true;
		  }
		  return;
		}
	  }
	  var row = src.parentNode;
	  var aElements = row.getElementsByTagName('A');
	  // If both the task id and the task summary columns are non-visible
	  // just use the good old way to get to the task
	  var url = (aElements.length > 0) ? aElements[0].href : '?do=details&task_id=' + row.id.substr(4);
	  if (alt) {
		url += (url.include('?') ? '&' : '?') + 'edit=1';
	  }
	  window.location = url;
	}
}
 
function tasklistTableClick(e) {
	var src = eventGetSrc(e);
	if (src.nodeName == "DIV" || src.nodeName == "SPAN") {
      while (src.nodeName != 'TD' && src.parentNode) {
        src = src.parentNode;
	  }
	}

	if (src.nodeName != 'TD' || Element.hasClassName(src, 'caret') || Element.hasClassName(src, 'expandedinfo')) {
		return;
	}
	switch (e.type) {
	 case "click": 
	   // If we've just had a doubleclick then ignore it
	   if (hadDoubleClick()) return false;
		 
	   // Otherwise set timer to act.  It may be preempted by a doubleclick.
	   savEvent = src;
	   d = new Date();
	   savEvtTime = d.getTime();
	   savTO = setTimeout("doClick(savEvent, " + ((e.altKey) ? 1 : 0) + ")", dcTime);
	   break;
	 case "dblclick":
	   doDoubleClick(e.type, src);
	   break;
	 default:
	}
	return;
}

function eventGetSrc(e) {
  if (e.target) {
    return e.target;
  } else if (window.event) {
    return window.event.srcElement;
  } else {
    return false;
  }
  return false;
}

function ToggleSelected(id) {
  var inputs = $(id).getElementsByTagName('input');
  for (var i = 0; i < inputs.length; i++) {
    if(inputs[i].type == 'checkbox'){
      inputs[i].checked = !(inputs[i].checked);
    }
  }
}

function addUploadFields(id) {
  if (!id) {
    id = 'uploadfilebox';
  }
  var el = $(id);
  var span = el.getElementsByTagName('span')[0];
  if ('none' == span.style.display) {
    // Show the file upload box
    span.style.display = 'inline';
    // Switch the buttons
    $(id + '_attachafile').style.display = 'none';
    $(id + '_attachanotherfile').style.display = 'inline';

  } else {
    // Copy the first file upload box and clear it's value
    var newBox = span.cloneNode(true);
    newBox.getElementsByTagName('input')[0].value = '';
    el.appendChild(newBox);
  }
}

function checkok(url, message, form) {

    var myAjax = new Ajax.Request(url, {method: 'get', onComplete:function(originalRequest)
	{
        if(originalRequest.responseText == 'ok' || confirm(message)) {
            $(form).submit();
        }
	}});
    return false;
}

function removeUploadField(element, id) {
  if (!id) {
    id = 'uploadfilebox';
  }
  var el = $(id);
  var span = el.getElementsByTagName('span');
  if (1 == span.length) {
    // Clear and hide the box
    span[0].style.display='none';
    span[0].getElementsByTagName('input')[0].value = '';
    // Switch the buttons
    $(id + '_attachafile').style.display = 'inline';
    $(id + '_attachanotherfile').style.display = 'none';
  } else {
    el.removeChild(element.parentNode);
  }
}

function updateDualSelectValue(id) {
    var rt  = $('r'+id);
    var val = $('v'+id);
    val.value = '';

    var i;
    for (i=0; i < rt.options.length; i++) {
        val.value += (i > 0 ? ' ' : '') + rt.options[i].value;
    }
}

function remove_0val(id) {
    el = $(id);
    for (i = 0; i < el.options.length; i++) {
        if (el.options[i].value == '0') {
	    el.removeChild(el.options[i]);
        }
    }
}
function dualSelect(from, to, id) {
    if (typeof(from) == 'string') {
	from = $(from+id);
    }
    if (typeof(to) == 'string') {
        var to_el = $(to+id);
	// if (!to_el) alert("no element with id '" + (to+id) + "'");
	to = to_el;
    }
    var i;
    var len = from.options.length;
    for(i=0;i<len;++i) {
	if (!from.options[i].selected) continue;
	if (to && to.options)
	    to.appendChild(from.options[i]);
	else
	    from.removeChild(from.options[i]);
	// make the option that is slid down selected (if any)
	if (len > 1)
	    from.options[i == len - 1 ? len - 2 : i].selected = true;
	break;
    }
    updateDualSelectValue(id);
}

function selectMove(id, step) {
    var sel = $('r'+id);
    var i = 0;
    while (i < sel.options.length) {
        if (sel.options[i].selected) {
            if (i+step < 0 || i+step >= sel.options.length) {
                return false;
            }
	    if (i + step == sel.options.length - 1)
		sel.appendChild(sel.options[i]);
	    else if (step < 0)
		sel.insertBefore(sel.options[i], sel.options[i+step]);
	    else
		sel.insertBefore(sel.options[i], sel.options[i+step+1]);
            updateDualSelectValue(id);
            return false;
        }
        i++;
    }
    return false;
}

var Cookie = {
  getVar: function(name) {
    var cookie = document.cookie;
    if (cookie.length > 0) {
      cookie += ';';
    }
    re = new RegExp(name + '\=(.*?);' );
    if (cookie.match(re)) {
      return RegExp.$1;
    } else {
      return '';
    }
  },
  setVar: function(name,value,expire,path) {
    document.cookie = name + '=' + value;
  },
  removeVar: function(name) {
    var date = new Date(12);
    document.cookie = name + '=;expires=' + date.toUTCString();
  }
};

function setUpSearchBox() {
  if ($('advancedsearch')) {
    var state = Cookie.getVar('advancedsearch');
    if ('1' == state) {
      var showState = $('advancedsearchstate');
      showState.replaceChild(document.createTextNode('+'),showState.firstChild);
      $('sc2').style.display = 'block';
    }
  }
}

function toggleSearchBox(themeurl) {
  var state = Cookie.getVar('advancedsearch');
  if ('1' == state) {
      $('advancedsearchstateimg').src = themeurl + 'edit_add.png';
      hidestuff('sc2');
      Cookie.setVar('advancedsearch','0');
  } else {
      $('advancedsearchstateimg').src = themeurl + 'edit_remove.png';
      showstuff('sc2');
      Cookie.setVar('advancedsearch','1');
  }
}

function deletesearch(id) {
    var img = $('rs' + id).getElementsByTagName('img')[0].src = $('baseurl').href + 'themes/Bluey/ajax_load.gif';
    url = $('baseurl').href + 'javascript/callbacks/deletesearches.php';
    var myAjax = new Ajax.Request(url, {method: 'get', parameters: 'id=' + id,
                     onSuccess:function()
                     {
                        var oNodeToRemove = $('rs' + id);
                        oNodeToRemove.parentNode.removeChild(oNodeToRemove);
                        var table = $('mysearchestable');
                        if(table.rows.length > 0) {
                            table.getElementsByTagName('tr')[table.rows.length-1].style.borderBottom = '0';
                        } else {
                            showstuff('nosearches');
                        }
                     }
                });
}

function savesearch(query, savetext) {
    url = $('baseurl').href + 'javascript/callbacks/savesearches.php?' + query + '&search_name=' + encodeURIComponent($('save_search').value);
    if($('save_search').value != '') {
        var old_text = $('lblsaveas').firstChild.nodeValue;
        $('lblsaveas').firstChild.nodeValue = savetext;
        var myAjax = new Ajax.Request(url, {method: 'get',
                     onComplete:function()
                     {
                        $('lblsaveas').firstChild.nodeValue=old_text;
                        var myAjax2 = new Ajax.Updater('mysearches', $('baseurl').href + 'javascript/callbacks/getsearches.php', { method: 'get'});
                     }
                     });
    }
}

function activelink(id) {
    if($(id).className == 'active') {
        $(id).className = 'inactive';
    } else {
        $(id).className = 'active';
    }
}

var useAltForKeyboardNavigation = false;  // Set this to true if you don't want to kill Firefox's find as you type

function showPreview(textfield, field) {
    var preview = $(field);

    var src = $('baseurl').href + 'themes/Bluey/ajax_load.gif';
    preview.update('<img src="'+ src +'" alt="Loading" width="16" height="16" />');

    var text = $(textfield).value;
    var url = $('baseurl').href + 'javascript/callbacks/getpreview.php';
    var myAjax = new Ajax.Updater(field, url, {parameters: {'text':  text, 'plugins[]': ($(textfield + '_syntax_plugins[]') ? $(textfield + '_syntax_plugins[]').getValue() : null)}, method: 'post'});

    if (text == '') {
        hidestuff(field);
    } else {
        showstuff(field);
    }
}

function checkname(value) {
    new Ajax.Request('javascript/callbacks/searchnames.php?name='+value, {onSuccess: function(t){ allow(t.responseText); } });
}

function updateTimezone(current) {
    myDate = new Date();
    timezone = -myDate.getTimezoneOffset()*60;
    if (current != timezone) {
        new Ajax.Request('javascript/callbacks/updatetimezone.php?timezone='+timezone);
    }
}

function allow(booler){
    if(booler.indexOf('false') > -1) {
        $('username').style.color ='red';
        $('buSubmit').style.visibility = 'hidden';
        $('errormessage').innerHTML = booler.substring(6,booler.length);
    }
    else {
        $('username').style.color ='green';
        $('buSubmit').style.visibility = 'visible';
        $('errormessage').innerHTML = '';
    }
}

function getHistory(task_id, baseurl, field, details) {
    var url = baseurl + 'javascript/callbacks/gethistory.php?task_id=' + task_id;
    if (details) {
        url += '&details=' + details;
    }
    var myAjax = new Ajax.Updater(field, url, { method: 'get'});
}

/*********  Permissions popup  ***********/

function createClosure(obj, method) {
    return (function() { obj[method](); });
}

function Perms(id) {
    this.div = $(id);
}

Perms.prototype.timeout = null;
Perms.prototype.div     = null;

Perms.prototype.clearTimeout = function() {
    if (this.timeout) {
        clearTimeout(this.timeout);
        this.timeout = null;
    }
}

Perms.prototype.do_later = function(action) {
    this.clearTimeout();
    closure = createClosure(this, action);
    this.timeout = setTimeout(closure, 400);
}

Perms.prototype.show = function() {
    this.clearTimeout();
    this.div.style.display = 'block';
    this.div.style.visibility = 'visible';
}

Perms.prototype.hide = function() {
    this.clearTimeout();
    this.div.style.display = 'none';
}

// Replaces the currently selected text with the passed text.
function replaceText(text, textarea) {
	textarea = document.getElementById( textarea );
	// Attempt to create a text range (IE).
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
	{
		var caretPos = textarea.caretPos;

		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
		caretPos.select();
	}
	// Mozilla text range replace.
	else if (typeof(textarea.selectionStart) != "undefined")
	{
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text + end;

		if (textarea.setSelectionRange)
		{
			textarea.focus();
			textarea.setSelectionRange(begin.length + text.length, begin.length + text.length);
		}
		textarea.scrollTop = scrollPos;
	}
    else if (document.selection) {
        textarea.focus();
        sel=document.selection.createRange();
        sel.text=text;
    }
	// Just put it on the end.
	else
	{
		textarea.value += text;
		textarea.focus(textarea.value.length - 1);
	}
}


// Surrounds the selected text with text1 and text2.
function surroundText(text1, text2, textarea)
{
	textarea = document.getElementById( textarea );
	// Can a text range be created?
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
	{
		var caretPos = textarea.caretPos;

		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text1 + caretPos.text + text2 + ' ' : text1 + caretPos.text + text2;
		caretPos.select();
	}
	// Mozilla text range wrap.
	else if (typeof(textarea.selectionStart) != "undefined")
	{
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var selection = textarea.value.substr(textarea.selectionStart, textarea.selectionEnd - textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var newCursorPos = textarea.selectionStart;
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text1 + selection + text2 + end;

		if (textarea.setSelectionRange)
		{
			if (selection.length == 0)
				textarea.setSelectionRange(newCursorPos + text1.length, newCursorPos + text1.length);
			else
				textarea.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length);
			textarea.focus();
		}
		textarea.scrollTop = scrollPos;
	}
    else if(document.selection) {
        textarea.focus();
        var sampleText = 'TEXT';
        var currentRange = document.selection.createRange();
        var selection = currentRange.text;
        var replaced = true;
        if(!selection) {
               replaced=false;
               selection = sampleText;
        }
        if(selection.charAt(selection.length-1)==" "){
               selection=selection.substring(0,selection.length-1);
               currentRange.text = text1 + selection + text2 + " ";
        }
        else
        {
               currentRange.text = text1 + selection + text2;
        }
        if(!replaced){
               // If putting in sample text (i.e. insert) adjust range start and end
               currentRange.moveStart('character',-text.length-text2.length);
               currentRange.moveEnd('character',-text2.length);
        }
        currentRange.select();
    }
	// Just put them on the end, then.
	else
	{
		textarea.value += text1 + text2;
		textarea.focus(textarea.value.length - 1);
	}
}

function stopBubble(e) {
	if (!e) { e = window.event; }
	e.cancelBubble = true;
	if (e.stopPropagation) { e.stopPropagation(); }
}
function findPos(obj) {
    var curleft = curtop = 0;
    if (obj.offsetParent) {
        curleft = obj.offsetLeft
        curtop = obj.offsetTop
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
    }
    return [curleft,curtop];
}

var newwindow = '';
function closeme() { if (!newwindow.closed) newwindow.close() }
function userspopup(url, targetfieldid) {
    if (!newwindow.closed && newwindow.location) {
        newwindow.location.href = url;
    }
    else {
        var boxl = findPos($(targetfieldid))[0];
        var boxr = boxl + $(targetfieldid).offsetWidth;
        var vpdims = window.document.viewport.getDimensions();
        var scrm = Math.floor(vpdims.width/2);
        var dif1 = boxl-scrm;
        var dif2 = boxr-scrm;
        if ((dif1<=0 && dif2<=0) || (Math.abs(dif1) < Math.abs(dif2))) {
          // box is completely on left half of screen or more left than right
          var winleft = boxr+30;
          var winwidth = vpdims.width-winleft-30;
          if (winwidth < 500) winleft -= (500-winwidth);
        } else {
          // box is completely on right half of screen or more right than left
          var winleft = 30;
          var winwidth = boxl-30;
          if (winwidth < 500) winwidth += (500-winwidth);
        }
        newwindow=window.open(url,'name','height=' + Math.min(vpdims.height, 650) + ',width=550,left=' + winleft);
        if (!newwindow.opener) newwindow.opener = self;
        newwindow.name = targetfieldid;
    }
    if (window.focus) { newwindow.focus(); }
    this.onfocus  = closeme;
    return false;
}

function savequickedit(task_id, field_name)
{
    realfield = field_name;
    if (field_name.substring(0, 2) == 'qe') {
        realfield = field_name.substring(2);
    }
    new Ajax.Request($('baseurl').href + 'javascript/callbacks/savequickedit.php', {
      parameters: {task_id: task_id, field: realfield, value: $('task' + task_id + '_' + field_name).value},
      onSuccess: function(t) {
        src = $('task' + task_id + '_' + field_name).parentNode;
        while (src.nodeName != 'TD' && src.parentNode) {
          src = src.parentNode;
        }
        src.update(t.responseText);
      }
    });
    return false;
}

