var VDW_BIG_INDICATOR   = 0;
var VDW_SMALL_INDICATOR = 1;

function LoadTab(params)
{   
   var url = 'content.php?'+params+'&pageWidth='+(parent.content.frameElement.clientWidth-40)+'&pageHeight='+(parent.content.frameElement.clientHeight-35);
   parent.frames['content'].location.href = url;
}

function EmptyForm(sFieldnames,sStartAttribute)
{
   var r_comma = new RegExp(",","g")
   var aFieldnames = sFieldnames.split(r_comma);
   //alert(sFieldnames);
   RemoveFocus(aFieldnames);    
   RemoveErrorColor(aFieldnames);
   EmptyFields(aFieldnames);
   RemoveFieldsAttribute(aFieldnames,sStartAttribute);
   
}

function GetKeyFieldNames(sFieldnames)
{
   var r_comma = new RegExp(",","g")
   var aFieldnames = sFieldnames.split(r_comma);
   var aKeyFieldNames = new Array();

   for(var i=(aFieldnames.length-1);i>=0;i--)
   {
      if(document.forms[0].elements[aFieldnames[i]] && document.forms[0].elements[aFieldnames[i]].getAttribute("vdw_keyfield")=='1')
      {
         aKeyFieldNames.push(aFieldnames[i]);
         continue;
      }
   }

   return aKeyFieldNames.reverse();
}

function GetQueryFieldNames(aFieldnames,sCplFieldnames)
{
   var sFormFieldnames = ExtractFormFieldNames(sCplFieldnames);
   var sQueryFieldnames = ExtractQueryFieldNames(sCplFieldnames);
   var aFormFieldnames = sFormFieldnames.split(/,/g);
   var aQueryFieldnames = sQueryFieldnames.split(/,/g);
   var aTranslatedFieldnames = [];
   for(var i=0;i<aFormFieldnames.length;i++)
   {
      if(!aFieldnames.Contains(aFormFieldnames[i]))
         continue;
      aTranslatedFieldnames.push(TranslateToQueryFieldName(aFormFieldnames[i],aFormFieldnames,aQueryFieldnames));
   }
   return aTranslatedFieldnames;
}

function TranslateToQueryFieldName(sName,aFormFieldnames,aQueryFieldnames)
{
   for(var i=(aFormFieldnames.length-1);i>=0;i--)
   {
      if(aFormFieldnames[i]!=sName)
         continue;
      
      return (aQueryFieldnames.length>i)?aQueryFieldnames[i]:sName;
   }
   return sName;
}

function TranslateToFormFieldName(sName,aFormFieldnames,aQueryFieldnames)
{
   for(var i=(aQueryFieldnames.length-1);i>=0;i--)
   {
      if(aQueryFieldnames[i]!=sName)
         continue;
      
      return (aFormFieldnames.length>i)?aFormFieldnames[i]:sName;
   }
   return sName;
}

function EmptyFields(names)
{
   for(var i=0;i<names.length;i++)
   {
      //alert(names[i]+" "+ document.forms[0].elements[names[i]].type);
      if(document.forms[0].elements[names[i]] && (document.forms[0].elements[names[i]].type=="text" || document.forms[0].elements[names[i]].type=="textarea"))
      {
         document.forms[0].elements[names[i]].value = "";  
      }
   }
}

function RemoveErrorColor(names)
{
   for(var i=0;i<names.length;i++)
   {
      element = document.forms[0].elements[names[i]];
      if(!element)
         continue;
      if(element.getAttribute("vdw_org_bgcolor"))
      {
         element.style.backgroundColor = element.getAttribute("vdw_org_bgcolor");
         element.removeAttribute("vdw_org_bgcolor");
      }
      else
         element.style.backgroundColor =""
   }
}


function RemoveFieldsAttribute(fieldnames,attrname)
{
   for(var i=0;i<fieldnames.length;i++)
   {
      if(document.forms[0].elements[fieldnames[i]] && document.forms[0].elements[fieldnames[i]].getAttribute(attrname))
      {
         //alert(fieldnames[i]+" attribute:"+attrname+" value:"+document.forms[0].elements[fieldnames[i]].getAttribute(attrname));
         document.forms[0].elements[fieldnames[i]].removeAttribute(attrname);
      }
   }
}


function RemoveFocus(names)
{
   for(var i=0;i<names.length;i++)
   {
      if(document.forms[0].elements[names[i]] && (document.forms[0].elements[names[i]].type=="text" || document.forms[0].elements[names[i]].type=="textarea"))
      {
         ActivateEvent(document.forms[0].elements[names[i]],"blur");
      }
   }
   
}

function checkKey(evt,value)
{
   var oEvent = new vdwevent(evt);
   if(oEvent.keyCode(evt) == value)
   {
     return true;
   }
  return false;
}

function NextEditBox(evt,code,oInput)
{
   if(checkKey(evt,code))
   {
      if(oInput.tabIndex>0)
         SetFocusOn(oInput.tabIndex+1);
      else
         SetFocusOn(GetEditBoxdNr(oInput)+1);
   }
}

