//http://www.cherny.com/webdev/24/domloaded-script
var DomLoaded = {
    onload: [],
    loaded: function() {
        if (arguments.callee.done) {
            return;
        }
        arguments.callee.done = true;
        for (i = 0;i < DomLoaded.onload.length;i++) {
        	DomLoaded.onload[i]();
        }
    },
    load: function(fireThis)
    {
        this.onload.push(fireThis);
        if (document.addEventListener) {
            document.addEventListener("DOMContentLoaded", DomLoaded.loaded, null);
        }
        if (/KHTML|WebKit/i.test(navigator.userAgent)) { 
            var _timer = setInterval(function() {
                if (/loaded|complete/.test(document.readyState)) {
                    clearInterval(_timer);
                    delete _timer;
                    DomLoaded.loaded();
                }
            }, 10);
        }
        /*@cc_on @*/
        /*@if (@_win32)
        var proto = "src='javascript:void(0)'";
        if (location.protocol == "https:") {
            proto = "src=//0";
        }
        document.write("<script id=__ie_onload defer " + proto + "><\/script>");
        var script = document.getElementById("__ie_onload");
        script.onreadystatechange = function() {
            if (this.readyState == "complete") {
                DomLoaded.loaded();
            }
        };
        /*@end @*/
        window.onload = DomLoaded.loaded;
    }
};

function isIE() {
    return (window.ActiveXObject);
}

function getValidateEmpty(obj) {
	return obj.getAttribute("validateEmpty");
}
function getValidationType(obj) {
	return obj.getAttribute("validationtype");
}
function getValidationArgs(obj) {
	return obj.getAttribute("validationargs");
}
function getValidationMsg(obj) {
	return obj.getAttribute("validationmsg");
}
function setValidationMsg(obj, msg) {
	return obj.setAttribute("validationmsg", msg);
}
function getDoSubmit(obj) {
	return obj.getAttribute("doSubmit");
}

function getNumberFromPx(o) {
    var regex = new RegExp("(\\d+)px");
    if (o.match(regex)) {
        return RegExp.$1;
    } else {
        return o;
    }
}

function positionRelativeTo(
    position, source, target, offsetTop, offsetLeft) {
    target.style.position = position;
    target.style.top =
        (new Number(getNumberFromPx(source.style.top))
        + offsetTop) + "px";
    target.style.left =
        (new Number(getNumberFromPx(source.style.left))
        + offsetLeft) + "px";
    //alert(target.style.top);
    //alert(target.style.left);
}

var errColor = "#FFCCCC";
var ininactiveColor = new Array();

function doInit() {
    for (var i = 0; i < document.forms.length; i++) {
        var valForm = document.forms[i];
        for (var j = 0; j < valForm.elements.length; j++) {
            eval("ininactiveColor['" + valForm.elements[j].id + "'] = new colorData('" + valForm.elements[j].style.backgroundColor + "');");
        }
    }
}

function colorData(bgcolor) {
    this.bgcolor = bgcolor;
}

function changeImage(imageBtn, image) {
    if (image.length > 7) {
        imageBtn.src = image;
    }
}

function refreshPage() {
    document.location.reload();
}

var submitError = false;

function doSubmit(valForm) {
    submitError = false;
    for (var i = 0; i < valForm.elements.length; i++) {
        if (getValidationType(valForm.elements[i])) {
            validateInput(valForm.elements[i]);
        }
    }
    if (submitError) {
        return false;
    } else {
        for (var i = 0; i < valForm.elements.length; i++) {
            // Hook postprocess routines into onSubmit
            if (getDoSubmit(valForm.elements[i])) {
                eval(getDoSubmit(valForm.elements[i]));
            }
        }
        return true;
    }
}

//==========================================================

function validateInput(formElem) {
    formElem.style.backgroundColor = ininactiveColor[formElem.id].bgcolor;
    document.getElementById("err_" + formElem.id).innerHTML = "";
    document.getElementById("err_" + formElem.id).className = "errhide";

    var valType = getValidationType(formElem);

    // Check if we are validating
    if (valType && valType != "noValidation") {
        // Check if we validate empty input
        if (getValidateEmpty(formElem) && getValidateEmpty(formElem) == "false") {
            if (isEmpty(formElem)) {
                return;
            }
        }
    }

    switch (valType) {
        case 'noValidation':
            break;
        case 'isRequired':
            isRequired(formElem);
            break;
        case 'isMinimumLength':
        case 'isMinimumLengthString':
            isMinimumLength(formElem);
            break;
        case 'isMaximumLength':
        case 'isMaximumLengthString':
            isMaximumLength(formElem);
            break;
        case 'isValidInt':
            isValidInt(formElem);
            break;
        case 'isValidAmount':
            isValidAmount(formElem);
            break;
        case 'isValidEmail':
            isValidEmail(formElem);
            break;
        case 'isValidPhoneNumber':
            isValidAreaCode(formElem);
            break;
        case 'isValidZipCode':
            isValidZipCode(formElem);
            break;
        case 'isValidDate':
            isValidDate(formElem);
            break;
        case 'isSelected':
            isSelected(formElem);
            break;
        case 'isChecked':
            isChecked(formElem);
            break;
        case 'isValidCustom':
            isValidRegex(formElem);
            break;
        case 'isValidRegex':
            isValidRegex(formElem);
            break;
    }
}

