function ccSetRequired(obj){obj.setAttribute("required", "required");}
function ccCleanRequired(obj){obj.removeAttribute("required");}
function ccSetInvalidCharacters(obj, characters){obj.setAttribute("invalidCharacters", characters);}
function ccGetInvalidCharacters(obj){return obj.getAttribute("invalidCharacters");}
function ccValidateCharacters(sForm){
  var list = "", ret, firstObj;
  for ( j=0; j<sForm.elements.length; j++ ) {
    obj = sForm.elements[j];
    ret = ccValidateChars(obj);
    if (ret!="0") {
      list += ccValidateCharactersI18n.replace(/{label}/, ccLookupLabel(obj)).replace(/{chars}/, ret);//i18n "\n{label} can not contain the following character : {chars}"
      if (!firstObj) {firstObj = obj;}
    }
  }
  if (list) {
    alert (list + ccValidateCharactersI18n2); //i18n \n\nPlease correct your entry accordingly.
    firstObj.focus();
    return false;
  }
  return true;
}

function ccValidateChars(obj){
  var chars = ccGetInvalidCharacters(obj);
  if (chars==null || chars=='') {return 0; }
  var disp_delim='', isOK = 0;
  for (var i=0;i<chars.length;i++){
    var onechar = chars.substr(i,1);
    var retInt = obj.value.indexOf(onechar);
    if (retInt!=-1){ disp_delim = disp_delim + onechar + ' '; isOK = 1;}
  }
  if (isOK==0){return 0;} else {return disp_delim;}
}

function ccValidateObjChars(obj){
  var list = "";
  var ret = ccValidateChars(obj);
  if (ret!="0") {
    alert( ccValidateCharactersI18n.replace(/{label}/, ccLookupLabel(obj)).replace(/{chars}/, ret) );//i18n "\n{label} can not contain the following character : {chars}"
    obj.focus();
    return false;
  }
  return true;
}

var ccReqChkBxArr, ccReqRadioArr;
function ccPutReqCheckbox(obj) {
  if (!ccReqChkBxArr) { ccReqChkBxArr = new Array();}
  if (obj.checked) {ccReqChkBxArr[obj.name]="_";}
  else if (!ccReqChkBxArr[obj.name]) {ccReqChkBxArr[obj.name]=obj.id;}
}

function ccPutReqRadio(obj) {
  if (!ccReqRadioArr) { ccReqRadioArr = new Array();}
  if (obj.checked) {ccReqRadioArr[obj.name] = "_";}
  else if (!ccReqRadioArr[obj.name]) { ccReqRadioArr[obj.name] = obj.id; }
}

function ccLookupLegend(obj) {
  var parentObj = obj.parentNode;
  while(parentObj){
    if (parentObj.tagName=="FIELDSET") {
      var legendObjs = parentObj.getElementsByTagName("LEGEND");
      if (legendObjs.length>0) {
        if (document.all) {return legendObjs[0].innerText;} 
        else {return legendObjs[0].textContent;}
      //} else { for the future when browsers are more mature in aria radiogroup
      //  var role = parentObj.getAttribute("role");
      //  if (role!=null) {
      //    var labelId = parentObj.getAttribute("aria-labelledby");
      //    var labelObj = document.getElementById(labelId);
      //    if (document.all) {return labelObj.innerText;} 
      //    else {return labelObj.textContent;}
      //  }
      }
    }
    parentObj = parentObj.parentNode;
  }
  return "......";
}

function ccCheckChkBxArray() {
  var ret = "", foo;
  for (var key in ccReqChkBxArr) {
    if(key == 'toJSONString' || key == 'parseJSON'){
     continue;
    }
    foo = ccReqChkBxArr[key];
    if (foo != "_") { ret += "\n  " + ccLookupLegend(document.getElementById(foo)); }
  }
  return ret;
}

function ccCheckRadioArray() {
  var ret = "", foo;
  for (var key in ccReqRadioArr) {
    if(key == 'toJSONString' || key == 'parseJSON'){
     continue;
    }
    foo = ccReqRadioArr[key];
    if (foo != "_") { ret += "\n  " + ccLookupLegend(document.getElementById(foo)); }
  }
  return ret;
}
var ccLabels;
function ccCheckRequired(sForm) {
  var reqList = "", obj, firstObj;
  ccLabels=null;//clear cache for different form call this function.
  for ( j=0; j<sForm.elements.length; j++ ) {
    obj = sForm.elements[j];
    if (obj.getAttribute("required") == "required") {
      if (( obj.type == "text" || obj.type == "textarea" || obj.type == "select-one" 
        || obj.type == "file" || obj.type == "password" || obj.type == "hidden") && obj.value=="") {
        reqList += "\n  " + ccLookupLabel(obj);
        if (!firstObj) {firstObj = obj;}
      }
      else if (obj.type == "checkbox") {ccPutReqCheckbox(obj);} 
      else if (obj.type == "radio") {ccPutReqRadio(obj);}
    }
  }
  var reqChkBxList = ccCheckChkBxArray();
  var reqRadioList = ccCheckRadioArray();
  var alertMsg = "";
  if (reqList) {alertMsg = ccCheckRequiredI18n + reqList + "\n\n";} //i18n, You must fill in the following field(s):\n
  if (reqChkBxList) {alertMsg += ccCheckRequiredI18n2 + reqChkBxList + "\n\n";} //i18n, You must check the following checkbox(es):\n
  if (reqRadioList) {alertMsg += ccCheckRequiredI18n3 + reqRadioList;} //i18n, You must check the following radio button(s):\n
  if (alertMsg!="") {
    alert(alertMsg); if (firstObj) { firstObj.focus(); } return false;
  }
  return true;
}


