
var isSubmitFocus = false;
addLoadEvent(PrepareForms);
    
function PrepareForms() {
  var aDiv;
  var aForms;
  if (document.getElementById && document.getElementsByTagName) {
    // aDiv = document.getElementById("form");
    // aForms = aDiv.getElementsByTagName("form");
    aForms = document.getElementsByTagName("form");
    for (var intCounter = 0; intCounter < aForms.length; intCounter++) {
      //aForms[intCounter].onsubmit = function() { return isSubmitFocus; }; 
      aInputs    = aForms[intCounter].getElementsByTagName("input");
      aTextAreas = aForms[intCounter].getElementsByTagName("textarea");
      aCombos    = aForms[intCounter].getElementsByTagName("select");
      applyEvent(aInputs);
      applyEvent(aTextAreas);
      applyEvent(aCombos);
    }
    if (aForms.length > 1) { goFirstInput(aForms[1].id); }
  }
} 

function applyEvent(inputs) {
  for (var intCounter = 0; intCounter < inputs.length; intCounter++) {
    if(inputs[intCounter].type == "submit") {
      inputs[intCounter].onfocus   = function() { isSubmitFocus = true; return true; };
      inputs[intCounter].onblur    = function() { isSubmitFocus = false; return true; };
    } else {
      inputs[intCounter].onfocus   = function() { InputEnter(this); return true; };
      inputs[intCounter].onblur    = function() { InputLeave(this); return true; };
      inputs[intCounter].onkeydown = InputKeyDown;
      if(typeof InputChange == 'function') {
        inputs[intCounter].onchange  = InputChange;
      }
    }
    if(HasClassName(inputs[intCounter],"submit")) {
      if(typeof InputChange == 'function') {
        inputs[intCounter].onclick = function() { return InputChange(); }
      }
    }
  }
}

function RemoveValidation() {
  var aDiv;
  var aForms;
  if (document.getElementById && document.getElementsByTagName) {
    aDiv = document.getElementById("form");
    aForms = aDiv.getElementsByTagName("form");
    for (var intCounter = 0; intCounter < aForms.length; intCounter++) {
      aForms[intCounter].onsubmit=function() { return true; };
    }
  }
}

function InputEnter(Obj) {
  AddClassName(Obj,'input-focus');
}

function InputLeave(Obj) {
  RemoveClassName(Obj,'input-focus');
}

function InputKeyDown(e) {
  if (e) { key = e.keyCode; }
  else { key = window.event.keyCode; }
  if(key==13) {
    isPressEnter = true;
    goNextInput(this);
    return isSubmitFocus;
  } else { return true; }
}

function goFirstInput(formId) {
  var fForm = document.getElementById(formId)
  var Inputs = fForm.elements;
  var Inp, nextInput;
  for (var i=0, len=Inputs.length; i<len; i++){
    Inp = Inputs[i];
    if (Inp.type!="hidden" && !Inp.disabled && Inp.focus) {
      Inp.focus();
      AddClassName(Inp,'input-focus');
      return true;
    }
  }
  return false;
}

function goNextInput(Obj) {
  var fForm = Obj.form;
  var Inputs = fForm.elements;
  var Inp, nextInput;
  var isNext = false;
  for (var i=0, len=Inputs.length; i<len; i++){
    Inp = Inputs[i];
    if (Obj == Inp ) isNext = true;
    if (isNext) {
      nextInput = Inputs[i+1];
      if (nextInput.focus && nextInput.type!='button') {
        isNext = false;
        nextInput.focus();
        AddClassName(nextInput,'input-focus');
      }
    }
  }
}

