/* ===========================================================*/
/* Copyright (c) 2009 by SDN AG, CH-8912 Obfelden Switzerland */
/* -----------------------------------------------------------*/
/* Project : easyLEARN skills4u                              */
/* -----------------------------------------------------------*/
/* $Id: jsvalidate.js,v 1.10 2009/11/13 11:42:34 MWE Exp $  */
/* ============================================================*/
/*
History
=======
$Log: jsvalidate.js,v $
Revision 1.10  2009/11/13 11:42:34  MWE
Wenn Passwortvorgabe "-generate-" lautet, dann ein Defaultpasswort generieren.

Revision 1.9  2009/11/12 16:19:07  MWE
*** empty log message ***

Revision 1.8  2009/11/11 14:15:27  MWE
CheckPassword() und rc4()/encode64()

Revision 1.7  2009/05/28 12:16:37  MWE
*** empty log message ***

Revision 1.6  2008/09/09 11:47:15  MWE
*** empty log message ***

Revision 1.5  2008/09/05 12:15:50  MWE
Neue Funktionen fuer die Eingabevalidierung

Revision 1.4  2007/07/25 09:58:06  MWE
*** empty log message ***

Revision 1.3  2007/04/20 12:47:22  MWE
Ungueltige Zeichen bei der Eingabe verweigern und entsprechende Mitteilung anzeigen

Revision 1.2  2005/04/15 09:50:42  MWE
Release 4.0

Revision 1.1  2003/12/03 15:51:35  MWE
KnowledgePortal 2.0, update 2

Revision 1.3  2003/07/25 08:01:20  MWE
Change easyLEARN Portal to SDN Knowledgeportal

Revision 1.2  2002/12/11 15:21:47  MWE
EMail-Check

Revision 1.1  2002/12/06 15:06:39  MWE
Initial Release 6.12.2002 MWE

*/

/* rc4 */
   var rc4keyStr = "ABCDEFGHIJKLMNOP" +
                "QRSTUVWXYZabcdef" +
                "ghijklmnopqrstuv" +
                "wxyz0123456789+/" +
                "=";