function SetFocusOn(iTabIndex)
{
   var len = document.forms[0].elements.length;
   var fl_found = false;
   if(!iTabIndex || iTabIndex<=0)
   {
      iTabIndex=1;
   }

   for(var i=len-1;i>=0;i--)
   {
      if(!document.forms[0].elements[i])
         continue;

      if(document.forms[0].elements[i].tabIndex==iTabIndex)
      {
         if(document.forms[0].elements[i].readOnly || document.forms[0].elements[i].disabled || VDWIsHidden(document.forms[0].elements[i]))
         {
            i=len-1;
            iTabIndex++;
            continue;
         }
         
         document.forms[0].elements[i].focus();
         if (document.forms[0].elements[i].type == "text" || document.forms[0].elements[i].type == "password")
         {
            document.forms[0].elements[i].select();
         }
         
         fl_found = true;
         break;
      }
   }

   if(!fl_found)
   {
      /* next tabIndex not founded search the first one */
      if(iTabIndex!=1)
      {
         for(var i=0;i<len;i++)
         {
            if(document.forms[0].elements[i].tabIndex==1)
            {
               if(!(document.forms[0].elements[i].readOnly || document.forms[0].elements[i].disabled || VDWIsHidden(document.forms[0].elements[i])))
               {
                  document.forms[0].elements[i].focus();
                  if (document.forms[0].elements[i].type == "text" || document.forms[0].elements[i].type == "password")
                  {
                     document.forms[0].elements[i].select();
                  }
               }

               fl_found = true;
               break;
            }
         }
      }

      /* no tabIndex 1 defined take the first field */
      if(!fl_found)
      {
         var founded = 0;
         for(var i=0;i<len;i++)
         {
            if((document.forms[0].elements[i].type!="text" && document.forms[0].elements[i].type!="password"))
               continue;
            
            founded++;
            
            if(founded!=iTabIndex || document.forms[0].elements[i].readOnly || document.forms[0].elements[i].disabled || document.forms[0].elements[i].tabIndex<0)
            {
               if(founded==iTabIndex)iTabIndex++;
               continue;
            }
            
            document.forms[0].elements[i].focus();
            document.forms[0].elements[i].select();
            fl_found = true;
            break;
         }

         /* take the first of the form */
         if(!fl_found)
         {
            for(var i=0;i<len;i++)
            {
               if((document.forms[0].elements[i].type!="text" && document.forms[0].elements[i].type!="password")|| document.forms[0].elements[i].style.display=="none")
                  continue;

               if(document.forms[0].elements[i].readOnly || document.forms[0].elements[i].tabIndex<0 )
                  continue;

               document.forms[0].elements[i].focus();
               document.forms[0].elements[i].select();
               break;
            }
         }
      }
   }
   return ;
}
function GetEditBoxdNr(oInput)
{
   var founded = 0;
   var fl_found = false;
   var len = document.forms[0].elements.length;
   for(var i=0;i<len;i++)
   {
      if(document.forms[0].elements[i].type!="text" && document.forms[0].elements[i].type!="password")
         continue;
      
      founded++;
      if(document.forms[0].elements[i]!=oInput)
         continue;
      
      fl_found = true;
      break;
   }
   
   if(!fl_found)
      founded=0;
   //alert(founded);
   return founded;
}
function ChangeValue(oForm,variable,value)
{
   if(!oForm.elements[variable])
      return 1;
   oForm.elements[variable].value=value;
}

function NewValue(oForm,variable,value)
{
   if(oForm.elements[variable])
      return 1;
   var dum = 'INPUT';
   if(window.external && /Win/.test(navigator.userAgent))
      dum="<INPUT name=\""+variable+"\">";
   
   var newElement = document.createElement(dum);
   newElement.type="hidden";
   newElement.name=variable;
   newElement.value=value;
   oForm.appendChild(newElement);
   return 0;
}
function use(name)
{
   var value = "";
   if(document.forms[0] && document.forms[0].elements[name])
   {
      value = document.forms[0].elements[name].value;
   }
   return value ;
}

function SetReadOnly(element)
{
   if(!element)   return;
   element.className="disabled";
   element.readOnly = true;
}

function SetDisable(element)
{
   if(!element)   return;
   element.className="disabled";
   element.disabled=true;
}

function SetActivate(element)
{
   if(!element)   return;
   element.className='';
   
   if(element.disabled)
      element.disabled=false;

   if(element.readOnly)
      element.readOnly=false;
}

function CountCheckedCheckboxs(form1)
{
   var elems=form1.elements.length;
   var count=0;
   for(var i=0;i<elems;i++)
   {
      if(form1.elements[i].type=="checkbox")
      {
         if(form1.elements[i].checked) count++;
      }
   }
   return count;
}

function SelectAllCheckboxs(form1)
{
   var elems=form1.elements.length;
   var count=0;
   selected?selected=false:selected=true;
   for(var i=0;i<elems;i++)
   {
      if(form1.elements[i].type=="checkbox")
      {
         form1.elements[i].checked=selected;
      }
   }
}

function SetNextPage(form1,name1)
{
   var elems=form1.elements.length;
   var i=0;
   for(i=0;i<elems;i++)
   {
      if(form1.elements[i].name=="xml_param")
      {
         form1.elements[i].value=name1;
         return;
      }
   }
   return (1);
}

function Location(string)
{
   document.location=string;
}

function EvaluateValues(str,fieldname)
{
   statements = GetStatements(str);
   //Call the function
   var r_comma = new RegExp(",","");
   var filename = "";
   var postData = "";
   var retCol = "0";
   var list_options = "";
   var grid_options = "";   
   var funcName = "";
   var arr = null;
   var arg = "";
   var r_innerstatements = new RegExp("([=\\s][']?)(use|useAttribute)\\((.*?)\\)", "i");
   var func_inner_statement = null;
   
   for(var i=0;i<statements['name'].length;i++)
   {
      if(statements['name'][i]=="dialog_box")
      {
         filename = statements['argument'][i];
         continue;
      }
      
      if(statements['name'][i]=="variables")
      {
         arr = statements['argument'][i].split(r_comma);
         //verifie vars if correct and concat it to string &amp; separator
         arg="";
         for(var j=0;j<arr.length;j++)
         {
            arg += Trim(arr[j]);
            if(arg.charAt(0)=='[' && arg.charAt(arg.length-1)==']')
            {
               //get inner statements
               while(r_innerstatements.test(arg))
               {
                  res = arg.match(r_innerstatements);
                  //res[0] : string to replace
                  //res[1] : separator (= or \s)                  
                  //res[2] : statement name
                  //res[3] : statement value
                  if(res[2]=="useAttribute")
                  {
                     var useAttributes_args = res[3].split(r_comma);
                     value = ""
                     if(useAttributes_args.length>2 && document.forms[0].elements[useAttributes_args[0]] && document.forms[0].elements[useAttributes_args[0]].getAttribute(useAttributes_args[1]))
                     {
                        value = document.forms[0].elements[useAttributes_args[0]].getAttribute(useAttributes_args[1]);
                     }
                     arg=arg.replace(r_innerstatements,res[1]+value);
                  }
                  else
                  if(res[2]=="use")
                  {
                     value=document.forms[0].elements[res[3]].value;
                     while(r_comma.test(value))
                        value=value.replace(r_comma,"|");
//                     value="\'"+value+"\'";
                     arg=arg.replace(r_innerstatements,res[1]+value);
                  }
               }
               //argument complet
               if(postData.length==0)
                  postData = arg.substr(1,arg.length-2);
               else
                  postData += "&"+arg.substr(1,arg.length-2);
               arg="";
               continue;
            }
            arg +=",";
           // alert(arg);
         }
         continue;
      }

      if(statements['name'][i]=="function")
      {
         funcName = statements['argument'][i];
         func_inner_statement = GetStatements(funcName);
         nr_inner_statement=func_inner_statement["name"].length;
         for(var j=0;j<nr_inner_statement;j++)
         {
            eval(func_inner_statement["name"][j]+"(\""+func_inner_statement["argument"]+"\")");
         }         
         continue;
      }
      
      if(statements['name'][i]=="return")
      {
         retCol = statements['argument'][i];
         continue;
      }
      
      if(statements['name'][i]=="datalistoptions")
      {
         list_options = statements['argument'][i];
         continue;
      }

      if(statements['name'][i]=="datagridoptions")
      {
         grid_options = statements['argument'][i];
         continue;
      }
      
      continue;
   }
   str = "content.php?xml_param="+filename;
   str += "&"+postData;
   str += "&retCol="+retCol;
  
   if(fieldname.length>0)
      str += "&retFieldName="+fieldname
   
   if(list_options.length>0)
         str+="&datalistoptions="+list_options;

   if(grid_options.length>0)
         str+="&datagridoptions="+grid_options;

//   str = escape(str);
   vdwwindow.popups[vdwwindow.PreparePopup(str,"listValues","w=600","h=450","p=center","c=no","d=no","full=no","menubar=no","status=no","titlebar=no","toolbar=no","loc=no")].Open();
}

