/**
 * helper section
 */
//Date object update
Date.prototype.dateFormat = function(format) {
  if (format == "Y-m-d") {  
    return this.getFullYear() + '-' + String.leftPad(this.getMonth() + 1, 2, '0') + '-' + String.leftPad(this.getDate(), 2, '0');
  } 
  if (format == "Y-m-d H:i") {  
    return this.getFullYear() + '-' + String.leftPad(this.getMonth() + 1, 2, '0') + '-' + String.leftPad(this.getDate(), 2, '0') + ' ' + String.leftPad(this.getHours(), 2, '0') + ':' + String.leftPad(this.getMinutes(), 2, '0');
  } 
  if (format == "H:i") {  
    return String.leftPad(this.getHours(), 2, '0') + ':' + String.leftPad(this.getMinutes(), 2, '0');
  } 
}

Date.parseDate = function(input, format) {
  var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;
  var d = new Date();
  y = d.getFullYear();
  m = d.getMonth();
  d = d.getDate();
  if (format == "Y-m-d") {
    var results = input.match(/^(\d{4})\-(\d{1,2})\-(\d{1,2})$/);
    if (results && results.length > 0) {
      y = parseInt(results[1], 10);
      m = parseInt(results[2], 10) - 1;
      d = parseInt(results[3], 10);
      if (y > 0 && m >= 0 && d > 0)  {
        return new Date(y, m, d);
      } else if (y > 0 && m >= 0) {
        return new Date(y, m);
      } else if (y > 0) {
        return new Date(y);
      }
    }
  } else if (format == 'Y-m-d H:i') {
    var results = input.match(/^(\d{4})\-(\d{1,2})\-(\d{1,2})\s([01]?[0-9]|[2][0-3]):([0-5][0-9])?$/);
    if (results && results.length > 0) {
      y = parseInt(results[1], 10);
      m = parseInt(results[2], 10) - 1;
      d = parseInt(results[3], 10);
      h = parseInt(results[4], 10);
      i = parseInt(results[5], 10);
      if (y > 0 && m >= 0 && d > 0)  {
        return new Date(y, m, d, h, i);
      } else if (y > 0 && m >= 0) {
        return new Date(y, m);
      } else if (y > 0) {
        return new Date(y);
      }
    }  
  }
  return null;
}

Date.prototype.isLeapYear = function() {
    var year = this.getFullYear();
    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
}