function rc4encode64(input)
{
      var output = "";
      var chr1, chr2, chr3 = "";
      var enc1, enc2, enc3, enc4 = "";
      var i = 0;

      do {
         chr1 = input.charCodeAt(i++);
         chr2 = input.charCodeAt(i++);
         chr3 = input.charCodeAt(i++);

         enc1 = chr1 >> 2;
         enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
         enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
         enc4 = chr3 & 63;

         if (isNaN(chr2)) {
            enc3 = enc4 = 64;
         } else if (isNaN(chr3)) {
            enc4 = 64;
         }

         output = output + 
         rc4keyStr.charAt(enc1) + 
         rc4keyStr.charAt(enc2) + 
         rc4keyStr.charAt(enc3) + 
         rc4keyStr.charAt(enc4);
         chr1 = chr2 = chr3 = "";
         enc1 = enc2 = enc3 = enc4 = "";
      } while (i < input.length);
      output = output.replace(/\//g, '_');
      output = output.replace(/\+/g, '-');
      output = output.replace(/\./g, '.');
      return output;
   }

function rc4makeArray(n)
{
   for (var i=1; i<=n; i++) {
     this[i]=0
   }
   return this
}

function rc4encrypt(key, text)
  {
   var i, x, y, t, x2;
   s=rc4makeArray(0);

   for (i=0; i<256; i++) {
    s[i]=i
   }
   y=0
   for (x=0; x<256; x++) {
    y=(key.charCodeAt(x % key.length) + s[x] + y) % 256
    t=s[x]; s[x]=s[y]; s[y]=t
   }
   x=0;  y=0;
    var z=""
    for (x=0; x<text.length; x++)
    {
      x2=x % 256
      y=( s[x2] + y) % 256
      t=s[x2]; s[x2]=s[y]; s[y]=t
      z+= String.fromCharCode((text.charCodeAt(x) ^ s[(s[x2] + s[y]) % 256]))
    }
    return z
} 



/* Util functions */

function isBlank(s){
  for (var k=0;k<s.length;k++){
    var c = s.charAt(k);
        if ((c != ' ') && (c != '\n') && (c != '\t')) {
          return false;
        }
  }
  return true;
}

function isAlpha(s){
  var okchrs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ- ';
  return charTest(s,okchrs);
}

function isNumeric(s){
  var okchrs = '.0123456789,-';
  return charTest(s,okchrs);
}

function isAlphaNumeric(s){
  var okchrs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.-_ \t\n';
  return charTest(s,okchrs);
}

function charTest(s,okchrs,etext){
  for (var k=0;k<s.length;k++){
    var c = s.charAt(k).toUpperCase();
        if (okchrs.indexOf(c)==-1) {
           return false;
        }
  }
  return true;
}


/* Date-Validation */

function CheckDateValidDate(format,dteCheck,mindate)
{
  var bValid = true;
  if (isBlank(dteCheck) && mindate == 0)  // Empty Date
    return true;

  var tmp = dteCheck.split('.');
  if (tmp.length != 3)
  {
    tmp = dteCheck.split('/');
    if (tmp.length !=3 )
      tmp = dteCheck.split('-');
    if (tmp.length !=3 )
      return false;
  }
  switch (format.toLowerCase()){
     case 'dd-mmm-yyyy':
         case 'dd/mmm/yyyy':
         case 'dd-mm-yyyy':
         case 'dd/mm/yyyy':
         case 'd/m/y':
         case 'd.m.y':
           bValid = isValidDate(tmp[0],tmp[1],tmp[2]);
           break;
         case 'mm/dd/yyyy':
         case 'mm-dd-yyyy':
         case 'm/d/y':
         case 'm.d.y':
           bValid = isValidDate(tmp[1],tmp[0],tmp[2]);
           break;
         case 'yyyy/mm/dd':
         case 'yyyy-mm-dd':
         case 'y-m-d':
         case 'y/m/d':
         case 'y.m.d':
           bValid = isValidDate(tmp[2],tmp[1],tmp[0]);
           break;
  }
   return bValid;
}


function convertToJSDate(format,separator,value){
  // assumes they have been checked for validity first
  var tmp = value.split('.');
  if (tmp.length != 3)
  {
    tmp = dteCheck.split('/');
    if (tmp.length !=3 )
      tmp = dteCheck.split('-');
    if (tmp.length !=3 )
      return false;
  }

  var JSDate;
  switch (format.toLowerCase()){
     case 'dd-mmm-yyyy':
         case 'dd/mmm/yyyy':
           JSDate = new Date(tmp[2],monthNumFromName(tmp[1]),tmp[0]);
           break;
         case 'dd-mm-yyyy':
         case 'dd/mm/yyyy':
         case 'd/m/y':
         case 'd.m.y':
           JSDate = new Date(tmp[2],tmp[1]-1,tmp[0]);
           break;
         case 'mm-dd-yyyy':
         case 'mm/dd/yyyy':
         case 'm/d/y':
         case 'm.d.y':
           JSDate = new Date(tmp[2]-1,tmp[0],tmp[1]);
           break;
         case 'yyyy-mm-dd':
         case 'yyyy/mm/dd':
         case 'y/m/d':
         case 'y.m.d':
           JSDate = new Date(tmp[0],tmp[1]-1,tmp[2]);
           break;
  }
  return JSDate;
}

var monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");

function monthNumFromName(month){
  for (var i=0;i<monthNames.length;i++){
     if (monthNames[i].substring(0,3).toLowerCase()==month.toLowerCase()) return (i+1);
  }
  return 0;
}

function isValidDate(day,month,year){
  var bValid = true;
  if (isAlpha(month)){ // text month
    month = monthNumFromName(month);
        if (month==0) return false;
  }
  // got this far so could be numeric or converted to numeric
    if (isNumeric(month)){
          if (month>0 && month<13){
            if (isNumeric(year) && year<9999){
                  if (!(isNumeric(day) && day>0 && day<=daysInMonth(month-1,year))) bValid = false;
                } else bValid = false;
          } else bValid = false;
    } else bValid = false;

  return bValid;
}

function daysInMonth(month,year){
  var monthDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  if (month!=1) return monthDays[month];
  else {return isLeapYear(year) ? 29:28;}
}
function isLeapYear(year){
  if (year%4==0 && ((year%100!=0) || (year%400==0))) return true; else return false;
}


function CheckEmailisValid(email,minlen)
{

  var a = false;
  var res = false;
  var str=email + "";

  if (isBlank(str) && minlen == 0) return true;
  
  Ergebnis = str.search(/^[a-zA-Z\x80-\xFF0-9\._-]+@+[a-zA-Z\x80-\xFF0-9\._-]+\.+[a-zA-Z\x80-\xFF]{2,5}$/);
  if (Ergebnis == -1)
	return false;
  return true;
}

function CheckTextHasIllegalChars(avalue, fieldname, amsgtemplate)
{
  var notallowed = '<>"\\';
  var n = avalue + '';
  var i,x;
  for (i=0; i < notallowed.length; i++)
  {
  	c = notallowed.charAt(i) + '';
  	x = n.indexOf(c)
  	if (x != -1)
  	{
  	  var amsg = amsgtemplate.replace(/_FIELDNAME_/g,fieldname);
  	  amsg = amsg.replace(/_CHAR_/g,c);
  	  amsg = amsg.replace(/_POSITION_/g,x);
  	  return amsg;
  	}
  }
  return '';
}

function CheckIdentCharsOnly(avalue, fieldname, msgtemplate)
{
  s = avalue;
  Ergebnis = s.search(/^[A-Za-z0-9\._:-]+$/);
  if (Ergebnis == -1)
  {
    var amsg = msgtemplate.replace(/_FIELDNAME_/g,fieldname);
  	return amsg;
  }
  return '';
}

function CheckIdentWSCharsOnly(avalue, fieldname, msgtemplate)
{
  s = avalue;
  Ergebnis = s.search(/^[A-Za-z\x80-\xFE0-9\._ @:-]+$/);
  if (Ergebnis == -1)
  {
    var amsg = msgtemplate.replace(/_FIELDNAME_/g,fieldname);
  	return amsg;
  }
  return '';
}

function CheckIntegerValue(avalue, fieldname, msgtemplate)
{
  s = avalue;
  Ergebnis = s.search(/^[0-9-]*$/);
  if (Ergebnis == -1)
  {
    var amsg = msgtemplate.replace(/_FIELDNAME_/g,fieldname);
  	return amsg;
  }
  return '';
}

function CheckFloatValue(avalue, fieldname, msgtemplate)
{
  s = avalue;
  Ergebnis = s.search(/^[-0-9,\.]*$/);
  if (Ergebnis == -1)
  {
    var amsg = msgtemplate.replace(/_FIELDNAME_/g,fieldname);
  	return amsg;
  }
  return '';
}

function CheckPassword(avalue, phrase, msgtemplate,uid,aformfield)
{
 
  var ajax = new cAjax();
  ajax.AllowDebug(false);
  
  if (avalue == '-generate-')
  {
	var cmd ='ajaxcmd=ajaxfunc&acmd=genpass';
	ajax.PostWait(null, cmd);
	amsg = ajax.responseText();
	try
	{
	  var xmldoc = ajax.responseXML().documentElement;
	  var statuscode = xmldoc.getElementsByTagName('statuscode')[0].firstChild.data;
	  amsg = xmldoc.getElementsByTagName('status')[0].firstChild.data;
	  if (statuscode == '0')
	  {
		aformfield.value = amsg;
		return "";
	  }
	}
	catch(e) { }	  
  }	  
  var e =  rc4encode64(rc4encrypt(phrase,avalue));
  var cmd ='ajaxcmd=ajaxfunc&acmd=checkpass&uid='+uid+'&pw='+e;
  ajax.PostWait(null, cmd);
  amsg = ajax.responseText();
  try
  {
    var xmldoc = ajax.responseXML().documentElement;
    var statuscode = xmldoc.getElementsByTagName('statuscode')[0].firstChild.data;
    amsg = xmldoc.getElementsByTagName('status')[0].firstChild.data;
    if (statuscode == '0') return "";
    return amsg;
  }
  catch(e) { }
  
  return '';
}