function EvaluateString(str)
{
   var statements = GetStatements(str);
   var nr_statements = statements["name"].length;
   var inner_statement = null;
   var nr_inner_statement=0;
   
   for(var i=0;i<nr_statements;i++)
   {
      if(statements['name'][i]=="function")
      {
         inner_statement = GetStatements(statements['argument'][i]);
         nr_inner_statement=inner_statement["name"].length;
         for(var j=0;j<nr_inner_statement;j++)
         {
            eval(inner_statement["name"][j]+"(\""+inner_statement["argument"]+"\")");
         }
      }
   }

}

function SelectWholeTable(object,func1,func2)
{
   var table = null;
   var select = true;
   table = object;
   
   if(object.getAttribute('select')=='1')
      select=false;
   
   while((table = table.parentNode)!=null)
   {
      if(table.tagName=="TABLE")
         break;
   }
   if(table==null)
   {
      return;
   }
   
   var element = table;
   table = NextElement(element,1);
   while(element=NextElement(element,0))
   {
      if(element.tagName=='INPUT' && element.getAttribute('type')=="checkbox")
      {
         element.checked=select;
         if(select)
         {
            if(typeof func1 == "function")
            {
               func1(element);
            }
         }
         else
         {
            if(typeof func2 == "function")
            {
               func2(element);
            }
         }
         continue;
      }

      if(element==table)
         break;
   }

   object.setAttribute('select',(select)?'1':'0')
}

function SetIndicator(bool,action,type)
{
   if(!type || type==VDW_SMALL_INDICATOR)
   {
      SetSmallIndicator(bool,action) 
   }
   else
   if(type==VDW_BIG_INDICATOR)
   {
      SetBigIndicator(bool,action);
   }
   
}

/* SetLoading */
function SetBigIndicator(bool,action,top,left)
{
   var dIndicator = document.getElementById("dIndicator");
   var principal = document.getElementById('principal');

   /* force to set Loading at all Indicators */
   action = messages[language][88];
   
   if(!dIndicator)
   {
      dIndicator = VDW_CreateElement("div","dIndicator","")
      dIndicator.className = 'content_dIndicator';
      dIndicator.innerHTML = '<p class="content_dIndicator"><img class="content_dIndicator" src="images/indicator_medium.gif"/><br/><br/>'+action+'</p>';
      dIndicator.style.display = 'none';
      document.body.appendChild(dIndicator);
   }
   
   if(bool)
   {
      dIndicator.style.display = '';
      if( top && left)
      {
         dIndicator.style.left = left;
         dIndicator.style.top  = top;
      }
      else
      if( !principal || (parseInt(principal.style.width)==0 || parseInt(principal.style.height)==0) )
      {
         dIndicator.style.left = Math.round((document.body.clientWidth - dIndicator.clientWidth) / 2);
         dIndicator.style.top = Math.round((document.body.clientHeight - dIndicator.clientHeight) / 2) + document.body.scrollTop;
      }
      else
      {
         dIndicator.style.left = Math.round((parseInt(principal.style.width) - dIndicator.clientWidth) / 2);
         dIndicator.style.top = Math.round((parseInt(principal.style.height) - dIndicator.clientHeight) / 2) + document.body.scrollTop;
      }
      /*dIndicator.innerHTML = action;      
      indicator_timer=setTimeout("LoadingAnimation(0,'" + action + "')",indicator_loadingtime);*/
   }
   else
   {
      dIndicator.style.display = 'none';
      //clearTimeout(indicator_timer);
   }
}

/* SetLoading */
function SetSmallIndicator(bool,action)
{
   var dIndicator = document.getElementById("dIndicator_small");
   var toolbar = document.getElementById('toolbar');
   /* if no toolbar defined set big indicator */
   if(!toolbar)
   {
      SetBigIndicator(bool,action);
      return;
   }

   /* force to set Loading at all Indicators */
   action = messages[language][88];
   
   if(!dIndicator)
   {
      dIndicator = VDW_CreateElement("div","dIndicator_small","")
      dIndicator.className = 'toolbar_dIndicator';
      dIndicator.innerHTML = '<img class="toolbar_dIndicator" src="images/indicator_small.gif"/>';
      dIndicator.style.display = 'none';
      var parent = toolbar;
      if(!toolbar)
         parent = document.body; 
      parent.appendChild(dIndicator);
   }
   
   if(bool)
   {
      if(dIndicator.style.display=='block')
         return;
      
      dIndicator.style.display = 'block';
      
      if( !toolbar || (parseInt(toolbar.style.width)==0 || parseInt(toolbar.style.height)==0) )
      {
         dIndicator.style.left   = document.body.clientWidth - dIndicator.clientWidth;
         dIndicator.style.top    = "12px";
      }
      else
      {
         dIndicator.style.left = parseInt(toolbar.style.width) - dIndicator.clientWidth;
         dIndicator.style.top = Math.round((parseInt(toolbar.style.height) - dIndicator.clientHeight) / 2);
      }
   }
   else
   {
      dIndicator.style.display = 'none';
   }
}

