//*********** behavior version *******************************
document.VERSION_YY_checkform = 4.04; //define latest version number for behavior inspector


YY_err_musthaveobjects = " Your form must contain form objects in order to apply this behavior.";
YY_err_musthavename = "The Form has no name, name the form tag first.";

//******************* BEHAVIOR FUNCTION **********************

function YY_checkform() { //v4.04
//copyright (c)1998,2001 Yaromat.com
  var args = YY_checkform.arguments; var myDot=true; var myV=''; var myErr='';var addErr=false;
  var myForm = MM_findObj(args[0]);
  for (var i=1; i<args.length;i=i+4){
    if (args[i+1].charAt(0)=='#'){var myReq=true; args[i+1]=args[i+1].substring(1);}else{myReq=false}
    var myObj = MM_findObj(args[i].replace(/\[\d+\]/ig,""));
    myV=myObj.value;
    if (myObj.type=='text'||myObj.type=='password'){
      if (myReq&&myObj.value.length==0){addErr=true}
      if ((myV.length>0)&&(args[i+2]==1)){ //fromto
        if (!(myV/1)||myV<args[i+1].split('_')[0]/1||myV > args[i+1].split('_')[1]/1){addErr=true}
      }
      if ((myV.length>0)&&(args[i+2]==2)&&!myV.match("^[\\w\\.=-]+@[\\w\\.-]+\\.[a-z]{2,4}$")){addErr=true}// email
      if ((myV.length>0)&&(args[i+2]==3)){ // date
        var myMa=args[i+1].split("#"); var myAt=myV.match(myMa[0]);
        if(myAt){
          var myD=(myAt[myMa[1]])?myAt[myMa[1]]:1; var myM=myAt[myMa[2]]-1; var myY=myAt[myMa[3]];
          var myDate=new Date(myY,myM,myD);
          if(myDate.getFullYear()!=myY||myDate.getDate()!=myD||myDate.getMonth()!=myM){addErr=true};
        }else{addErr=true}
      }
      if ((myV.length>0)&&(args[i+2]==4)){ // time
        var myMa=args[i+1].split("#"); var myAt=myV.match(myMa[0]);if(!myAt){addErr=true}
      }
      if (myV.length>0&&args[i+2]==5){ // check this 2
            var myObj1 = MM_findObj(args[i+1].replace(/\[\d+\]/ig,""));
            if(!myObj1[args[i+1].replace(/(.*\[)|(\].*)/ig,"")].checked){addErr=true}
      }
      if (myV.length>0&&args[i+2]==6){ // the same
            var myObj1 = MM_findObj(args[i+1]);
            if(myV!=myObj1.value){addErr=true}
      }
    }else
    if (!myObj.type&&myObj.length>0&&myObj[0].type=='radio'){
          var myTest = args[i].match(/(.*)\[(\d+)\].*/i);
          var myObj1=(myObj.length>1)?myObj[myTest[2]]:myObj;
      if (args[i+2]==1&&myObj1&&myObj1.checked&&MM_findObj(args[i+1]).value.length/1==0){addErr=true}
      if (args[i+2]==2){
        var myDot=false;
        for(var j=0;j<myObj.length;j++){myDot=myDot||myObj[j].checked}
        if(!myDot){myErr+='* ' +args[i+3]+'\n'}
      }
    }else
    if (myObj.type=='checkbox'){
      if(args[i+2]==1&&myObj.checked==false){addErr=true}
      if(args[i+2]==2&&myObj.checked&&MM_findObj(args[i+1]).value.length/1==0){addErr=true}
    }else
    if (myObj.type=='select-one'||myObj.type=='select-multiple'){
      if(args[i+2]==1&&myObj.selectedIndex/1==0){addErr=true}
    }else
    if (myObj.type=='textarea'){
      if(myV.length<args[i+1]){addErr=true}
    }
    if (addErr){myErr+='* '+args[i+3]+'\n'; addErr=false}
  }
  if (myErr!=''){alert('Le informazioni richieste sono incomplete o contengono errori:\t\t\t\t\t\n\n'+myErr)}
  document.MM_returnValue = (myErr=='');
}


//******************* API **********************
//

function canAcceptBehavior(){
  var nameArray = getAllObjectRefs("NS 4.0","INPUT/TEXT","TEXTAREA","INPUT/PASSWORD","INPUT/RADIO","SELECT","TEXTAREA");
  return (nameArray.length > 0);
}

function behaviorFunction(){
  return "MM_findObj,YY_checkform";
}