function FormatUrl(obj,PutInOrder,DefaultIcon,ConvertToHttp) {
  var res = trim(obj.value);
  if (DefaultIcon) { var schema = "uri "+DefaultIcon; } else { var schema = "uri edit"; }
  if (res!="") {
    // tel:
    if (res.match("^(tel|phone).*$")) { res = res.replace("tel:",""); }
    if (res.match(/^[0-9\s\t\r\n\-\+\(\)\\\/]*$/)) {
      res = res.replace(/[\s\t\r\n\-\+\(\)\\\/]*/g, "");
      if (res.length>6) {
        if (res.length==7)  { res = "38044" + res; } else
        if (res.length==8)  { res = "3800"  + res; } else
        if (res.length==9)  { res = "380"   + res; } else
        if (res.length==10) { res = "38"    + res; } else
        if (res.length==11) { res = "3"     + res; }
        res = res.replace(/^(.*?)(.{3})(.{3})(.{2})(.{2})$/,"+$1($2)$3-$4-$5");
      }
      if (res.match(/.*\(044\).*/)) { schema = "uri phone" }
      else { schema = "uri mobile" };
    } else
    if (res.match("^mailto.*$")) { schema = "uri mail"; res = res.replace("mailto:",""); } else
    if (res.indexOf('@') > -1) { schema = "uri mail"; } else
    if (res.match("^ftp.*$")) { schema = "uri ftp"; } else
    if (res.match("^(http|https).*$")) { schema = "uri http"; } else
    if (res.match("^telnet.*$")) { schema = "uri telnet"; } else
    if (res.match("^profile.*$")) { schema = "uri pro"; } else
    if (res.match("^skype.*$")) { schema = "uri skype"; } else
    if (res.match("(^icq.*$)|(^#[0-9-\s]$)")) { schema = "uri icq"; } else
    if (res.match("(^www\..*$)|(^.*\.(com|net|org|gov|biz|info|name|ch|uk|tv|fm|pl|eu|de|us|su|ru|ua|md|cn|in)(\..*)?$)|(^(\d{1,3}\.){3}\d{1,3}$)")) {
      res = "http://" + res;
      schema = "uri http";
    }
  }
  if (PutInOrder) { obj.value = res; }
  obj.className = schema;
}

function formatTel(value) {
  res = value.replace(/[\s\t\r\n\-\+\(\)\\\/]*/g, "");
  if (res.length>6) {
    if (res.length==7)  { res = "38044" + res; } else
    if (res.length==8)  { res = "3800"  + res; } else
    if (res.length==9)  { res = "380"   + res; } else
    if (res.length==10) { res = "38"    + res; } else
    if (res.length==11) { res = "3"     + res; }
    res = res.replace(/^(.*?)(.{3})(.{3})(.{2})(.{2})$/,"+$1($2)$3-$4-$5");
  }
  return res;
}

function formatCurrency(value) {
  value = value.toString().replace(/\$|\,/g,'');
  if(isNaN(value)) value = "0";
  sign = (value == (value = Math.abs(value)));
  value = Math.floor(value*100+0.50000000001);
  cents = value%100;
  value = Math.floor(value/100).toString();
  if(cents<10) cents = "0" + cents;
  for (var i = 0; i < Math.floor((value.length-(1+i))/3); i++) {
    value = value.substring(0,value.length-(4*i+3))+','+value.substring(value.length-(4*i+3));
  }
  return (((sign)?'':'-') + '$' + value + '.' + cents);
}