function LoadingAnimation (nb,text)
{
   nb++;
   if(nb>3||nb<1)
      nb=1;
   clearTimeout(indicator_timer);

   var dIndicator = document.getElementById("dIndicator");
   if(!dIndicator)
      return;

   if(dIndicator.style.display=="none")
      return;

   newtext=text;
   for(var i=0;i<nb;i++)
      newtext+=".";

   dIndicator.innerHTML=newtext;
   indicator_timer=setTimeout("LoadingAnimation("+nb+",'"+text+"')", indicator_loadingtime);
}

/* Activate and desactivate datagrid rows functions */
function CheckIfModify(evt,oObj,args)
{
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var datagridname,sFieldnames,fSave,sArguments,sSaveMsg,sStartAttribute="vdw_fieldnames_start_value";
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;
         
         case "sDatagridname":
            datagridname = statements["argument"][j];
            break;
         
         case "sSaveMsg" :
            sSaveMsg = statements["argument"][j];
            break;
         
         case "fSave" :
            fSave = statements["argument"][j];
            break;

         case "sArguments" :
            sArguments = statements["argument"][j];
            break;

        case "sStartAttribute" :
            sStartAttribute = statements["argument"][j];
            break;            
      }
   }
   
   //set selected objects
   var selectedItems = oObj.getSelectedItems();
   var nr_selectedItems = (selectedItems && selectedItems.length)?selectedItems.length:0;
   
   //nothing selected  (first load of the function IE)
   if(nr_selectedItems<1)
   {
      if(IsFormChanged(sFieldnames,sStartAttribute) && confirm(sSaveMsg))
      {
         eval(fSave+"("+sArguments+")");
      }
      return;
   }
   
   //set datagrid object
   if(datagridname!="")
      var datagrid = vdwdatagrids[datagridname];
   
   //set event object
   var oEvent = new vdwevent(evt);
   
   //set flag to know how to use the function
   if(sFieldnames.length<=0)
   {
      /* get fieldnames and values */
      var string;
      var rows = new Array();
      var currentrow=null;
      var reg_contentcell = new RegExp("contentcell_.*_","ig");

      if(nr_selectedItems>0)
      {
         currentrow = selectedItems[0];
         if(currentrow.childNodes && currentrow.childNodes.length>0)
         {
            for(var i=0;i<currentrow.childNodes.length;i++)
            {
               if(currentrow.childNodes[i].tagName!="TD")//FF & Opera (text elements)
               {
                  continue;
               }
               
               fieldname = document.getElementById(currentrow.childNodes[i].id.replace(reg_contentcell,"titlerow_")).getAttribute('fieldname');
               sFieldnames += fieldname+",";
            }

            while(sFieldnames.charAt(sFieldnames.length-1)==",")
            {
               sFieldnames = sFieldnames.substring(0,(sFieldnames.length-1));
            }

         }
      }
      else
      {
         return false;
      }
   }
   
   if(IsFormChanged(sFieldnames,sStartAttribute) && confirm(sSaveMsg))
   {
      eval(fSave+"("+sArguments+")");
   }
   return;
}

function IsFormChanged(sFieldnames,sStartAttribute)
{
   var r_comma = new RegExp(",","g");
   var aFieldnames = sFieldnames.split(r_comma);
   var org_value,new_value;
   var bChanged = false;

   //check if a value is changed
   for(var i=0;i<aFieldnames.length;i++)
   {
      if(!document.forms[0].elements[aFieldnames[i]])
         continue;
      
      org_value = document.forms[0].elements[aFieldnames[i]].getAttribute(sStartAttribute);
      new_value = document.forms[0].elements[aFieldnames[i]].value;
      if(org_value)
      {
         if(org_value!=new_value)
         {
            //alert(aFieldnames[i]+" org value ("+org_value+") != new value ("+new_value+")");
            bChanged = true;
            break;
         }
      }
      else
      {
         if(new_value!="")
         {
            //alert(aFieldnames[i]+" new value ("+new_value+") != \"\" ");            
            bChanged = true;
            break;
         }
      }
   }

   return bChanged;
}

function SetFormValues(evt,oObj,args)
{
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var datagridname,sFieldnames,sStartAttribute="vdw_fieldnames_start_value",bActivate=false;

   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;
            
         case "sDatagridname":
            datagridname = statements["argument"][j];
            break;
            
        case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;
        case "bActivate":
           bActivate = (statements["argument"][j]=="true" || statements["argument"][j]=="TRUE" || statements["argument"][j]=="1")?true:false;
      }
   }
   
   //set selected objects
   var selectedItems = oObj.getSelectedItems();
   var nr_selectedItems = (selectedItems && selectedItems.length)?selectedItems.length:0;
   
   //nothing selected  (first load of the function IE)
   if(nr_selectedItems<1)
   {
      return false;
   }
   
   //set datagrid object
   if(datagridname!="")
      var datagrid = vdwdatagrids[datagridname];
   
   //set event object
   var oEvent = new vdwevent(evt);

   var bFieldnames = false;
   if(sFieldnames.length>0)
   {
      bFieldnames = true;
   }

   /* get fieldnames and values */
   var string;
   var rows = new Array();
   var currentrow=null;
   var reg_contentcell = new RegExp("contentcell_.*_","ig");

   for(var cnt=0;cnt<nr_selectedItems;cnt++)
   {
      currentrow = selectedItems[cnt];
      if(currentrow.childNodes && currentrow.childNodes.length>0)
      {
         string="";
         for(var i=0;i<currentrow.childNodes.length;i++)
         {
            if(currentrow.childNodes[i].tagName!="TD")//FF & Opera (text elements)
            {
               continue;
            }
            
            fieldname = document.getElementById(currentrow.childNodes[i].id.replace(reg_contentcell,"titlerow_")).getAttribute('fieldname');
            value =  currentrow.childNodes[i].innerText;
            if(!bFieldnames || sFieldnames.indexOf(fieldname)>=0)
            {
               string += fieldname+"("+AddExterialQuotes(value)+") ";
            }
         }
        
         if(string!="")
         {
            rows.push(string);
         }
         //alert(string);
      }
   }

   SetStartAttributes(rows,sStartAttribute,bActivate);
   return ;   
}