function applyBehavior(uniqueName) {
  var myRefs = getObjectRefs("IE 4.0", "document", "FORM");
  var myForm = yyAllForms.options[yyAllForms.selectedIndex].text
  if(myForm=="unnamed <form>")return YY_err_musthavename;
  if(objArray.length==0)return YY_err_musthaveobjects;
  myErr="";
  var myArgs = "'"+escQ(myForm)+"'";
  for (var i=0;i<objArray.length;i++) {
    var myErrMsg = objArray[i][3]+"";
    var myErrMsg = escQ(yyReplace(myErrMsg, '"', "'"));
    if (objArray[i][5]>0||(objArray[i][4]&&objArray[i][4].charAt(0)=='#'))myArgs+=",'"+objArray[i][0]+"','"+objArray[i][4]+"','"+objArray[i][5]+"','"+myErrMsg+"'"
  }
  if (!myErr){
    updateBehaviorFns("YY_checkform");
    updateBehaviorFns("MM_findObj");
    return "YY_checkform("+myArgs+")";
  }else return myErr;
}

function inspectBehavior(msgStr){
  var argArray = getTokens(msgStr,"()',");
  var myLength = (argArray.length-2)/4
  var j=3;
  var myAction = getTokens(argArray[1],".")
  myAction = myAction[myAction.length-1]
  scanMenuText(yyAllForms, myAction)
  getFormObjects(myAction, false);
  for (var i =0; i<myLength; i++) {
    for (var k =0; k<objArray.length; k++) {
      if(argArray[j-1]==objArray[k][0]){
        objArray[k][4]=argArray[j]
        objArray[k][5]=argArray[j+1]
            objArray[k][3]=unescQ(argArray[j+2])
          }
        }
        j=j+4;
  }
  //alert(yyAllObj.selectedIndex+" "+objArray[0]==false+" "+objArray.length)
  //if(objArray[yyAllObj.selectedIndex]==false){
   if(objArray[yyAllObj.selectedIndex]==null){
     alert("The Form doesn't exist anymore.")
  }else
  {
    yySetFormField();
    setErr(objArray[0][3]);
    getErr();
  }
}

//***************** LOCAL FUNCTIONS  ******************

function debug(was){
  document.layers['debug'].innerHTML=was;
}

function browseFile(wofuer){
  var fileName = browseForFileURL("select", "", true);
  if (fileName) wofuer.value = fileName;
}

var oldPanel = null;

function showPanel(was){
  //alert(was)
  if (oldPanel) {document.layers[oldPanel].visibility = 'hide'}
  oldPanel=was;
  document.layers[was].visibility = 'show';
}

/// reads the selected item from the menulist into the action field (4) of the array
/// if no item  selected insert ""
function checkBoxAndFill(myMenu, doValue){
  var myItem = myMenu.selectedIndex;
  var theValue = (doValue)?myMenu[1][myMenu.selectedIndex].value:myMenu[1][myMenu.selectedIndex].text;
  objArray[yyAllObj.selectedIndex][4]=(myItem>-1)?theValue:"";
  tocReq();
  //alert(myItem+' \n'+myMenu[myMenu.selectedIndex]+' \n'+myMenu+' \n'+theValue)
}

/// put the value from this input field into the action field (4) of the array if non selected insert ""
function textFieldAndFill(myField){
  objArray[yyAllObj.selectedIndex][4]=findObject(myField).value;
}

/// put the value myFiled into the action field (4) of the array
/// used for clearing like in the email radio
function doFill(myField){
  objArray[yyAllObj.selectedIndex][4]=myField;
}


// Radio Panel
// the radio "Must be filled too
// is only selectable if there are any text fields in the form
function test4txt(){//
  var test = (yyAllObj4RB.options.length==0);
  if(test){alert("There are no input fields in this form.");yyRbRB[0].checked=true;return false}else{return true}
}

/// scans a menu/list for the action string and set the index to this string
function scanMenuText(scanObj, myAction){
    var myCheck = 0;
    for (var i =0; i< scanObj[1].length; i++) {
        //alert(scanObj[1][i].value+"*"+scanObj[1][i].text)
        if (scanObj[1][i].value==myAction||scanObj[1][i].text==myAction){
           myCheck=i;
        }
    }
    scanObj.selectedIndex = myCheck;
}