function formatDate(value,format) {
  // ---------------format-----------------------------------------------------------------------------------------------------------------------------
  // date-us (MM/DD/YYYY), datetime-us (MM/DD/YYYY HH:MM AM), datetimesec-us (MM/DD/YYYY HH:MM:SS AM), time-us  (HH:MM AM), timesec-us  (HH:MM:SS AM),
  // date-iso(YYYY-MM-DD), datetime-iso(YYYY-DD-DD HH:MM),    datetimesec-iso(YYYY-DD-DD HH:MM),       time-iso (HH:MM),    timesec-iso (HH:MM:SS),
  // --------------------------------------------------------------------------------------------------------------------------------------------------

  // --- prepare ---
  res = trim(value).toUpperCase();
  res = res.replace(/[^\\A-Za-z0-9:\-\.\x2F]/g, " ");
  res = res.replace(/\\/g, "/");
  res = res.replace(/\./g, "/");
  res = res.replace(/\,\s/g, " ");
  res = res.replace(/\s+/g, " ");
  // --- extract AM/PM ---
  var timePM = false;
  var timeAM = false;
  if (res.match(/:[0-9]{2}\s?[A|P]M/)) {
    if (res.match(/:[0-9]{2}\s?PM/)) { timePM = true; }
    if (res.match(/:[0-9]{2}\s?AM/)) { timeAM = true; }
    res = res.replace(/(:[0-9]{2})\s?[A|P]M/, "$1");
  }
  // --- extract time ---
  var timeHH = '00';
  var timeMM = '00';
  var timeSS = '00';
  var HHMMSS = /^(.*)([0-9]{2}:[0-9]{2}:[0-9]{2})(.*)$/;
  var HHMM   = /^(.*)([0-9]{2}:[0-9]{2})(.*)$/;
  if (res.match(HHMMSS)) {
    time = res.replace(HHMMSS,"$2");
    res  = res.replace(HHMMSS,"$1 $3");
    timeHH = format2Digit(time.replace(/^([0-9]{2}).*$/,"$1"));
    timeMM = format2Digit(time.replace(/^.*:([0-9]{2}):.*$/,"$1"));
    timeSS = format2Digit(time.replace(/^.*([0-9]{2})$/,"$1"));
  } else if (res.match(HHMM)) {
    time = res.replace(HHMM,"$2");
    res  = res.replace(HHMM,"$1 $3");
    timeHH = format2Digit(time.replace(/^([0-9]{2}).*$/,"$1"));
    timeMM = format2Digit(time.replace(/^.*([0-9]{2})$/,"$1"));
  }
  // --- convert AM/PM to ISO and back ---
  if (timePM && format.match(/-iso/)) {
    timeH = Number(timeHH);
    if (timeH>=1 && timeH<=11) { timeHH = format2Digit(''+(timeH+12)); }
  }
  if (timeAM && format.match(/-iso/)) {
    timeH = Number(timeHH);
    if (timeH==12) { timeHH = '00'; }
  }
  if (!timeAM && !timePM && format.match(/-us/)) {
    timeH = Number(timeHH);
    if (timeH==0) { timeHH = '12'; timeAM = true; }
    if (timeH>=13 && timeH<=23) { timeHH = format2Digit(''+(timeH-12)); timePM = true; }
  }
  // --- ectract date ---
  var Months =[["01","Jan","January"],["02","Feb","February"],["03","Mar","March"],["04","Apr","April"],["05","May","May"],["06","Jun","June"],
               ["07","Jul","July"],["08","Aug","August"],["09","Sep","September"],["10","Oct","October"],["11","Nov","November"],["12","Dec","December"]];
  var dateYYYY = '2000';
  var dateYY   = '20';
  var dateMM   = '01';
  var dateDD   = '01';
  var i;
  for (i in Months) {
    res = res.replace((Months[i][2]).toUpperCase(),Months[i][0]);
    res = res.replace((Months[i][1]).toUpperCase(),Months[i][0]);
  }
  res = res.replace(/[^0-9]/g, " ");
  res = res.replace(/\s+/g, " ");
  res = trim(res);
  res = res.replace(/^([0-9]{4})\s([0-9]{1,2})\s([0-9]{1,2})$/,"$2 $3 $1");
  res = res.replace(/^([0-9]{1,2})\s([0-9]{1,2})\s([0-9]{2})$/,"$1 $2 "+dateYY+"$3");
  res = res.replace(/^([0-9]{1,2})\s([0-9]{1,2})$/,"$1 $2 "+dateYYYY);
  if (res.match(/^([0-9]{1,2})\s([0-9]{1,2})\s([0-9]{4})$/)) {
    var dateYYYY = res.replace(/^.*([0-9]{4})$/,"$1");
    var dateMM   = format2Digit(res.replace(/^([0-9]{1,2})\s.*$/,"$1"));
    var dateDD   = format2Digit(res.replace(/^.*\s([0-9]{1,2})\s.*$/,"$1"));
  }
  // --- prepare result ---
  result = '';
  // --- format date ---
  if (format.match(/date/)) {
    if (format.match(/-us/)) { resDate = dateMM+'/'+dateDD+'/'+dateYYYY; }
    else                     { resDate = dateYYYY+'/'+dateMM+'/'+dateDD; }
    result = resDate;
  }
  // --- format time ---
  if (format.match(/time/)) {
    resTime = timeHH+':'+timeMM;
    if (format.match(/sec/)) { resTime = resTime+':'+timeSS; }
    if (format.match(/-us/)) {
      if (timeAM) { resTime = resTime +' AM'; }
      if (timePM) { resTime = resTime +' PM'; }
    }
    result = result + ' ' + resTime;
  }
  return trim(result);
}