function SetStartAttributes(rows,sStartAttribute,bActivate)
{
   /* set the values */
   var statements = [];
   var nr_statements = 0;
   var nr_rows = rows.length;

   for(var i=0;i<nr_rows;i++)
   {
      if(rows[i] == "") continue;
      statements = GetStatements(rows[i]);
      nr_statements = statements["name"].length;

      /* first time clean the edit fields */
      if(i==0)
      {
         RemoveFocus(statements["name"]); 
         RemoveErrorColor(statements["name"]);
         EmptyFields(statements["name"]);
         RemoveFieldsAttribute(statements["name"],sStartAttribute);

         for(var j=0;j<nr_statements;j++)
         {
            if(!document.forms[0].elements[statements["name"][j]])
            {
               //alert(statements["name"][j]);
               continue;
            }

            document.forms[0].elements[statements["name"][j]].value = RemoveQuotes(statements["argument"][j]);
            document.forms[0].elements[statements["name"][j]].setAttribute(sStartAttribute,RemoveQuotes(statements["argument"][j]));
            if(bActivate && nr_rows==1)
            {
               ActivateEvent(document.forms[0].elements[statements["name"][j]],"change");
            }
         }
         continue;
      }

      /* On multi select empty the fields */
      else
      {
         RemoveFocus(statements["name"]);
         RemoveErrorColor(statements["name"]);
         EmptyFields(statements["name"]);
         RemoveFieldsAttribute(statements["name"],sStartAttribute);
         if(bActivate)
         {
            for(var k=0;k<statements["name"].length;k++)
            {
               if(document.forms[0].elements[statements["name"][k]] && (document.forms[0].elements[statements["name"][k]].type=="text" || document.forms[0].elements[statements["name"][k]].type=="textarea"))
               {
                  ActivateEvent(document.forms[0].elements[statements["name"][k]],"change");
               }
            }
         }
         break;
      }
   }

   SetFocusOn();
   return ;
}

function SetFormAsStartValues(sFieldnames,sStartAttribute,bActivate)
{
   var aFieldnames = sFieldnames.split(",");
   var len = aFieldnames.length;
   var string = "";
   var i = 0;
   
   for(var i=0;i<len;i++)
   {
      if(document.forms[0].elements[aFieldnames[i]] && document.forms[0].elements[aFieldnames[i]].value!="")
         string += aFieldnames[i]+"("+document.forms[0].elements[aFieldnames[i]].value+") ";
   }
   
   /* CDCL 06/02/2006 (PM_) : Do Not remove new lines for (Textarea objects)
   //remove new lines
   //string = string.SubstitutePattern(String.fromCharCode(13)," ");
   //string = string.SubstitutePattern(String.fromCharCode(10),"");
   */

   return SetStartAttributes(new Array(string),sStartAttribute,bActivate);
}
/************************************************************/
/*                   default form funcitons                */
/************************************************************/

function New(req,args)
{
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var sDatagridname,sFieldnames,sStartAttribute="vdw_fieldnames_start_value",sSaveMsg,fSave,sArguments;
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;

         case "sDatagridname":
            sDatagridname = statements["argument"][j];
            break;
         
         case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;
         
         case "sSaveMsg" :
            sSaveMsg = statements["argument"][j];
            break;
         
         case "fSave" :
            fSave = statements["argument"][j];
            break;

         case "sArguments" :
            sArguments = statements["argument"][j];
            break;
      }
   }
   
   if(req.IsBusy())
      req.cancelRequest();

   if((fSave && fSave!="") && (sSaveMsg && sSaveMsg!="") && (sFieldnames && sFieldnames!="") && (sStartAttribute && sStartAttribute!=""))
   {
      if(IsFormChanged(sFieldnames,sStartAttribute) && confirm(sSaveMsg))
      {
         eval(fSave+"("+sArguments+")");
      }
   }
   
   sFieldnames = ExtractFormFieldNames(sFieldnames);
   EmptyForm(sFieldnames,sStartAttribute);
   vdw_datagrid_UnSelectAllRows(sDatagridname);
}