/// set the state of the items into the focused field
function yySetFormField(){
  var myCheck = 0; myIndex = 0;
  //alert(objArray[yyAllObj.selectedIndex]==null)

  var myField = objArray[yyAllObj.selectedIndex][2];
  //alert(myField)
  var myCheckbox = '';
  var myAction = objArray[yyAllObj.selectedIndex][4]; // the action string

  if (myField=="lCheckbox"){
    myCheckbox=yyRbCB;
    scanMenuText(yyAllObj4CB, myAction)
  }
  if (myField=="lRadio"){
    ////DEBUG
    ////alert(myField);
    myCheckbox=yyRbRB;
    scanMenuText(yyAllObj4RB, myAction)
  }
  if (myField=="lText") {
     myCheckbox=yyRbText;
         if (myAction){
           yyReq.checked=(myAction.charAt(0)=='#')
           if (myAction.charAt(0)=='#')myAction=myAction.slice(1);
         }else{yyReq.checked=false}
         if (objArray[yyAllObj.selectedIndex][5]==6){scanMenuText(yyAllObj6Text, myAction)}else{yyAllObj6Text.selectedIndex=0};
         if (objArray[yyAllObj.selectedIndex][5]==5){scanMenuText(yyAllObj5Text, myAction)}else{yyAllObj5Text.selectedIndex=0};
         if (objArray[yyAllObj.selectedIndex][5]==3){scanMenuText(yySDate, myAction)}else{yySDate.selectedIndex=0};
         if (objArray[yyAllObj.selectedIndex][5]==4){scanMenuText(yySTime, myAction)}else{yySTime.selectedIndex=0};
         if (objArray[yyAllObj.selectedIndex][5]==1){
           myAction=getTokens(myAction,'_');
           findObject("nFrom").value=myAction[0]
           findObject("nTo").value=myAction[1]
         }
  }
  if (myField=="lMenu")  myCheckbox=yyRbMenu;
  if (myField=="lTextarea"){
     myCheckbox=yyRbArea;
     if (objArray[yyAllObj.selectedIndex][5]==1){findObject("MinLineField").value=myAction}else{ findObject("MinLineField").value=""}
  }

  if (!objArray[yyAllObj.selectedIndex][5])objArray[yyAllObj.selectedIndex][5]=0;
  myCheckbox[objArray[yyAllObj.selectedIndex][5]].checked="1"

//////////// debug only ////////////
//
//  for (var i in myCheckbox) {
//    if (myCheckbox[i].checked=="1") {
//          myCheck=myField+' is '+ i;
//          myIndex = i;
//        }
//  }
//
  //debug(myCheck)

////////////////////////////////////
}

function isVal(was, theField, canNegative, canFloat){
  if (isNaN(was)||(was<0&&canNegative==false)){
   return "* Field '"+theField+"' needs a"+((canNegative==true)?"":" postive")+((canFloat==true)?" numeric":" integer")+" value; \n"
  } else {return ""}
}

//// this is for number field validation
function setNumber(wer){
  var nF = findObject("nFrom").value;
  var nT = findObject("nTo").value;
  if(nF!='' && nT!=''){
    var myNerr = isVal(nF,'Number from',true, true);
    if(myNerr!=""){alert(myNerr); return}
    var myNerr = isVal(nT,'Number to',true, true);
    if(myNerr!=""){alert(myNerr); return}
    var myNerr = (nF>nT)?" The field 'number from' must be lower than 'number to'.":"";
    if(myNerr!=""){alert(myNerr); return}

    objArray[yyAllObj.selectedIndex][4]=findObject("nFrom").value+'_'+ findObject("nTo").value;
    tocReq();
    yyRbText[1].checked=1;
    addVal(1);
  }else {
    addVal(0);
  }
}

//// just another form field - show new panel and error msg and fill
function fieldChanged(si){
  showPanel(objArray[si][2]);
  setErr(objArray[si][3])
  yySetFormField()
}

////  field or menu changed, turn on the radio "wer"
////  wer is the radio object
////  was is the index
function setVal(rufer, wer, was){
  if (rufer.selectedIndex>0){
    wer[was].checked=1;
    addVal(was);
  }
}


//// radio button changed
function addVal(was){
  if (!objArray[yyAllObj.selectedIndex][4])objArray[yyAllObj.selectedIndex][4]="q";
  objArray[yyAllObj.selectedIndex][5]=was;
}

//// toggle the reqired flag (#)
function tocReq(){
 // valueArray[valueArray.length] = objArray[yyAllObj.selectedIndex];
 if (!objArray[yyAllObj.selectedIndex][4])addVal(0);
 if (yyReq.checked){
   if (objArray[yyAllObj.selectedIndex][4].charAt(0)!="#") objArray[yyAllObj.selectedIndex][4]="#"+objArray[yyAllObj.selectedIndex][4];
 }else{
   if (objArray[yyAllObj.selectedIndex][4].charAt(0)=="#") objArray[yyAllObj.selectedIndex][4]=objArray[yyAllObj.selectedIndex][4].slice(1);
 }

}

//// remove the check value from item
function delVal(was){
  objArray[yyAllObj.selectedIndex][4]="";
  objArray[yyAllObj.selectedIndex][5]=0;
}

//// show the error msg in field errMsg
function setErr(was){
  yyErrMsg.value=was;
}

//// get the error message into the array
function getErr(){
  objArray[yyAllObj.selectedIndex][3]=yyErrMsg.value;
}