Date.prototype.getFirstDayOfMonth = function() {
    var day = (this.getDay() - (this.getDate() - 1)) % 7 - this.getFirstDayOfTheWeek();
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getLastDayOfMonth = function() {
    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7 - this.getFirstDayOfTheWeek();
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getDaysInMonth = function() {
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
    return Date.daysInMonth[this.getMonth()];
}

Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];

Date.prototype.getFirstDayOfTheWeek = function() {
    return 1;
}
Date.prototype.getTodayText = function() {
  return 'ma'
}

Date.prototype.getDayNames = function() {
  var Hu = ['H','K','Sze','Cs','P','Szo','V'];
  return Hu;
}

Date.prototype.getMonthNames = function() {
  var Hu = ["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"];
  return Hu;
}
//String object update

String.leftPad = function (val, size, ch) {
    var result = new String(val);
    if (ch == null) {
        ch = " ";
    }
    while (result.length < size) {
        result = ch + result;
    }
    return result;
}

String.prototype.trim = function() {
  var x = this;
  x = x.replace(/^\s*(.*)/, "$1");
  x = x.replace(/(.*?)\s*$/, "$1");
  return x;
}

String.prototype.capitalize = function() {
	return this.toLowerCase().replace(/\b[a-z]/g, function(match){
		return match.toUpperCase();
	});
}

String.prototype.parseInt = function() {
	if (this == null || this == '')
		return 0;
	return parseInt(this);
}


// NITRO namespace creator!!!!
var NITRO = function() {
  return {
    util: {},
    ctrl: {},
    namespace: function( sNameSpace ) {
      if (!sNameSpace || !sNameSpace.length) {
        return null;
      }
      var levels = sNameSpace.split(".");
      var currentNS = NITRO;
      for (var i = (levels[0] == "NITRO") ? 1 : 0; i < levels.length; ++i) {
        currentNS[levels[i]] = currentNS[levels[i]] || {};
        currentNS = currentNS[levels[i]];
      }
  
      return currentNS;

    }
  };
} ();

//HTML DOM helper class
NITRO.util.Htmldom = {};

NITRO.util.Htmldom = {

  getText: function(element) {
    var text = '';
    if (element.childNodes.length > 0) {
    if (element.firstChild.nodeType == 4 ) { //CDATA Section
        element = element.firstChild;
      } else {
        element = element;
      }
    }
    if(element.textContent) {
      text = element.textContent;
    } else if(element.innerText) {
      text = element.innerText;
    } else if (element.text) {
      text = element.text;
    } else if (element.nodeValue) {
      text = element.nodeValue;
    } else text = '';
    return text.trim();
  },

  setText: function(element, text) {
    if (text == null) text = '';
    if (element.hasChildNodes()) {
      element.firstChild.nodeValue = text;
    } else {
      var textNode = element.ownerDocument.createTextNode(text);
      element.appendChild(textNode);
    }
  }
}

NITRO.util.Coords = {};
NITRO.util.Coords = {
  cursor : function (ev) {
  	if(ev.pageX || ev.pageY){
  		return {x:ev.pageX, y:ev.pageY};
  	}
  	return {
  		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
  		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
  	};  
  },

  offset: function(element) {
    var result = {x:0, y:0};
    while (element != null) {
        result.y += element.offsetTop+1;
        result.x += element.offsetLeft;
        element = element.offsetParent;
    }
    return result;
  }
}

NITRO.util.Validator = {};
NITRO.util.Validator = {
  datetime: function (strValue) {
    strSeparator = ' ';
    var arrayDateTime = strValue.split(strSeparator); 
    if (NITRO.util.Validator.date(arrayDateTime[0]) && NITRO.util.Validator.time(arrayDateTime[1]))
      return true;
    else 
      return false;
  },
  
  date: function ( strValue ) {
    var objRegExp = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
    var charRegExp = /\d/;
    //check to see if in correct format
    if(!objRegExp.test(strValue))
      return false; //doesn't match pattern, bad date
    else {    
  // Detect separator
    for (var i = 0; i < strValue.length; i++) {
      if (!charRegExp.test(strValue.charAt(i))) break;
    }
  
    var strSeparator=strValue.charAt(i);
  
    var arrayDate = strValue.split(strSeparator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[2],10);
    //check if month value and day value agree
    if(arrayLookup[arrayDate[1]] != null) {
      if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
        return true; //found in lookup table, good date
    }
  
    //check for February (bugfix 20050322)
    var intMonth = parseInt(arrayDate[1],10);
    if (intMonth == 2) { 
       var intYear = parseInt(arrayDate[0],10);
       if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
          return true; //Feb. had valid number of days
       }
    }
    return false; //any other values, bad date  
  },

  number: function (strValue) {
    var objRegExp =  	/^\-?\d+(\.\d\d)?$/;
    return objRegExp.test(strValue)
  },
  
  time: function (strValue) {
    return /^([01]?[0-9]|[2][0-3])(:[0-5][0-9])?$/.test(strValue);
  }
}

NITRO.util.Browser = {
  isIe : function () {
    if (document.all && !window.opera) return true; else return false;
  },
  isOpera : function () {
    if (window.opera) return true; else return false;
  },
  isMoz : function () {
    return navigator.userAgent.indexOf("Mozilla/5.") == 0;
  },
  isSafari : function () {
  	var b = navigator.userAgent.toLowerCase();
	  return /webkit/.test(b);  
  }
}

//DOM wrapper
NITRO.util.DOM = {
  createDOMDocument : function(strNamespaceURI, strRootTagName) {
    var objDOM = null;
    if (NITRO.util.Browser.isMoz() || NITRO.util.Browser.isOpera()) {
      objDOM = document.implementation.createDocument(strNamespaceURI, strRootTagName, null);            
    } else if (NITRO.util.Browser.isIe()) {
      var ARR_ACTIVEX = ["MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom"];
      var STR_ACTIVEX = "";
      var bFound = false;
      for (var i=0; i < ARR_ACTIVEX.length && !bFound; i++) {
        try {
          var objXML = new ActiveXObject(ARR_ACTIVEX[i]);
          STR_ACTIVEX = ARR_ACTIVEX[i];
          bFound = true                
        
        } catch (objException) { 
        } //End: try
      } //End: for
      if (!bFound)
        throw "No DOM Document found on your computer.";
      objDOM = new ActiveXObject(STR_ACTIVEX);
     if (strRootTagName) {
        if (strNamespaceURI) {
            objDOM.loadXML("<a0:" + strRootTagName + " xmlns:a0=\"" + strNamespaceURI + "\" />");
        } else {
            objDOM.loadXML("<" + strRootTagName + "/>");        
        }
      }
    }
    return objDOM;
  }
}

if (NITRO.util.Browser.isOpera()) {
  Node.prototype.saveXML = function (){return (new XMLSerializer()).serializeToString(this)};
}

if (NITRO.util.Browser.isMoz()) {
 Node.prototype.__defineGetter__("xml", function (){
    return (new XMLSerializer()).serializeToString(this);
  });
}

if (NITRO.util.Browser.isMoz() || NITRO.util.Browser.isOpera()) {
  Document.prototype.loadXML = function(strXML) {
    var objDOMParser = new DOMParser();
    var objDoc = objDOMParser.parseFromString(strXML, "text/xml");      
     // remove all initial children
    while (this.childNodes.length > 0) {
      this.removeChild(this.lastChild);
    }
    // insert and import nodes
    for (var i = 0; i < objDoc.childNodes.length; i++) {
      this.appendChild(this.importNode(objDoc.childNodes[i], true));
    }
  } 
}

//input field selection helper
NITRO.util.Selection = {};
NITRO.util.Selection = {
  Start: function (input) {
  	if (NITRO.util.Browser.isMoz() || NITRO.util.Browser.isOpera())
  		return input.selectionStart;
  	var range = document.selection.createRange();
  	var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
  	if (!isCollapsed)
  		range.collapse(true);
  	var b = range.getBookmark();
  	return b.charCodeAt(2) - 2;
  },
  End: function (input) {
  	if (NITRO.util.Browser.isMoz() || NITRO.util.Browser.isOpera())
  		return input.selectionEnd;
  	var range = document.selection.createRange();
  	var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
  	if (!isCollapsed)
  		range.collapse(false);
  	var b = range.getBookmark();
  	return b.charCodeAt(2) - 2;
  },
  setSelectionRange: function (input, start, end) {
  	if (NITRO.util.Browser.isMoz() || NITRO.util.Browser.isOpera()) {
  		input.setSelectionRange(start, end);
  	} else {
  		var range = input.createTextRange();
  		range.collapse(true);
  		range.moveStart("character", start);
  		range.moveEnd("character", end - start);
  		range.select();
  	}
  }
}

/** 
 * Control Section
 */
  
/**
 * Simple Maskedit
 */
NITRO.ctrl.Maskedit = function (containerId,mask,validator) {
  var container = document.getElementById(containerId);
  this.container = container;
  container.control = this;
  this.id = containerId;
  this.sMask = mask;
  this.maskValidate = validator;
  this.container.setAttribute("autocomplete","off");  
  this.container.onkeypress = this.maskKeyPress;
  this.container.onkeydown = this.maskKeyDown;
  this.container.onkeyup = this.maskKeyUp;
  this.container.onchange = this.maskOnChange;  
}

NITRO.ctrl.Maskedit.prototype.setDisable = function(dis) {
  this.container.disabled = dis;
}

NITRO.ctrl.Maskedit.prototype.setSelection = function(val) {
  this.container.value = val;  
}

NITRO.ctrl.Maskedit.prototype.getSelection = function() {
  return this.container.value;
}

NITRO.ctrl.Maskedit.prototype.maskOnChange = function (e) {
  var objInput;
// init objects
  if (!e) e = window.event;
	if (e.srcElement) { //ie
		objInput = e.srcElement;
	} else { //moz, ns
		objInput = e.target;
	}
  if (!objInput.control.maskValidate( objInput.value )) {
    objInput.value = "";
  } 
}

NITRO.ctrl.Maskedit.prototype.maskFit = function(e, strMask) {  
	var reValidChars = /\d/;  //# - masked character this regeps givs the allowed chars numeric this time
  var iKeyCode;
  var objInput;
// init objects
	if (e.srcElement) { //ie
    iKeyCode = e.keyCode;
		objInput = e.srcElement;
	} else { //moz, ns
    iKeyCode = e.which;
		objInput = e.target;
	}
	var strKey = String.fromCharCode(iKeyCode);
 
  var keyCount = objInput.value.length;
//reach the size of the mask

	if(keyCount == strMask.length)
		return false;
		
  if (strMask.charAt(keyCount) == strKey) 
    return true  
    
  if ((strMask.charAt(keyCount) != '#') && reValidChars.test(strKey)) {
     objInput.value = objInput.value + strMask.charAt(keyCount) + strKey;    
  } 

//if next char is not mask then put into in the string  
  if ((strMask.charAt(keyCount+1) != '#') && reValidChars.test(strKey)) {
     objInput.value = objInput.value + strKey + strMask.charAt(keyCount+1);
     return false;
  }
  
  if ((strMask.charAt(keyCount) == '#') && reValidChars.test(strKey))
     return true;
  return false;
}

NITRO.ctrl.Maskedit.prototype.maskKeyDown = function(e) {
  if (!e) var e = window.event;
  var iKeyCode;
  var objInput;
	if (e.srcElement) {
	  iKeyCode = e.keyCode;
		objInput = e.srcElement;
	} else {
	  iKeyCode = e.which;
		objInput = e.target;
	}
	var strKey = String.fromCharCode(iKeyCode);
  return !(e && e.keyCode == 13); 
}  
  
NITRO.ctrl.Maskedit.prototype.maskKeyPress = function(e) {
  var reKeyboardChars = /[\x00\x03\x08\x0D\x16\x18\x1A]/;  //special key-s, arrow, del bakcspace etc
  var iKeyCode;
  var objInput;
  if (!e) var e = window.event;
	if (e.srcElement) {
	  iKeyCode = e.keyCode;
		objInput = e.srcElement;
	} else {
	  iKeyCode = e.which;
		objInput = e.target;
	}
	var strKey = String.fromCharCode(iKeyCode);
  var strMask = objInput.control.sMask;

  if (reKeyboardChars.test(strKey)) {
    return true;
  }

  //paste detect
	if ((!e.ctrlKey && e.keyCode != 86) && (!e.shiftKey && e.keyCode != 45)) {
    var ss = NITRO.util.Selection.Start(objInput);
    var se = NITRO.util.Selection.End(objInput);
    if (ss == 0 && se == objInput.value.length)
      objInput.value = "";
    return objInput.control.maskFit(e,strMask);
  }
  return true;
}

NITRO.ctrl.Maskedit.prototype.maskKeyUp = function (e) {
  if (!e) var e = window.event;
  var iKeyCode;
  var objInput;
	if (e.srcElement) {
	  iKeyCode = e.keyCode;
		objInput = e.srcElement;
	} else {
	  iKeyCode = e.which;
		objInput = e.target;
	}
	var strKey = String.fromCharCode(iKeyCode);
	var strMask = objInput.control.sMask;
//paste detect
	if ((e.ctrlKey && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) {
//	  var _this = this;
    setTimeout(function() {
      if (!objInput.control.maskValidate( objInput.value )) {
        objInput.value = "";
      }
    }, 1);
  }

  if (objInput.value.length == strMask.length) {
    if (!objInput.control.maskValidate( objInput.value )) {
      objInput.value = "";
    }
  }
}
 
/**
 * Simple Select
 */
 
NITRO.ctrl.Select = function (containerId, mode, getdata, owner) {
  var container = document.getElementById(containerId);
  this.id =containerId;
  this.container = container;
  container.control = this;
  container.onchange = this.OnChange;
  if (owner) this.owner = owner;
  if (getdata) this.CustomgetData = getdata;
  if (this.CustomgetData) {
    this.CustomgetData(this);
  } else {
    if (mode == 'client') this.getData();
  }
}

NITRO.ctrl.Select.prototype.setSelection = function(val) {
  var con = this.container; 
  for(var i = 0; i < con.options.length; i++) {
    if(con.options[i].value == val) {
      con.selectedindex = i;
      if(!con.options[i].selected ) {
        con.options[i].selected = true;
      } 
      return;
    }
  }
}

NITRO.ctrl.Select.prototype.getSelection = function() {
  var con = this.container; 
  return con.options[con.selectedIndex].value;
}

NITRO.ctrl.Select.prototype.setDisable = function(val) {
  this.container.disabled = val;
}

NITRO.ctrl.Select.prototype.OnChange = function (e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  elem.control.CustomOnChange(e);    
}

NITRO.ctrl.Select.prototype.CustomOnChange = function(o) {};

NITRO.ctrl.Select.prototype.renderOptions = function() {  //Id, Value -rows are required in the result
  var rowsdata = this.data.getElementsByTagName("row");

  for (var i = 0; i < rowsdata.length; i++) {
    var rowdata = rowsdata[i];
    var fielddata = rowdata.getElementsByTagName('Id')[0];
    if (fielddata.hasChildNodes()) {
      var val = fielddata.firstChild.nodeValue;
    } else {
      var val = '';
    }
    var fielddata = rowdata.getElementsByTagName('Value')[0];
    if (fielddata.hasChildNodes()) {
      var cap = fielddata.firstChild.nodeValue;
    } else {
      var cap = '';
    }
    this.container.options[i] = new Option (cap,val);
  }
}
  
/**
 * simple Dateedit
 */ 
/**
 * helper end
 */      



NITRO.ctrl.SimpleDateedit = function (containerId,field, mode) {  //mode:date, time, datetime
  if (!mode) this.mode = 'date'; else this.mode = mode;
  var container = document.getElementById(containerId);
  this.container = container;
  container.control = this;
  this.id = containerId;
  this.field = field;
  this.subcontrols = {};
//  this._date = new Date();  
  this._date = null;  

  if (this.mode == 'date') this._format = "Y-m-d";
  if (this.mode == 'datetime') this._format = "Y-m-d H:i";
  if (this.mode == 'time') this._format = "H:i";
  if (this.mode == 'date') container.style.width = '110px';
  if (this.mode == 'datetime') container.style.width = '145px';
  if (this.mode == 'time') container.style.width = '40px';

  this.renderControl();
  if (this.mode == 'date' || this.mode == 'datetime') {
    this.chooser = this.renderChooser();
    this.container.appendChild(this.chooser); 
    this.hideChooser();
    this.subcontrols['yearselect'] = new NITRO.ctrl.Select(this.id+'YearSelect','client',this.yearGetData, this);
    if (this._date)
      this.subcontrols['yearselect'].setSelection(this._date.getFullYear());
    this.subcontrols['monthselect'] = new NITRO.ctrl.Select(this.id+'MonthSelect','client',this.monthGetData, this);
    if (this._date)
      this.subcontrols['monthselect'].setSelection(this._date.getMonth());
    this.subcontrols['yearselect'].container.onchange = this.YearOnChange;
    this.subcontrols['monthselect'].CustomOnChange = this.ComboOnChange;
    this.subcontrols['dateedit'] = new NITRO.ctrl.Maskedit(this.id + 'DateInput',"####-##-##",NITRO.util.Validator.date);
    this.subcontrols['dateedit'].container.onkeyup = this.maskOnChange;  
    this.subcontrols['dateedit'].owner = this;
  }
  if (this.mode == 'time' || this.mode == 'datetime') {
    this.subcontrols['timeedit'] = new NITRO.ctrl.Maskedit(this.id + 'TimeInput',"##:##",NITRO.util.Validator.time);
    this.subcontrols['timeedit'].owner = this;
    this.subcontrols['timeedit'].container.onkeyup = this.maskOnChange;  
  }
}

NITRO.ctrl.SimpleDateedit.prototype.monthGetData = function (o) {
  sel = o.container;
  var j = 0;
  var d = new Date;
  var monthNames = d.getMonthNames();   
  
  for (var mon in monthNames) {
    sel.options[j] = new Option (monthNames[mon],mon)
    j++;
  }  
}
NITRO.ctrl.SimpleDateedit.prototype.yearGetData = function (o) {
  sel = o.container;
  var j = 0;
  var d = new Date;
  var y = d.getFullYear()
  for (i=y-1;i<=y+5;i++) {
    sel.options[j] = new Option (i,i)
    j++;
  }  
}

NITRO.ctrl.SimpleDateedit.prototype.getSelection = function() {
  var inp = document.getElementById(this.id+'Input');
  var val = NITRO.util.Htmldom.getText(inp);
  
  return val;
}

NITRO.ctrl.SimpleDateedit.prototype.setSelection = function(val) {
  var inp = document.getElementById(this.id+'Input');
  var nval = null;
  if (this.mode == 'date') {
    var dinp = document.getElementById(this.id+'DateInput');
    nval = val;
  }
  if (this.mode == 'time') {
    var tinp = document.getElementById(this.id+'TimeInput');
    nval = val;
  }
  if (this.mode == 'datetime') {
    var dinp = document.getElementById(this.id+'DateInput');
    var tinp = document.getElementById(this.id+'TimeInput');
    
    if (NITRO.util.Validator.datetime(val)) {
      nval = val;
    } else if (NITRO.util.Validator.date(val)) {
      if (!tinp.value) tinp.value = '12:00';
      nval = val + ' ' + tinp.value;
    } else if (NITRO.util.Validator.time(val)) {
      nval = dinp.value + ' ' +val;
    }
  }
  inp.value =  nval;
  if (nval) 
    inp.control._date = Date.parseDate(nval, inp.control._format)
  if (inp.control._date) {
    if (this.mode == 'date' || this.mode == 'datetime') 
      dinp.value = inp.control._date.dateFormat('Y-m-d');
    if (this.mode == 'time' || this.mode == 'datetime') 
      tinp.value = inp.control._date.dateFormat('H:i');
  }
}

NITRO.ctrl.SimpleDateedit.prototype.setDisable = function(dis) {
  if (this.mode == 'date' || this.mode == 'datetime') 
    this.dateinput.disabled = dis;
  if (this.mode == 'time' || this.mode == 'datetime') 
    this.timeinput.disabled = dis;
  if (dis) {
    this.container.style.background = '#E0DFE3'; 
    this.button.onclick = null;
  } else {
    this.container.style.background = '#FFFFFF';
    this.button.onclick = this.ButtonOnClick;
  }
}
//event handlers

NITRO.ctrl.SimpleDateedit.prototype.maskOnChange = function (e) {
  var objInput = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    objInput = e.srcElement;
  else 
    objInput = e.target;
  if (objInput.id == objInput.control.owner.id + 'DateInput') 
    var l = 10
  else
   var l = 5;
  if (objInput.value.length >= l)
    if (!objInput.control.maskValidate( objInput.value )) {
      objInput.value = "";
    } else {
      objInput.control.owner.setSelection(objInput.value);
    }
}

NITRO.ctrl.SimpleDateedit.prototype.YearOnChange = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  var pcontrol = elem.control.owner;
  var rdate = pcontrol._date ? pcontrol._date : new Date();
    
  var y = pcontrol.subcontrols['yearselect'].container;
  if (y.value < 1900) y.value = rdate.getFullYear();
  var year = y.value;

  var m = pcontrol.subcontrols['monthselect'].container;
  
  var newDate = new Date(year,m.options[m.selectedIndex].value,1);
  
  newDate.setDate(Math.max(1, Math.min(newDate.getDaysInMonth(), rdate.getDate())));
  pcontrol._date = newDate;
  pcontrol.chooser.replaceChild(pcontrol.renderTable(),pcontrol.chooser.getElementsByTagName('table')[0]);
}


NITRO.ctrl.SimpleDateedit.prototype.ComboOnChange = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  var pcontrol = elem.control.owner;

  var rdate = pcontrol._date ? pcontrol._date : new Date();
    
  var y = pcontrol.subcontrols['yearselect'].container;
  if (y.value < 1900) y.value = rdate.getFullYear();
  var year = y.value;

  var m = pcontrol.subcontrols['monthselect'].container;
  var newDate = new Date(year,m.options[m.selectedIndex].value,1);
  // Try to preserve the day of month (watch out for months with 31 days)
  newDate.setDate(Math.max(1, Math.min(newDate.getDaysInMonth(), pcontrol._date.getDate())));
  pcontrol._date = newDate;
  pcontrol.chooser.replaceChild(pcontrol.renderTable(),pcontrol.chooser.getElementsByTagName('table')[0]);
}