/* purpose : to prepare the save statements and call to Save2 to execute the save */
function Save(req,args)
{
   if(!req)
      return;

   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var sDatagridname,sFieldnames,sDatabasename,sTablename,sStartAttribute="vdw_fieldnames_start_value",sSaveMsg,sErrColor="red";
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;

         case "sDatagridname":
            sDatagridname = statements["argument"][j];
            break;
         
         case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;

         case "sDatabasename":
            sDatabasename = statements["argument"][j];
            break;
         
         case "sTablename":
            sTablename = statements["argument"][j];
            break;

         case "sSaveMsg":
            sSaveMsg = statements["argument"][j];
            break;

         case "sErrColor":
            sErrColor = statements["argument"][j];
            break;            
            
      }
   }
   
   var sCplFieldnames = sFieldnames;
   sFieldnames = ExtractFormFieldNames(sFieldnames);
   //alert(sFieldnames+"\n"+sCplFieldnames);
   //check Forms values
   if(CheckFormValues(sFieldnames,sErrColor))
   {
      AddMessage(new vdwmessage('error',messages[language][50]),'error_message_line');
      return;
   }
   
   //find keyfield names
   var keyfields = [];
   keyfields = GetKeyFieldNames(sFieldnames);
   var querykeyfields = GetQueryFieldNames(keyfields,sCplFieldnames);
   
   if(keyfields.length<=0)
      return;
   
   //var nrkeyfields = keyfields.length;
   var keyvalues = [];
   
   // get key values and check is key changed
   var bChanged = false;
   var keystartvalue = null;
   for(var i=0;i<keyfields.length;i++)
   {
      if(i<0)  continue;      
      if(!document.forms[0].elements[keyfields[i]])
      {
         keyfields.Delete(i);
         querykeyfields.Delete(i);
         i--;
         continue;
      }
      
      keyvalues[i] = document.forms[0].elements[keyfields[i]].value;
      keystartvalue = document.forms[0].elements[keyfields[i]].getAttribute(sStartAttribute);
      if(!keystartvalue || keystartvalue!=keyvalues[i])
      {
         bChanged = true;
      }
   }
  
   /* Make the Sql statements for Save2 function and the sConfirm message */
   var r_comma = new RegExp(",","g")
   var aFieldnames = sFieldnames.split(r_comma);
   var aQueryFieldnames = ExtractQueryFieldNames(sCplFieldnames).split(r_comma);
   
   /* Make the sConfirmMessage and sWarningMessage */
   var msg = messages[language][48];
   var msg2 = "";
   var r_value = new RegExp("#strvalue","g");
   var first = (keyfields.length-1);
   for(var i=first;i>=0;i--)
   {
      if(document.forms[0].elements[keyfields[i]] && document.forms[0].elements[keyfields[i]].type=="hidden")
      {
         first--;
         continue;
      }
      
      if(i!=first)
         msg2 += ", ";

      if(document.forms[0].elements[keyfields[i]] && document.forms[0].elements[keyfields[i]].getAttribute("vdw_translated_fieldname"))
      {
         msg2 += document.forms[0].elements[keyfields[i]].getAttribute("vdw_translated_fieldname")+" "+keyvalues[i];
      }
      else
         msg2 += keyfields[i]+" "+keyvalues[i];
   }
   
   var sConfirmMessage = msg.replace(r_value,msg2)
   var sWarningMessage = messages[language][49].replace(r_value,msg2);
   
   /* Make the Insert Statement  */
   var sSqlInsertStatement = "insert into "+sTablename+" ("
   for(var i=0;i<aFieldnames.length;i++)
   {
      /* this field is not found on the form */
      if(!document.forms[0].elements[aFieldnames[i]])
      {
         aFieldnames.Delete(i);
         aQueryFieldnames.Delete(i);
         i--;
         continue;
      }

      if(i!=0)
         sSqlInsertStatement += ",";
   
      if(aQueryFieldnames[i].indexOf("`")>=0) // secured string
      {
         sSqlInsertStatement += aQueryFieldnames[i];
      }
      else
      {
         sSqlInsertStatement += "`"+aQueryFieldnames[i]+"`";
      }
   }

   //error the fieldnames arenot correct
   if(aQueryFieldnames.length<=0)
      return;
      
   sSqlInsertStatement += ") values ( ";
   for(var i=0;i<aFieldnames.length;i++)
   {
      if(i!=0)
         sSqlInsertStatement += ",";
      
      if(!document.forms[0].elements[aFieldnames[i]])
      {
         sSqlInsertStatement += "''";
         continue;
      }
      
      if(document.forms[0].elements[aFieldnames[i]].getAttribute('vdw_field_value_type')=="sql_query")
      {
         sSqlInsertStatement += "("+document.forms[0].elements[aFieldnames[i]].value+")";
      }
      else
         sSqlInsertStatement += "'"+document.forms[0].elements[aFieldnames[i]].value+"'";
   }
   sSqlInsertStatement += ")";

   
   /******************************/   
   /* Make the Update Statement  */
   
   var sSqlUpdateStatement = "update "+sTablename+" set ";
   var fl_no_update = false;
   var r_comma = new RegExp("[,]","g");
   for(var i=0;i<aFieldnames.length;i++)
   {
      fl_no_update = false;
      
      if(document.forms[0].elements[aFieldnames[i]].getAttribute('vdw_save_flags'))
      {
         var aFlags = document.forms[0].elements[aFieldnames[i]].getAttribute('vdw_save_flags').split(r_comma);
         for(var k=aFlags.length-1;k>=0;k--)
         {
            if(aFlags!="no_update")
               continue;
        
            fl_no_update = true;
            break;
         }
      }

      if(!document.forms[0].elements[aFieldnames[i]] || fl_no_update )
      {
         aFieldnames.Delete(i);
         aQueryFieldnames.Delete(i);
         i--;
         continue;
      }
      
      if(i!=0)
         sSqlUpdateStatement += ",";
   
      if(aQueryFieldnames[i].indexOf("`")>=0) // secured string
      {
         sSqlUpdateStatement += aQueryFieldnames[i]+" = ";
      }
      else
      {
         sSqlUpdateStatement += "`"+aQueryFieldnames[i]+"` = ";
      }
      
      if(document.forms[0].elements[aFieldnames[i]].getAttribute('vdw_field_value_type')=="sql_query")
      {
         sSqlUpdateStatement += "("+document.forms[0].elements[aFieldnames[i]].value+")";
      }
      else
         sSqlUpdateStatement += "'"+document.forms[0].elements[aFieldnames[i]].value+"'";
      
   }
   
   sSqlUpdateStatement += " where ";
   
   for(var i=0;i<keyfields.length;i++)
   {
      if(i!=0)
         sSqlUpdateStatement += " and ";
     
      if(querykeyfields[i].indexOf("`")>=0)
         sSqlUpdateStatement += querykeyfields[i]+" = ";
      else
         sSqlUpdateStatement += "`"+querykeyfields[i]+"` = ";
      
      if(document.forms[0].elements[aFieldnames[i]].getAttribute('vdw_field_value_type') == "sql_query")
      {
         sSqlUpdateStatement += "("+document.forms[0].elements[aFieldnames[i]].value+")";
      }
      else
      {
         sSqlUpdateStatement += "'"+keyvalues[i]+"'";
      }
   }

   /* prepare the arguments to send to save2 */
   //sDatagridname,sFieldnames,sDatabasename,sTablename,sStartAttribute="vdw_fieldnames_start_value",sConfirmMessage
   var sSave2Args = "sDatagridname("+sDatagridname+") sDatabasename("+sDatabasename+") sFieldnames("+sCplFieldnames+") sTablename("+sTablename+") sStartAttribute("+sStartAttribute+") bChanged("+((bChanged)?"true":"false")+") sConfirmMessage("+sConfirmMessage+") sWarningMessage("+sWarningMessage+") sSqlInsertStatement("+AddExterialQuotes(sSqlInsertStatement)+") sSqlUpdateStatement("+AddExterialQuotes(sSqlUpdateStatement)+")";
   /* choose the way to call Save2 function */
   if(bChanged)
   {
      var sql = "select count("+querykeyfields[0]+") as count from "+sTablename+" where ";
      for(var i=0;i<keyfields.length;i++)
      {
         if(i!=0)
            sql += " and ";
        
         if(querykeyfields[i].indexOf("`")>=0)
            sql+= querykeyfields[i]+" = ";
         else
            sql+= "`"+querykeyfields[i]+"` = ";

         if(document.forms[0].elements[keyfields[i]].getAttribute('vdw_field_value_type')=="sql_query")
            sql += "("+keyvalues[i]+")";
         else
            sql += "'"+keyvalues[i]+"'";
      }
      
      var arg = "database("+sDatabasename+") sql("+AddExterialQuotes(sql)+") arguments("+sSave2Args+") action(verify)";
      DataQuery(req,arg,Save2);
      return ;
   }
   
   Save2(req,sSave2Args);
   return ;   
}