function ccLookupLabel(obj) {
  if (obj.title) {return obj.title;}
  var id = obj.id;
  if (ccLabels == null) { ccLabels = obj.form.getElementsByTagName("LABEL");}
  for (var i=0; i<ccLabels.length; i++) {
    if (id==ccLabels[i].htmlFor) {return ccLabels[i].innerHTML.replace(/<[^>]*>/g,"");}
  }
  return "";
}

function ccValidateTextarea(sForm) {
  var list = "";
  var obj;
  var firstObj;
  var maxlength, len;
  var textAreaes = sForm.getElementsByTagName("TEXTAREA");
  
  for (var j=0; j<textAreaes.length; j++ ) {
    obj = textAreaes[j];
    maxlength = obj.getAttribute("maxlength");
    if (maxlength) {
      var len = obj.value.length; // ie explore
      if(!document.all){
        len = obj.value.replace(/\n/g,'\r\n').length;// firefox explore
      }
      if ( len > maxlength) {
        list += ccValidateTextareaI18n.replace(/{label}/, ccLookupLabel(obj)).replace(/{maxlength}/, maxlength).replace(/{len}/,len); //{label} only allows {maxlength} characters. You have entered {len} characters.\n
        if (!firstObj) {firstObj = obj;}
      }
    }
  }
  
  if (list) {
    list += ccValidateTextareaI18n2; //i18n \nPlease retype your entry accordingly.
    alert (list);
    firstObj.focus();
    return false;
  }
  return true;
}

function ccIsNumber(foo) {return foo.match( /^\d+$/ );}
function ccSetNumberType(obj){if(obj) obj.setAttribute("number", "number");}
function ccIsNumberObj(obj) {return (obj.getAttribute("number")!=null);}

function ccIsNumbers(sForm) {
  var numList = "", obj, firstObj;
  for ( j=0; j<sForm.elements.length; j++ ) {
    obj = sForm.elements[j];
    if (obj.type == "text" && ccIsNumberObj(obj) && !ccIsNumber(obj.value)) {
      numList += "\n  " + ccLookupLabel(obj);
      if (!firstObj) {firstObj = obj;}
    }
  }
  if (numList) {
    alert ((ccIsNumbersI18n + numList)); //i18n, Please enter number in the following field(s):\n
    firstObj.focus();
    return false;
  }
  return true;
}

function ccIsPositiveInteger(s) {
  var value = s.value;

  if (!isNaN(value) && value.match(/^\d+$/) && (value > 0)) {
    return true;
  }

  s.value = "";
  s.focus();

  return false;
}

function ccIsDigit(s){
 var a=/^(\+|-)?\d+($|\.\d+$)/.test(''+s);
 if(!a) alert(ccDigitCheckMsgI18n);
 return a;
}

function ccIsValidURL(obj) {
  var lk = obj.value.toLowerCase().trim();
  if (lk=="") return true;
  else if (lk.lastIndexOf("://") ==(lk.length-3)) {
    alert(ccIsValidURLI18n); //i18n, The URL is not completed
    obj.focus();
    return false;
  } else if (!lk.indexOf("http://")==0 || lk.indexOf("https://")==0 ) {
    return (confirm(ccIsValidURLI18n2 + obj.value)); //i18n, The URL always start with 'http://'. Please make sure the folowing URL is valid :\n\n
  }
  return true;
}

function isValidColor(obj) {
  if (obj.value.indexOf("#")==-1) {
    obj.focus();
    obj.select();
    var lb = ccLookupLabel(obj);
    if (confirm(isValidColorI18n.replace(/{color}/, obj.value).replace(/{label}/, lb) )) { //i18n, "Is {color} a valid color for {label}?\n When using hex color code, please don't forget to put # in the front.";
      return true;
    } else {
      return false;
    }
  }
  return true;
}

function ccFocusFirstField(form) {
  var obj;
  for ( j=0; j<form.elements.length; j++ ) {
    obj = form.elements[j];
    if ((obj.type == "text"||obj.type == "textarea") && !obj.disabled && obj.value=="") {
      obj.focus(); return;
    }
  }
}
ccLoadScript("js/" + ccLang + "/ccValidateForm-i18n.js");