NITRO.ctrl.SimpleDateedit.prototype.ButtonOnClick = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  if (elem.control._visible == true) {
    elem.control.hideChooser();
  } else {
    var rdate = elem.control._date ? elem.control._date : new Date();  
    elem.control.subcontrols['yearselect'].setSelection(rdate.getFullYear());
    elem.control.subcontrols['monthselect'].setSelection(rdate.getMonth());
    elem.control.chooser.replaceChild(elem.control.renderTable(),elem.control.chooser.getElementsByTagName('table')[0]);
    
    elem.control.showChooser();
  }
}
NITRO.ctrl.SimpleDateedit.prototype.ChooserMouseOut = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  
  if (elem.control)
    if (elem.id == elem.control.id + 'Chooser')
      elem.control.hideChooser();
}

NITRO.ctrl.SimpleDateedit.prototype.ChooserMouseOver = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  
  if (elem.control) 
    if (elem.control.owner) 
      elem.control.owner.showChooser();
    else
      elem.control.showChooser();
  
}

NITRO.ctrl.SimpleDateedit.prototype.TableOnClick = function(e) {
  var elem = null;
  if (!e) e = window.event;
  if (e.srcElement) 
    elem = e.srcElement;
  else 
    elem = e.target;
  var pcontrol = elem.control;
  pcontrol.setSelection(elem.getAttribute('date'));  
  pcontrol.chooser.replaceChild(pcontrol.renderTable(),pcontrol.chooser.getElementsByTagName('table')[0]);
  
  pcontrol.hideChooser();
}