//// read all elements and store it into an array
function readRefs(icon, what, formname, layerref){
  var i=0;
  var myRefs = getObjectRefs("NS 4.0", "document", what);
  for (i =0;i<myRefs.length;i++) {
    myObj =getTokens(myRefs[i], '.')
    if (myObj[myObj.length-2]==formname){
      nameArray[nameArray.length]= icon + myObj[myObj.length-1]
      var obErr="Field \""+myObj[myObj.length-1]+"\" is not valid.";
      objArray[objArray.length]= new Array(myObj[myObj.length-1], what, layerref, obErr);
      if (layerref=="lRadio"){
        //// DEBUG
        ////alert(what+"*"+formname+"*"+layerref+"*"+myObj[myObj.length-1])
        yyAllObj5Text.options[yyAllObj5Text.options.length]=new Option(myObj[myObj.length-1]); //load cb list
      }

      if (layerref=="lCheckbox"){
        //yyAllCB.options[yyAllCB.options.length]=new Option(myObj[myObj.length-1]); //load cb list
        yyAllObj5Text.options[yyAllObj5Text.options.length]=new Option(myObj[myObj.length-1]); //load cb list
      }
      if (layerref=="lText"){
        yyAllObj4CB.options[yyAllObj4CB.options.length]=new Option(myObj[myObj.length-1]);
        yyAllObj4RB.options[yyAllObj4CB.options.length]=new Option(myObj[myObj.length-1]);
        yyAllObj6Text.options[yyAllObj6Text.options.length]=new Option(myObj[myObj.length-1]);
      }
    }
  }
}

// add or delete an checkbox to the list (at least one of them)
// discontinued
function delAddCb(){
}

//// empty a menu list
function killMenu(was){
  var menuLength=was.options.length;
  var i=0;
  for (i =0;i<menuLength;i++) {
   was.options[0]=null; //kill menu
  }
  was.selectedIndex = 0;
}

function getFormObjects(daForm, doShow){
  killMenu(yyAllObj);
  killMenu(yyAllObj4CB);
  killMenu(yyAllObj5Text);
  killMenu(yyAllObj6Text);
  killMenu(yyAllObj4RB);


  yyAllObj4CB.options[0]=new Option("*** select an input field ***")
  yyAllObj5Text.options[0]=new Option("*** select a field ***")

  nameArray= new Array(); // all junk in menu list
  objArray= new Array();  // just the names
  validArray = new Array(); // a array that contains all elements to validate
   readRefs('  ', "INPUT/CHECKBOX", daForm, "lCheckbox");
   readRefs('  ', "INPUT/RADIO", daForm, "lRadio");
   readRefs('  ',"INPUT/TEXT", daForm, "lText");
   readRefs('  ',"SELECT", daForm, "lMenu");
   readRefs('  ',"TEXTAREA", daForm, "lTextarea");
   readRefs('  ', "INPUT/PASSWORD", daForm, "lText");
   if((doShow) && nameArray.length==0)
     alert((daForm=="unnamed <form>")?YY_err_musthavename:YY_err_musthaveobjects)
  for (i =0;i<nameArray.length;i++) {
    yyAllObj.options[i]=new Option(nameArray[i]); //load menu
  }
  yyAllObj.selectedIndex = 0;
  yyAllObj5Text.selectedIndex = 0;
  yyAllObj4CB.selectedIndex = 0;
  if (objArray[0]) showPanel(objArray[0][2])
}

function initializeUI(){
  yyForm = findObject("myForm");
  yyErrMsg = findObject("errMsg")
  yyTextForm = findObject("textForm");
  yyRbText = findObject("rbText");
  yyReq = findObject("cbReq");
  yyRbRB = findObject("rbRB");
  yyRbCB = findObject("rbCB");
  yyRbArea = findObject("rbArea");
  yyRbMenu = findObject("rbMenu");
  yySDate = findObject("sDate");
  yySTime = findObject("sTime");
  yyAllForms = findObject("allForms");
  yyAllObj = findObject("allObj");
  yyAllObj4CB = findObject("allObjForCB");
  yyAllObj4RB = findObject("allObjForRB");
  yyAllObj5Text = findObject("allObjForText");
  yyAllObj6Text = findObject("allObjForText6");


  var formArray= new Array();
  var myRefs = getObjectRefs("NS 4.0", "document", "FORM");
  for (i =0;i<myRefs.length;i++) {
    var myObj =getTokens(myRefs[i], '.')
        formArray[formArray.length]= myObj[myObj.length-1]
  }

  for (i in formArray) {
    yyAllForms.options[i]=new Option(formArray[i]); //load menu
  }
  yyAllForms.selectedIndex = 0;
  if(formArray.length<2){
    getFormObjects(yyAllForms.options[yyAllForms.selectedIndex].text, true);
  }else{
    getFormObjects(yyAllForms.options[yyAllForms.selectedIndex].text, false);
  }
}



//*************** END OF JAVASCRIPT *****************