// Some more common functions are still in main.js

// requires: event-listeners.js

function KeyPressInput(e) {
  keycode = GetKeyCode(e);
  if(keycode==27)
    this.revert(this); 
  if(keycode==13)
    SubmitRow(this); 
}

function RevertText(elem) {
  var next = elem.nextSibling;
  if(typeof next != 'object')
    return false;
  next.style.display = '';
  next.selectedIndex = 0;
  elem.parentNode.removeChild(elem);  
}

function ChangeToText(elem, change) {
  if(!change)
    return false;
    
  var input = document.createElement('input');
  input.type="text";
  input.name=elem.name+'_text';
  elem.parentNode.insertBefore(input, elem);
  elem.style.display = 'none';
  input.revert = RevertText;
  addElementEvent('keypress', KeyPressInput, input);
  input.focus();
}

function SpanToText(elem) {
  var input = document.createElement('input');
  input.type="text";
  input.name=elem.getAttribute('name')+'_text';
  input.className='Small';
  if(elem.className) {
    input.className=elem.className;
  }
  input.value = elem.innerHTML;
  elem.parentNode.insertBefore(input, elem);
  elem.style.display = 'none';
  input.revert = RevertText;
  addElementEvent('keypress', KeyPressInput, input);
  input.focus();
  input.select();
}

function GetRowNumber(tr) {
  tbody = GetAncestor(tr, 'tbody');
  c=0;
  for(var i in tbody.childNodes) {
    if(tr == tbody.childNodes[i])
      return c;
    if(typeof tbody.childNodes[i] == 'object' && tbody.childNodes[i].nodeName.toLowerCase() == 'tr')
      c++;    
  }
  return 0;
}

function GetNewFormData(elem, doaction, type) {
	var msgElem = arguments.length > 3 ? arguments[3] : false;
  var form = GetAncestor(elem, type);
  if(!form)
    return false;
  
  if(type=='form')
    form.onsubmit = function() { return false; }
  
  var data = new Object();
  data['form_action'] = doaction;
    
  inputs = form.getElementsByTagName('input');
  selects = form.getElementsByTagName('select');
  data['id'] = form.id;

  for(var i =0; i<inputs.length; i++) {
    if(inputs[i]) {
      if(inputs[i].name && typeof inputs[i] == 'object') {
        data[inputs[i].name] = getValue(inputs[i]);
      }
    }
  }
  for(var i =0; i<selects.length; i++) {
    if(selects[i]) {
      if(selects[i].name && typeof selects[i] == 'object') {
        data[selects[i].name] = getValue(selects[i]);
      }
    }
  }
  data['__AjaxMsgElem'] = msgElem;
  return data;
}

function SubmitRow(elem, doaction, ajaxclass, fnt) { // 5th param (opt) : revert
  var msgElem = arguments.length > 4 ? arguments[4] : false;
	if(msgElem)
		setValue(msgElem, 'Sending Data');
	var data = GetNewFormData(elem, doaction, 'tr', msgElem);
	data['row'] = GetRowNumber(GetAncestor(elem, 'tr'));
  if(JSON.stringify(LastFormData)!=JSON.stringify(data)) {
    LastFormData = data;
    sendAjaxMessage(ajaxclass, fnt, data);
  }
}

function SubmitForm(elem, doaction, ajaxclass, fnt) {
  var msgElem = arguments.length > 4 ? arguments[4] : false;
	if(msgElem)
		setValue(msgElem, 'Sending Data');
	var data = GetNewFormData(elem, doaction, 'form', msgElem);
  if(JSON.stringify(LastFormData)!=JSON.stringify(data)) {
    LastFormData = data;
    sendAjaxMessage(ajaxclass, fnt, data);
  }
  return false;
}
function SubmitFormDiff(elem, doaction, ajaxObject) {
  var msgElem = arguments.length > 4 ? arguments[4] : false;
	if(msgElem)
		setValue(msgElem, 'Sending Data');
	var data = GetNewFormData(elem, doaction, 'form', msgElem);
  if(JSON.stringify(LastFormData)!=JSON.stringify(data)) {
    formDiff = {'old':LastFormData,'new':data};
    LastFormData = data;
    ajaxObject.send(formDiff);
  }
  return false;
}

LastFormData = new Object();



function SubmitTable(elem, doaction, ajaxclass, fnt) {
  var msgElem = arguments.length > 4 ? arguments[4] : false;
	if(msgElem)
		setValue(msgElem, 'Sending Data');
	var data = GetNewFormData(elem, doaction, 'table', msgElem);
  if(JSON.stringify(LastFormData)!=JSON.stringify(data)) {
    LastFormData = data;
    sendAjaxMessage(ajaxclass, fnt, data);
  }
        
}