NITRO.ctrl.SimpleDateedit.prototype.hideChooser = function() {
  this._visible = false;
  
  this.chooser.style.visibilty = 'hidden'; 
  this.chooser.style.display = 'none';
}

NITRO.ctrl.SimpleDateedit.prototype.showChooser = function() {
  this._visible = true;
  
  var inputPos = NITRO.util.Coords.offset(this.dateinput);
  this.chooser.style.top =  inputPos.y+this.dateinput.offsetHeight+"px";
  this.chooser.style.left = inputPos.x+"px";  

  this.chooser.style.visibilty = 'visible'; 
  this.chooser.style.display = 'block';
}

//render methods
NITRO.ctrl.SimpleDateedit.prototype.renderControl = function() {
  var inpElem = document.createElement('input');
    inpElem.id = this.id + 'Input';
    inpElem.name = this.field;
    inpElem.type = 'hidden'; 
    inpElem.control = this;
  this.container.appendChild(inpElem);
  if (this.mode == 'date' || this.mode == 'datetime') {
    var inpElem = document.createElement('input');
    inpElem.id = this.id + 'DateInput';
    inpElem.type = 'text'; 
    inpElem.className = "dateinput"
    inpElem.control = this;
    this.dateinput = inpElem;
    this.container.appendChild(inpElem);
   
    var imgElem = document.createElement('img');
    imgElem.id = this.id + 'Button';
    imgElem.className = 'datebutton';
    imgElem.src = '/images/ico_calendar.gif';
    imgElem.onclick = this.ButtonOnClick;
    imgElem.control = this;
    this.button = imgElem;
    this.container.appendChild(imgElem); 
  }
//time edit
  if (this.mode == 'time' || this.mode == 'datetime') {
    var inpElem = document.createElement('input');
    inpElem.id = this.id + 'TimeInput';
    inpElem.type = 'text'; 
    inpElem.className = "timeinput";
    inpElem.control = this;
    this.timeinput = inpElem;
    this.container.appendChild(inpElem);
  }
}