function ValidateInput(Obj,IptutType,StrCase,MinValue,MaxValue,Required) {
  //type=name,string,phone,phone-int,phone-us,zip,zip5,zip+4,email,date,date-iso,date-us,time,time24,time-us,state,ssn,float,int,money,host,ip,mac,file,www
  //new zip,date,time,color,color-web,phone,phone-int,phone-us,mac
  //case=capitalize,uppercase,lowercase,normal
  var res = Obj.value;
  var Invalid = false;
  if (IptutType!="string") { res = trim(res); }

  if (StrCase=="capitalize") { res = capitalize(res); }
  else if (StrCase=="uppercase") { res = res.toUpperCase(); }
  else if (StrCase=="lowercase") { res = res.toLowerCase(); }

  if (IptutType=="name" || IptutType=="string") {
    Invalid = Invalid || (Required && res=="");
  } else if (IptutType=="int") {
    res = res.replace(/[\s\.]/g,"");
    Invalid = Invalid || !res.match("^[-+]?[0-9]*$");
    if (!Invalid) { res = Number(res); }
  } else if (IptutType=="icq") {
    res = res.replace(/[^0-9]/g,"");
    Invalid = Invalid || !res.match("^[0-9]*$");
    if (!Invalid) { res = "icq:"+res; }
  } else if (IptutType=="float") {
    res = res.replace(/\s/g,"");
    Invalid = Invalid || !res.match("^[-+]?[0-9]*\.?[0-9]+$");
    if (!Invalid) { res = Number(res); }
  } else if (IptutType=="tel") {
    res = formatTel(res);
    Invalid = Invalid || !res.match(/^[0-9\s\t\r\n\-\+\(\)\\\/]*$/);
  } else if (IptutType=="zip") {
    res = res.replace(/\D/g, "");
    if (res.length==9) { res = res.replace(/^(.{5})(.{4})$/,"$1-$2"); }
    Invalid = Invalid || !res.match(/(^(\d{5}$)$)|(^\d{5}-\d{4}$)/);
  } else if (IptutType=="mailto") {
    Invalid = Invalid || !res.match(/^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9a-zA-Z.-]*(.){1}[a-zA-Z]{2,4})+$/);
  } else if (IptutType=="www") {
    if (!res.match("^(http(s)?://).*$")) { res = "http://" + res; }
    // res.match("(^www\..*$)|(^.*\.(com|net|org|gov|biz|info|name|ch|uk|tv|fm|pl|eu|de|us|su|ru|ua|md|cn|in)(\..*)?$)|(^(\d{1,3}\.){3}\d{1,3}$)")
    Invalid = Invalid || !res.match("^(http(s)?://)?[0-9a-zA-Z.-/]*$");
  } else if (IptutType=="skype") {
    if (!res.match("^skype:.*$")) { res = "skype:" + res; }
    Invalid = Invalid || !res.match("^skype:.*$");
  } else if (IptutType.match(/date/) || IptutType.match(/time/)) {
    res = formatDate(res,IptutType);
  } else if (IptutType=="time-us") {
    res = res.toUpperCase();
    res = res.replace(/[^0-9APM]/g, "");
    if (res.length==6) { res = res.replace(/^(.{2})(.{2})(.{2})$/,"$1:$2 $3"); }
    Invalid = Invalid || !res.match(/^([0-9]|1[0-2]):[0-5][0-9] [AP]M$/);
  } else if (IptutType=="time24") {
    res = res.replace(/\D/g, "");
    if (res.length==4) { res = res.replace(/^(.{2})(.{2})$/,"$1:$2"); }
    Invalid = Invalid || !res.match(/^([0-1][0-9]|[2][0-3])(:([0-5][0-9])){1,2}$/);
  } else if (IptutType=="money") {
    //res = res.replace(/[^0-9\.]/g, "");
    res = formatCurrency(res);
    Invalid = Invalid || !res.match(/^\-?\$[0-9\,]*(\.[0-9]{2})?$/);
  } else if (IptutType=="host") {
    Invalid = Invalid || !res.match(/^[a-zA-Z\-\._0-9]*$/);
  } else if (IptutType=="ssn") {
    res = res.replace(/\D/g, "");
    if (res.length==9) { res = res.replace(/^(.{3})(.{2})(.{4})$/,"$1-$2-$3"); }
    Invalid = Invalid || !res.match(/^\d{3}-\d{2}-\d{4}$/);
  }

  if (MaxValue) { Invalid = Invalid || res>MaxValue };
  if (MinValue) { Invalid = Invalid || res<MinValue };

  Obj.value = res;
  if (!Required && res=="") { Invalid = false; }
  if (Invalid) { RemoveClassName(Obj,'input-ok');    AddClassName(Obj,'input-error'); }
          else { RemoveClassName(Obj,'input-error'); AddClassName(Obj,'input-ok'); }
  return !Invalid;
}