function GetFormData(elem) {
  var form = GetAncestor(elem, 'form');
  if(!form)
    return false;
    
  var data = new Object();
  
  inputs = form.getElementsByTagName('input');
  selects = form.getElementsByTagName('select');
  data['id'] = form.id;
  for(var i in inputs)
    if(inputs[i])
      if(inputs[i].name && typeof inputs[i] == 'object')
        data[inputs[i].name] = getValue(inputs[i]);
  for(var i in selects)
    if(selects[i])
      if(selects[i].name && typeof selects[i] == 'object')
        data[selects[i].name] = getValue(selects[i]);  
  
  return data;
}


function ClearRow(tr) {
  var tr = ID(tr);
  if(!tr)
    return false;
    
  
  inputs = tr.getElementsByTagName('input');
  selects = tr.getElementsByTagName('select');
  for(var i in inputs)
    if(inputs[i])
      if(inputs[i].name && typeof inputs[i] == 'object')
        setValue(inputs[i],'');
  for(var i in selects)
    if(selects[i])
      if(selects[i].name && typeof selects[i] == 'object')
        setValue(selects[i],0);
         
}


function UpdateFormValues(id, data) {
  var form = ID(id);
  if(!form)
    return false;
  
  inputs = form.getElementsByTagName('input');
  selects = form.getElementsByTagName('select');
  spans = form.getElementsByTagName('span');
  data['id'] = form.id;
  for(var i in inputs) 
    if(inputs[i]) {
      if(typeof inputs[i] == 'object')
        name = inputs[i].name
      if(data[name] || data[name]=='')
         setValue(inputs[i],data[name]);
      if(name.substring(name.length-5) == '_text') 
        RevertText(inputs[i]);
    }
  
  for(var i in selects)
    if(selects[i])
      if(typeof selects[i] == 'object') {
        name = selects[i].name
        if(data[name]) {
          name = selects[i].name;
          setValue(selects[i],data[name]);
        }else if(name.endsWith('hour')) {
          setValue(selects[i],DateTime.GetHour(data[(name.cutEnd('hour'))])); 
        } else if(name.endsWith('minute')) {
          setValue(selects[i],DateTime.GetMinute(data[(name.cutEnd('minute'))])); 
        } else if(name.endsWith('meridian')) {
          setValue(selects[i],DateTime.GetMeridian(data[(name.cutEnd('meridian'))])); 
        }  
      }
         
  for(var i in spans)
    if(spans[i])
      if(typeof spans[i] == 'object') {
        name = spans[i].getAttribute('name');
        setValue(spans[i],data[name]);
      }
}
function UpdateTableOptions(id, data) {
  var table = ID(id);
  if(!table)
    return false;
  
  selects = table.getElementsByTagName('select');
  
  for(var i in selects) {
    if(selects[i]) {
      if(typeof selects[i] == 'object') {
        name = selects[i].name
        if(data[name]) {
          name = selects[i].name;
          var s = selects[i];
          s.options.length = 0;
          for(var i in data[name]) {
            s.options[s.options.length] = new Option(data[name][i], i)
          }
        }
      }
    }
  } 
}

String.prototype.endsWith = function(ending) {
  return this.substring(this.length-ending.length) == ending;
}
String.prototype.cutEnd = function(ending) {
  return this.substring(0, this.length-ending.length);
}

function ClearForm(elem) {

  var form = GetAncestor(elem, 'form');
  if(!form)
    return false;
    
  inputs = form.getElementsByTagName('input');
  selects = form.getElementsByTagName('select');
  for(var i in inputs)
    if(inputs[i])
      if(inputs[i].name && typeof inputs[i] == 'object' && inputs[i].type!='button')
        setValue(inputs[i],'');
  for(var i in selects)
    if(selects[i])
      if(selects[i].name && typeof selects[i] == 'object')
        selects[i].selectedIndex = 0;
  
       
}

function ResetSelectOptions(elem) {
  if(typeof elem != 'object' && typeof elem == 'string') {
    elem = ID(elem);
  } else  {
    return false;
  }
  elem.options.length = 0;  
}

function UpdateSelectData(elem, data) {
  ResetSelectOptions(elem);
  for(var i in data) {
  	if(typeof data[i] == 'string')
      AddSelectOptions(elem,i,data[i]);
  }
}
function AddSelectOptions(elem,value,label) {  // ,disabled (optional)
  if(typeof elem != 'object' && typeof elem == 'string') {
    elem = ID(elem);
  } else  {
    return false;
  }
  elem.options[elem.options.length] = new Option(label,value);
  if(arguments.length == 4 && arguments[3]) {
    elem.options[(elem.options.length-1)].disabled = true;
  }  
}

function UpdateAjaxMessage(args) {
  //alert(args[0]+', '+args[1]);
  setValue(args[0], args[1]);
}

function ajaxCall(cls,fnt) { 
  this.ajaxclass = cls;
  this.fnt = fnt;
  this.callback = arguments.length > 2 ? arguments[2] : null;
  this.showMessage = true;
  
  this.send = function(data) {
    sendAjaxMessage(this.ajaxclass, this.fnt, data,this.callback ,this.showMessage);
  }
}