NITRO.ctrl.SimpleDateedit.prototype.renderChooser = function() {
  
  var divElem = document.createElement('div');
    divElem.id = this.id + 'Chooser';
    divElem.className = 'dateChooser';
    divElem.style.visibilty = 'hidden'; 
    divElem.style.display = 'none';
    divElem.style.position = 'absolute';
    divElem.style.width = '160px';
    divElem.style.top = '0px';
    divElem.style.left = '0px';
    divElem.control = this;
    divElem.onmouseover = this.ChooserMouseOver;
    divElem.onmouseout = this.ChooserMouseOut;

  var inputPos = NITRO.util.Coords.offset(this.dateinput);
  divElem.style.top =  inputPos.y+this.dateinput.offsetHeight+"px";
  divElem.style.left = inputPos.x+"px";  
  
//  var selElem = document.createElement('input');
  var selElem = document.createElement('select');
    selElem.id = this.id+'YearSelect';

  divElem.appendChild(selElem);
  var selElem = document.createElement('select');
    selElem.id = this.id+'MonthSelect';
  divElem.appendChild(selElem);


  var tblElem = this.renderTable();
  divElem.appendChild(tblElem);
  
  tdivElem = document.createElement('div');
  tdivElem.className = 'Today';
  
  var thisDay = new Date();  
  tdivElem.innerHTML = thisDay.getTodayText(); 
  tdivElem.setAttribute('date',thisDay.dateFormat('Y-m-d'));
  tdivElem.onclick = this.TableOnClick;
  tdivElem.control = this;    
  divElem.appendChild(tdivElem);

  return divElem;
}