function isEmpty(formElem) {
    if (formElem.value == "") {
        return true;
    } else {
        return false;
    }
}

function isNumber(formElem) {
    if ((isEmpty(formElem)) || (isNaN(formElem.value))) {
        return false;
    } else {
        return true;
    }
}

function isRequired(formElem) {
    if (isEmpty(formElem)) {
        return showError(formElem);
    }
}

function isMinimumLength(formElem) {
    var minLength = 0;
    if (getValidationArgs(formElem)) {
        minLength = getValidationArgs(formElem);
    }
    if (getValidationMsg(formElem)) {
        setValidationMsg(formElem, getValidationMsg(formElem).replace("|X|", minLength));
    }
    if (formElem.value.length < minLength) {
        return showError(formElem);
    }
}

function isMaximumLength(formElem) {
    var maxLength = 0;
    if (getValidationArgs(formElem)) {
        maxLength = getValidationArgs(formElem);
    }
    if (getValidationMsg(formElem)) {
        setValidationMsg(formElem, getValidationMsg(formElem).replace("|X|", maxLength));
    }
    if (formElem.value.length > maxLength) {
        return showError(formElem);
    }
}

function isValidInt(formElem) {
    if ((!isNumber(formElem)) || (formElem.value.indexOf(".") != -1)) {
        return showError(formElem);
    }
}

function isValidAmount(formElem) {
    var amountStr = formElem.value;
    var nDec = 0;
    if (formElem.value.indexOf(".") != -1) {
        nDec = amountStr.substring(amountStr.indexOf(".")+1).length;
    }
    if ((!isNumber(formElem)) || (nDec!=2)) {
        return showError(formElem);
    }
}

function isValidEmail(formElem) {
    var emailStr = formElem.value;
    var emailReg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
    var emailReg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$/; // valid
    if (!(!emailReg1.test(emailStr) && emailReg2.test(emailStr))) {// if syntax is valid
        return showError(formElem);
    }
}

function isValidAreaCode(formElem) {
    phoneReg = "^(?:[\(][0-9]{3}[\)]|[0-9]{3})[-. ]?[0-9]{3}[-. ]?[0-9]{4}$";
    var regex = new RegExp(phoneReg);
    if (!regex.test(formElem.value)) {
        return showError(formElem);
    }
}

function isValidZipCode(formElem) {
    zipReg = "^[0-9]{5}(|[-]?[0-9]{4})$";
    var regex = new RegExp(zipReg);
    if (!regex.test(formElem.value)) {
        return showError(formElem);
    }
}

function isValidDate(formElem) {
    //dateReg = "^([0][0-9]|[1][1-2])[\/]([0-2][0-9]|[3][0-1])[\/][0-9]{4}$";
    //var regex = new RegExp(dateReg);

    var format = "MM/dd/yyyy";
    if (getValidationArgs(formElem)) {
        format = getValidationArgs(formElem);
    }

    if (!isDate(formElem.value, format)) {//if (!regex.test(formElem.value)) {
        return showError(formElem);
    }
}

function isSelected(formElem) {
    if (formElem.selectedIndex == 0) {
        return showError(formElem);
    }
}

function isChecked(formElem) {
    var checkFlag = false;
    // FIXME Portlets may use the same name
    var radios = document.getElementsByName(formElem.name);
    for (var i = 0; i < radios.length; i++) {
        if (radios[i].checked) {
            checkFlag = true;
            break;
        }
    }
    if (!checkFlag) {
        submitError = true;
        var errElmt = document.getElementById("err_" + formElem.id);
        if (getValidationMsg(radios[0])) {
            errElmt.innerHTML = getValidationMsg(radios[0]);
        }
        positionRelativeTo("absolute", radios[0], errElmt, 0, 0);
        //errElmt.style.offsetTop = radios[0].style.offsetTop + 4;
        //errElmt.style.posLeft = radios[0].style.posLeft + 70;
        errElmt.className = "errshow";
        for (var i = 0; i < radios.length; i++) {
            radios[i].style.backgroundColor = errColor;
        }
    } else {
        for (var i = 0; i < radios.length; i++) {
            radios[i].style.backgroundColor = ininactiveColor[formElem.id].bgcolor;
        }
    }
}

function isValidRegex(formElem) {
    var custReg = "";
    if (getValidationArgs(formElem)) {
        custReg = getValidationArgs(formElem);
    }
    var regex = new RegExp(custReg);
    if (!regex.test(formElem.value)) {
        return showError(formElem);
    }
}