function Save2(req,args)
{
   /* parse the result */
   if(!req){
      return ;
   }
   
   var result = null;
   var xmlDoc = new XMLDocument();
   var pos;
   var bConfirm = false;

   if(req.hasResponse())
   {
      result = req.getResponse();
      //clean result string
      pos = result.indexOf("<?xml");
      if(pos>=0)
         result = result.substring(pos);
      
      req.validateRequest();
      req.cleanRequest();
      
      xmlDoc.loadXML(result);
      var xpathresult = xmlDoc.selectNodes("//ROW");
      if(xpathresult.length!=1)
      {
         AddMessage(new vdwmessage('error',messages[language][47]),'error_message_line');
         return 0;
      }
      
      if(xpathresult[0].text != 0)
      {
         bConfirm = true;
      }
   }
   
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var sDatagridname,sFieldnames,sDatabasename,sTablename,sStartAttribute="vdw_fieldnames_start_value",bChanged=false,sSqlInsertStatement,sSqlUpdateStatement,sConfirmMessage,sWarningMessage;
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;

         case "sDatagridname":
            sDatagridname = statements["argument"][j];
            break;
         
         case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;

         case "sDatabasename":
            sDatabasename = statements["argument"][j];
            break;
         
         case "sTablename":
            sTablename = statements["argument"][j];
            break;

         case "sSqlInsertStatement":
            sSqlInsertStatement = statements["argument"][j];
            break;
         
         case "sSqlUpdateStatement":
            sSqlUpdateStatement = statements["argument"][j];
            break;

         case "sConfirmMessage":
            sConfirmMessage = statements["argument"][j];
            break;
         
         case "sWarningMessage":
            sWarningMessage = statements["argument"][j];
            break;
            
         case "bChanged":
            bChanged = (statements["argument"][j]=='true')?true:false;
            break;
      
         default : 
            break;
      }
   }
   
   /* Ask Confirmation to overwrite */
   if(bConfirm)
   {
      if(confirm(sConfirmMessage))
      {
         bChanged=false;
      }
      else
      {
         AddMessage(new vdwmessage("warning",sWarningMessage),'error_message_line');
         return 0;
      }
   }        
   
   //alert(sSqlInsertStatement+"\n"+sSqlUpdateStatement);
   /* preprare thr sql query */
   var sql= ((bChanged)?sSqlInsertStatement:sSqlUpdateStatement);
  
   //alert(sql); 
   // execute the save request
   // setSavedArguments

   var sSavedArguments = "sStartAttribute("+sStartAttribute+") sSetStartAttributes("+PrepareStartAttributes(sFieldnames)+")";
   var arg = "database("+sDatabasename+") sql("+AddExterialQuotes(sql)+")  arguments(sAction(save) sDatagridname("+sDatagridname+") "+sSavedArguments+") action(save)";
   ExecuteQuery(req,arg,Result);

   /* empty the form */
   //EmptyForm(sFieldnames,sStartAttribute);
   //vdw_datagrid_UnSelectAllRows(sDatagridname);
   return (0);
}

function PrepareStartAttributes (sNames)
{
   if(sNames.length==0)
      return;
   
   var r_comma = new RegExp(",","g");
   var sFormElementNames = ExtractFormFieldNames(sNames);
   var aFormElementNames = sFormElementNames.split(r_comma);
   var form = document.forms[0];
   var expression = "";
   
   for(var i=(aFormElementNames.length-1);i>=0;i--)
   {
      if(form.elements[aFormElementNames[i]])
      {
         expression += aFormElementNames[i]+"("+form.elements[aFormElementNames[i]].value+") ";
      }
   }

   return expression.trim();
}

function Delete(req,args)
{
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var sDatagridname,sFieldnames,sDatabasename,sTablename,sStartAttribute="vdw_fieldnames_start_value",sDeleteMsg;
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;

         case "sDatagridname":
            sDatagridname = statements["argument"][j];
            break;
         
         case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;

         case "sDatabasename":
            sDatabasename = statements["argument"][j];
            break;
         
         case "sTablename":
            sTablename = statements["argument"][j];
            break;

         case "sDeleteMsg":
            sDeleteMsg = statements["argument"][j];
            break;
            
      }
   }
   
   var sCplFieldnames = sFieldnames;
   sQueryFieldnames = ExtractQueryFieldNames(sFieldnames);
   sFieldnames = ExtractFormFieldNames(sFieldnames);
   
   //alert(sQueryFieldnames+" \n"+sFieldnames+" \n"+sCplFieldnames);
   //find keyfield names
   var keyfields = [];
   keyfields = GetKeyFieldNames(sFieldnames);
   //alert(keyfields.join(","));
   var querykeyfields = GetQueryFieldNames(keyfields,sCplFieldnames);
   //alert(querykeyfields.join(","));
   
   //search selected rows nr
   if(sDatagridname=="")
      return;
   
   var datagrid = vdwdatagrids[sDatagridname];
   if(!datagrid)
      return;
   
   var selectedRowsIndexs = datagrid.GetSelectedRowsIndex();
   if(selectedRowsIndexs.length<=0)
   {
      //no rows selected
      return;
   }
   
   //find key fieldnames colnr
   var titlecell = null;
   var keyfieldsColsNr = [];
   var specialfields = [];
   
   for(var i=0;i<keyfields.length;i++)
   {
      titlecell = vdw_datagrid_FindTitlecellByFieldname(sDatagridname,keyfields[i]);
      if(!titlecell || !titlecell.id || titlecell.id=="")
      {
         //remove from keyfields names
         if(document.forms[0].elements[keyfields[i]] && document.forms[0].elements[keyfields[i]].value!="")
         {
            specialfields.push(document.forms[0].elements[keyfields[i]]);
         }

         keyfields.Delete(i);
         querykeyfields.Delete(i);
         //alert("Delete"+i);
         i--;
         continue;
      }
      //datagrid_customers_titlerow_(nr)
      keyfieldsColsNr.push(titlecell.id.substring(titlecell.id.lastIndexOf("_")+1));
   }
   
   //get the key field values
   var keyvalues = [];
   var valuecell = null;
   for(var i=0;i<selectedRowsIndexs.length;i++)
   {
      keyvalues[i] = [];
      for(var j=0;j<keyfieldsColsNr.length;j++)
      {
         //id : datagrid_$datagridname_contentcell_$rownr_$cellnr
         valuecell = document.getElementById("datagrid_"+sDatagridname+"_contentcell_"+(selectedRowsIndexs[i]+1)+"_"+keyfieldsColsNr[j]);
         if(!valuecell)
            continue;
         
         keyvalues[i][j] = valuecell.innerText;
      }
   }
   
   //make SQL string (e.g.: delete from customer where clientnr=1)
   var sql = "delete from "+sTablename+" where ";
   
   for(var i=0;i<keyvalues.length;i++)
   {
      if(i==0)
         sql +=" ( ";
      else
         sql +=" or ( ";
      //alert(keyvalues[i].join(",")+" querykeyfields : "+querykeyfields.join(","))
      for(var j=0;j<keyvalues[i].length;j++)
      {
         if(j==0)
         {
            sql += querykeyfields[j]+" =";
            sql += "'"+keyvalues[i][j]+"'";
            continue;
         }

         sql += " and "+querykeyfields[j]+" = ";;
         sql += "'"+keyvalues[i][j]+"'";
      }

      /* static values for each row : specifie a row and make it unique */
      for(var k=0;k<specialfields.length;k++)
      {
         if(j==0)
         {
            sql += specialfields[k].name+" = ";
            if(specialfields[k].getAttribute("vdw_field_value_type")=="sql_query")
               sql += "("+specialfields[k].value+")";               
            else
               sql += "'"+specialfields[k].value+"'";            
            continue;
         }

         sql += " and "+specialfields[k].name+" = ";
         
         if(specialfields[k].getAttribute("vdw_field_value_type")=="sql_query")
            sql += "("+specialfields[k].value+")";
         else
            sql += "'"+specialfields[k].value+"'";
      }
      
      sql += " ) ";
   }
   
   //alert(sql);
      
   /* ask confiramtion to send data */
   if(confirm(sDeleteMsg))
   {
      sql = AddExterialQuotes(sql);
      var arg = "database("+sDatabasename+") sql("+sql+")  arguments(sAction(delete) sDatagridname("+sDatagridname+")) action(delete)";
      ExecuteQuery(req,arg,Result);
      EmptyForm(sFieldnames,sStartAttribute);
      vdw_datagrid_UnSelectAllRows(sDatagridname);
   }
   
   return(0);
}