NITRO.ctrl.SimpleDateedit.prototype.renderTable = function() {
  var rdate = this._date ? this._date : new Date();

  var firstDay = rdate.getFirstDayOfMonth();
  var lastDay = rdate.getLastDayOfMonth();
//table  
  var tblElem = document.createElement('table');
  //tblElem.className = 'dateChooser';
    tblElem.setAttribute('cellspacing','0');
    tblElem.cellspacing = 0;
    tblElem.width = '160px';
//header
  var bdyElem = document.createElement("tbody");
  
  tblElem.appendChild(bdyElem);
  
  var hrowElem = document.createElement('tr');
  var d = new Date
  var dayNames = d.getDayNames();
  for (var i = 0; i < dayNames.length; i++) {
    var hcellElem = document.createElement('th');
    NITRO.util.Htmldom.setText(hcellElem,dayNames[i]);
    hrowElem.appendChild(hcellElem);
  } 
  bdyElem.appendChild(hrowElem);
//body
  var browElem = document.createElement('tr');
  var bcellElem;
  if (firstDay != 0) {
    bcellElem = document.createElement('td');
    bcellElem.colSpan = firstDay;
    NITRO.util.Htmldom.setText(bcellElem,' ');
    browElem.appendChild(bcellElem);
    bdyElem.appendChild(browElem);
  }
  // Fill in the days of the month
  var i = 0;
  while (i < rdate.getDaysInMonth()) {
      if (((i++ + firstDay) % 7) == 0) {
        browElem = document.createElement('tr');
        bdyElem.appendChild(browElem);
      } 
      var thisDay = new Date(rdate.getFullYear(),rdate.getMonth(), i);
      bcellElem = document.createElement('td');
      bcellElem.setAttribute('date',thisDay.dateFormat('Y-m-d'));
      bcellElem.className = 'dateChooserActive';
      bcellElem.control = this;
      bcellElem.onclick = this.TableOnClick;
      if (i == rdate.getDate()) {
        bcellElem.className = 'dateChooserActive dateChooserActiveToday';      
      }
      NITRO.util.Htmldom.setText(bcellElem,i);
      browElem.appendChild(bcellElem);
  }
  if (lastDay != 6) {  
    bcellElem = document.createElement('td');
    //bcellElem.setAttribute('colspan',(6 - lastDay));
    bcellElem.colSpan = (6 - lastDay);
    NITRO.util.Htmldom.setText(bcellElem," ");
    browElem.appendChild(bcellElem);
  }
  return tblElem;
}