function showError(formElem) {
    submitError = true;
    var errElmt = document.getElementById("err_" + formElem.id);
    if (getValidationMsg(formElem)) {
        errElmt.innerHTML = getValidationMsg(formElem);
    }
    positionRelativeTo("absolute", formElem, errElmt, 0, 0);
    //errElmt.style.posTop = formElem.style.posTop + 4;
    //errElmt.style.posLeft = formElem.style.posLeft + formElem.style.posWidth - 4;
    errElmt.className = "errshow";
    formElem.style.backgroundColor = errColor;
}





// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val,format) {
  var date=getDateFromFormat(val,format);
  if (date==0) { return false; }
  return true;
  }

// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
  var digits="1234567890";
  for (var i=0; i < val.length; i++) {
    if (digits.indexOf(val.charAt(i))==-1) { return false; }
    }
  return true;
  }
function _getInt(str,i,minlength,maxlength) {
  for (var x=maxlength; x>=minlength; x--) {
    var token=str.substring(i,i+x);
    if (token.length < minlength) { return null; }
    if (_isInteger(token)) { return token; }
    }
  return null;
  }

// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
  val=val+"";
  format=format+"";
  var i_val=0;
  var i_format=0;
  var c="";
  var token="";
  var token2="";
  var x,y;
  var now=new Date();
  var year=now.getYear();
  var month=now.getMonth()+1;
  var date=1;
  var hh=now.getHours();
  var mm=now.getMinutes();
  var ss=now.getSeconds();
  var ampm="";

  while (i_format < format.length) {
    // Get next token from format string
    c=format.charAt(i_format);
    token="";
    while ((format.charAt(i_format)==c) && (i_format < format.length)) {
      token += format.charAt(i_format++);
      }
    // Extract contents of value based on format token
    if (token=="yyyy" || token=="yy" || token=="y") {
      if (token=="yyyy") { x=4;y=4; }
      if (token=="yy")   { x=2;y=2; }
      if (token=="y")    { x=2;y=4; }
      year=_getInt(val,i_val,x,y);
      if (year==null) { return 0; }
      i_val += year.length;
      if (year.length==2) {
        if (year > 70) { year=1900+(year-0); }
        else { year=2000+(year-0); }
        }
      }
    else if (token=="MMM"||token=="NNN"){
      month=0;
      for (var i=0; i<MONTH_NAMES.length; i++) {
        var month_name=MONTH_NAMES[i];
        if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
          if (token=="MMM"||(token=="NNN"&&i>11)) {
            month=i+1;
            if (month>12) { month -= 12; }
            i_val += month_name.length;
            break;
            }
          }
        }
      if ((month < 1)||(month>12)){return 0;}
      }
    else if (token=="EE"||token=="E"){
      for (var i=0; i<DAY_NAMES.length; i++) {
        var day_name=DAY_NAMES[i];
        if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
          i_val += day_name.length;
          break;
          }
        }
      }
    else if (token=="MM"||token=="M") {
      month=_getInt(val,i_val,token.length,2);
      if(month==null||(month<1)||(month>12)){return 0;}
      i_val+=month.length;}
    else if (token=="dd"||token=="d") {
      date=_getInt(val,i_val,token.length,2);
      if(date==null||(date<1)||(date>31)){return 0;}
      i_val+=date.length;}
    else if (token=="hh"||token=="h") {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>12)){return 0;}
      i_val+=hh.length;}
    else if (token=="HH"||token=="H") {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>23)){return 0;}
      i_val+=hh.length;}
    else if (token=="KK"||token=="K") {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>11)){return 0;}
      i_val+=hh.length;}
    else if (token=="kk"||token=="k") {
      hh=_getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>24)){return 0;}
      i_val+=hh.length;hh--;}
    else if (token=="mm"||token=="m") {
      mm=_getInt(val,i_val,token.length,2);
      if(mm==null||(mm<0)||(mm>59)){return 0;}
      i_val+=mm.length;}
    else if (token=="ss"||token=="s") {
      ss=_getInt(val,i_val,token.length,2);
      if(ss==null||(ss<0)||(ss>59)){return 0;}
      i_val+=ss.length;}
    else if (token=="a") {
      if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
      else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
      else {return 0;}
      i_val+=2;}
    else {
      if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
      else {i_val+=token.length;}
      }
    }
  // If there are any trailing characters left in the value, it doesn't match
  if (i_val != val.length) { return 0; }
  // Is date valid for month?
  if (month==2) {
    // Check for leap year
    if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
      if (date > 29){ return 0; }
      }
    else { if (date > 28) { return 0; } }
    }
  if ((month==4)||(month==6)||(month==9)||(month==11)) {
    if (date > 30) { return 0; }
    }
  // Correct hours value
  if (hh<12 && ampm=="PM") { hh=hh-0+12; }
  else if (hh>11 && ampm=="AM") { hh-=12; }
  var newdate=new Date(year,month-1,date,hh,mm,ss);
  return newdate.getTime();
  }