function Refresh(req,args)
{
   /* parse the args */
   var statements = GetStatements(args);
   var nr_statements = statements["name"].length;
   var sDatagridname,sFieldnames,sStartAttribute="vdw_fieldnames_start_value";
   
   for(var j=0;j<nr_statements;j++)
   {
      switch(statements["name"][j])
      {
         case "sFieldnames":
            sFieldnames = statements["argument"][j];
            break;

         case "sDatagridname":
            sDatagridname = statements["argument"][j];
            break;
         
         case "sStartAttribute":
            sStartAttribute = statements["argument"][j];
            break;

      }
   }
   
   sFieldnames = ExtractFormFieldNames(sFieldnames);
   /* Empty the form and refresh it */
//   EmptyForm(sFieldnames,sStartAttribute);
   vdw_datagrid_UnSelectAllRows(sDatagridname);   
   vdw_datagrid_refresh(sDatagridname,"");
}

function SetError(element,errColor)
{
   if(!element.getAttribute("vdw_org_bgcolor"))
      element.setAttribute("vdw_org_bgcolor",element.style.backgroundColor);
   
   element.style.backgroundColor=errColor;
}

function CheckFormValues(sFieldnames,errColor)
{
   if(sFieldnames=="")
      return;

   
   var bError = false;
   var r_comma = new RegExp(",","g")
   var r_forbiddenchars = new RegExp("[\\\\<>\\$\\|%\"'&]+", "g");
   var aFieldnames = sFieldnames.split(r_comma);
   var form = document.forms[0];
   var expression,r_exp;
   RemoveErrorColor(aFieldnames);
   
   for(var i=(aFieldnames.length-1);i>=0;i--)
   {
      expression = "";
      if(form.elements[aFieldnames[i]])
      {
         expression = form.elements[aFieldnames[i]].getAttribute("vdw_check_rules");
         
         if(expression)
         {
            r_exp = new RegExp(expression,"g");
            if(!r_exp.test(form.elements[aFieldnames[i]].value))   
            {
               SetError(form.elements[aFieldnames[i]],errColor);
               bError = true;
               continue;
            }
         }

         expression = form.elements[aFieldnames[i]].getAttribute("vdw_special_rules");
         if(expression)
         {
            var specialrules = expression.split("|");
            var r_len = specialrules.length;
            for(var r=0;r<r_len;r++)
            {
               switch(specialrules[r].toLowerCase())
               {
                  case "not empty" :
                     if(form.elements[aFieldnames[i]].value=="")   
                     {
                        SetError(form.elements[aFieldnames[i]],errColor);
                        bError = true;
                        continue;
                     }
                     
                     break;
                  case "empty" :
                     if(form.elements[aFieldnames[i]].value!="")   
                     {
                        SetError(form.elements[aFieldnames[i]],errColor);
                        bError = true;
                        continue;
                     }
                     break;
                  case "checkdate" :
                     if(form.elements[aFieldnames[i]].value!="")
                        if(CheckDate(form.elements[aFieldnames[i]].value,form.elements[aFieldnames[i]].getAttribute("vdw_date_convention")))
                        {
                           SetError(form.elements[aFieldnames[i]],errColor);
                           bError = true;
                           continue;
                        }
                     break;
                  default :
                     break;
               }
            }
         }
         
         
         if(form.elements[aFieldnames[i]].getAttribute("vdw_field_value_type")=="sql_query")
            continue;

         if(r_forbiddenchars.test(form.elements[aFieldnames[i]].value))
         {
            SetError(form.elements[aFieldnames[i]],errColor);
            bError = true;
            continue;
         }
      }
   }

   return bError;
}

function ExtractFormFieldNames(sFieldnames)
{
   if(!sFieldnames || sFieldnames=="")
      return "";

   var aFieldnames = sFieldnames.replace(/[`']/g,'').split(/,/g);
   var sFormFielname = "";
   
   for(var i=(aFieldnames.length-1);i>=0;i--)
   {
      if((pos_as=aFieldnames[i].indexOf(" as "))<0)
      {
         continue;
      }
      aFieldnames[i] = aFieldnames[i].substring((pos_as+4))
   }

   return aFieldnames.join(",");
}

function ExtractQueryFieldNames(sFieldnames)
{
   if(!sFieldnames || sFieldnames=="")
      return "";

   var aFieldnames = sFieldnames.split(/,/g);
   var sFormFielname = "";
   
   for(var i=(aFieldnames.length-1);i>=0;i--)
   {
      if((pos_as=aFieldnames[i].indexOf(" as "))<0)
      {
         continue;
      }
      aFieldnames[i] = aFieldnames[i].substring(0,pos_as)
   }

   return aFieldnames.join(",");
}
