//misc helper function

//Date object update
Date.prototype.locale = 1;
Date.locale = 1;
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() {
  var loc = NITRO.util.i18n.getLocaleByOrder(this.locale);
  if (loc == 'hu') {
    return 1;
  } else if (loc == 'de' || loc == 'en') {
    return 0;
  }
}
Date.prototype.getTodayText = function() {
  var Hu = 'ma';
  var De = 'heute';
  var En = 'now';
  var loc = NITRO.util.i18n.getLocaleByOrder(this.locale);
  if (loc == 'hu') {
    return Hu;
  } else if (loc == 'de') {
    return De;
  } else if (loc == 'en') {
    return En;
  }
}

Date.prototype.getDayNames = function() {
  var Hu = ['H','K','Sze','Cs','P','Szo','V'];
  var De = ['So','Mo','Di','Mi','Do','Fr','Sa'];
  var En = ['So','Mo','Tu','We','Th','Fr','Sa'];
  var loc = NITRO.util.i18n.getLocaleByOrder(this.locale);
  if (loc == 'hu') {
    return Hu;
  } else if (loc == 'de') {
    return De;
  } else if (loc == 'en') {
    return En;
  }
}

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"];
  var De = ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"];
  var En = ["January","February","March","April","May","June","July","August","September","October","November","December"];
  NITRO.util.i18n.getTextByName('new','hu');
  var loc = NITRO.util.i18n.getLocaleByOrder(this.locale);
  if (loc == 'hu') {
    return Hu;
  } else if (loc == 'de') {
    return De;
  } else if (loc == 'en') {
    return En;
  }
}

//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 (div.state.xml) {  //ie
      var str = div.state.xml;
    } else { //moz opera
       var s = new XMLSerializer();
       str = s.serializeToString(div.state);          
    }
*/
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();
  	}
  }
}
