ljex.forms = [];
 
 
ljex.Form = function(data){
 $assimilate.call(this, data);

 this.config = data;
 this.buttonsConfig=[];
 ljex.forms[this.id]=this;
 this.ddOptions={};
 this.ddHandler={};

 this.fldValues=[];
 this.domForm=null;
 this.stdUploadFields=[];
 this.flds2check=[];
}

ljex.Form.prototype.getField = function(id, items){  
 if(!items) var items=this.items;

 id=id.replace(/\-input/g,"");

 for(var i=0;i<items.length;i++){
 if(items[i].items && items[i].xtype!="dropdown"){
 this.getField(id, items[i].items);
 }
 if(items[i].id==id){
 if(items[i].xtype=='radio'){
 return items;
 }else{
 return items[i];
 }
 }
 }
}  

ljex.Form.prototype.reset = function(){
 $(this.id).reset();
 for(var i=0;i<this.items.length;i++){
 var itemId=this.items[i].id;
 var itemErr=$(itemId+'_err');
 if(itemErr!=undefined && itemErr !=null) itemErr.style.display='none';

 switch(this.items[i].xtype){
 case 'textfield':
 var stdClass='lx-form-input';
 break;
 case 'textarea':
 var stdClass='lx-form-input-textarea';
 break;
 }
 try{
 $(itemId).className=stdClass;
 }catch(e){
  
 }
 }
}

ljex.Form.prototype.setValue = function(id,val){
 document.forms[this.id].elements[id].value=val;
 this.fldValues[id]=val;
}

ljex.Form.prototype.submit = function(id){
 if(this.stdUploadFields.length>0 ){
 var upl=this.stdUploadFields[0];

 if($(this.id+'-ifr') && $(upl.id).value!=""){
  
 
 $(this.id+'-ifr').style.display="block";
 this.domForm.submit();

 if($(this.id+'-ifr') && $(this.id+'-ifr').style.display=="block"){
 $(this.id+'-ifr').src="ljex/upload_done.html";  
 window.setTimeout("ljex.Form.closeUpload('"+this.id+"-ifr')",2000);
 }

 }else{
 this.doSubmit(id);
 }

 }else{
 this.doSubmit(id);
 }
}


ljex.Form.closeUpload = function(id){
 new ljex.FX({ id: id }).fadeOut();
}

ljex.Form.prototype.doSubmit = function(id){
 if(!this.url){
 this.url = '/lib/FormController.php5?command=save&id='+this.id;
 }

 new ljex.Ajax({
 url: this.url,
 method: 'POST',
 param: this.fldValues ,
 scope: this,
 callback: function(response){ 
 var scope = this.buttonsConfig[id].scope || this;
 this.buttonsConfig[id]['handler'].call(scope,response);
 }
 }).request();

}

ljex.Form.prototype.postSubmit = function(){
 this.callback.call(this);
}

ljex.Form.prototype.fileSizeError = function(){
 $error("Dateigröße > "+this.maxfilesize+" KB. Ihre Daten wurden nicht gespeichert.");
}

 
ljex.Form.prototype.stdSubmit = function(){
 var thisObj=this;

 try {
 for (edId in tinyMCE.editors)
 tinyMCE.get(edId).save();


  
 }catch(e){
 }

 thisObj.fetchFormData();
 
 return thisObj.validate();
}

ljex.Form.prototype.fetchFormData =function(){
 var thisObj=this;
 var frm = thisObj.domForm; 
 thisObj.fldValues= new Array();

  
 for(var k=0;k<frm.elements.length;k++){
 if(frm.elements[k].type=='checkbox' )
 frm.elements[k].value=frm.elements[k].checked;

 if(frm.elements[k].type=='radio'){
 if(frm.elements[k].checked) 
 thisObj.fldValues[frm.elements[k].name] = frm.elements[k].value;
 }else{
 thisObj.fldValues[frm.elements[k].name] = frm.elements[k].value;
 }
 }
}


ljex.Form.prototype.validate = function(){
 var isValid=true;
 for(var i=0;i<this.flds2check.length;i++){
 if(this.flds2check[i]==null) alert(JSON.stringify(this.flds2check));
 if(this.check.call(this.flds2check[i], this.flds2check[i].getAttribute("regex"), this)==false)
 var isValid=false;
 }
 
 if(!isValid){
 $error("Das Formular ist nicht vollständig ausgefüllt oder Sie haben ungültige Angaben gemacht / Please fill out the form completely and check for invalid input.");
 }
 
 if(this.preSubmit!=undefined){
 isValid=this.preSubmit.call(this);
 }
 return isValid;
}



ljex.Form.prototype.init = function(){
 var thisObj=this;
 this.domForm = $(this.id);
 this.isSubmitForm=true;

 if(this.buttons!=undefined && this.buttons){
  
 for(var i=0;i<this.buttons.length;i++){
 var el=$(this.buttons[i]['id']);
 this.buttonsConfig[this.buttons[i]['id']]=this.buttons[i];
 
 
 if(this.buttons[i]['submit']=='submit'){
 el.onclick = function(){
 thisObj.domForm.submit();
 }  
 }else if(this.buttons[i]['submit']=='ajax'){
 this.isSubmitForm=false;
 el.onclick = function(){
 var frm = thisObj.domForm; 
 thisObj.fldValues= new Array();

 if(!thisObj.validate()){
 return false;
 }

 try {
 for (edId in tinyMCE.editors)
 tinyMCE.get(edId).save();


  
 }catch(e){
 }
  
 for(var k=0;k<frm.elements.length;k++){
 if(frm.elements[k].type=='checkbox' )
 frm.elements[k].value=frm.elements[k].checked;

 if(frm.elements[k].type=='radio'){
 if(frm.elements[k].checked) 
 thisObj.fldValues[frm.elements[k].name] = frm.elements[k].value;
 }else{
 thisObj.fldValues[frm.elements[k].name] = frm.elements[k].value;
 }
 }
 
 var ok=true;
  
 if(thisObj.buttonsConfig[this.id]['preSubmit']){
 eval("var fkt="+thisObj.buttonsConfig[this.id]['preSubmit']);
 ok=fkt.call(thisObj);
 }

 if(ok) thisObj.submit(this.id);
 
 }
 }else{
 el.onclick = function(){
 thisObj.buttonsConfig[this.id]['handler'].call(thisObj, this);
 }
 }

 if(this.buttons[i]['enabled']!=undefined && !this.buttons[i]['enabled']){
 el.style.opacity='0.5';
 $(this.buttons[i]['id']+'_left').style.opacity='0.5';
 $(this.buttons[i]['id']+'_right').style.opacity='0.5';
 el.onclick = function(e){ return }
 }

 
 }
 if(!this.isSubmitForm){
 this.domForm.onsubmit=function(){ return false; };
 }
 }else{
 this.domForm.onsubmit=function(){ return false; };
 }
 this.configItems(this.items);
}

ljex.Form.setItemValue = function(formid, xtype, id, value){
 if(!ljex.forms[formid]) return true;
 var frm=ljex.forms[formid];
 var fld = frm.getField.call(frm, id);

 if(fld!=undefined){
 if(typeof(fld)=='object'){
 for(i=0;i<fld.length;i++){
 if(fld[i].value==value){
 fld[i].checked='checked';
 }else{
 if(fld[i].checked) fld[i].checked=undefined;
 }
 }
 return true;
 }
 
 if(fld.xtype=='checkbox'){
 if(fld.checked) 
 fld.checked=undefined;
 else
 fld.checked='checked';
 }else if(fld.xtype=='dropdown'){
  
 fld.value=value;
 }else{
 fld.value=value;
 }
 }
 return true;
 
}

ljex.Form.prototype.check = function(type, form, prechecked){
 var elErr=$(this.id+'_err');
 switch(type){
 case 'email':
 var regex =/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
 var success = regex.test(this.value);
 var msg = "Email Format: example@example.com";
 break;
 case 'allowBlank':
 var item=form.getField(this.id);
 if(item && item.xtype=="dropdown"){
 valid=this.id.replace(/\-input/g,"");
 var entryFound=false;

 if(this.value){
 var entries = $(this.id+'_lst').childNodes;
 for(j=0;j<entries.length;j++){
 if(entries[j].className=='lx-form-dropdown-entry'){
 if(entries[j].firstChild!=null && entries[j].firstChild.data==this.value){
 entryFound=true;
 break;
 }
 }
 } 
 }

  

 if($(valid).value=="" || !entryFound){
 success=false;
 msg = "Eintrag aus Liste wählen / Choose from list";
 }else{
 success=true;
 }
 }else{
 var regex=/^\ *$/;
 var success = (this.value!="" && !regex.test(this.value))?true:false;
 var msg = "Pflichtfeld / input required";
 if(success && this.getAttribute("forceChoice")) return true;
 }
 break;
 case 'forceChoice': 
 var success = prechecked;
 if(!success){
 $(this.id+"_lst").style.display="none";
 }
 var msg = "Please choose entry from list";
 break;
 }
 
 switch(this.type){
 case 'textarea':
 baseClassName="lx-form-input-textarea";
 break;
 case 'text':
 baseClassName="lx-form-input";
 break;
 default:
 baseClassName="lx-form-input";
 break;
 }

 var item=form.getField(this.id);
 if(item && item.xtype=="datefield"){
 if(this.value=="" && (item.allowBlank || item.allowBlank==undefined) ){
 success=true;

 }else{
 baseClassName="lx-form-input";
 var regex=/^\d\d\d\d\-\d\d\-\d\d$/;
 var success = (this.value!="" && regex.test(this.value))?true:false;

 if(success){
 if(parseInt(this.value.substr(5,2))>12 || parseInt(this.value.substr(8,2))>31) success=false;
 }

 var msg = "Format: YYYY-MM-DD";
 }
 }
 

 if(!success){
 elErr.style.display='block';
 elErr.style.paddingLeft=form.labelWidth+5+'px';
 elErr.innerHTML=msg;
 this.className=baseClassName+"-error";
 this.onfocus = function(){
 this.className=baseClassName+"-error";
 }
 this.onblur = function(){
 this.className=baseClassName+"-error";
 }
 return false;
 }else{
 elErr.style.display='none';
 this.className=baseClassName+'-focus';
 this.onfocus= function(){
 this.className=baseClassName+"-focus";
 }
 this.onblur = function(){
 this.className=baseClassName+'-blur';
 }
 return true;
 }
}

ljex.Form.prototype.openEditor = function(item){
 var areaID=item.id+'-textarea';
 var thisItem=item;  

 var ajaxObj=new ljex.Ajax({
 url: '/lib/FormController.php5?command=fetchImageList&dir='+item.upload,
 method:'GET',
 async: true
 });

 var response=ajaxObj.request();

 var editorWin = new ljex.Window({
 id: item.id+'-editorWin',
 title: 'tinyMCE',
 center: true,
 html: '<textarea id="'+areaID+'" name="'+areaID+'" style="width:'+item.width+'px;height:'+item.height+'px">'+item.value+'</textarea><div id="'+item.id+'-editor-tb-ct"></div>'
 });

 editorWin.open(true);

 var ed = new tinymce.Editor(areaID,{
 theme: "advanced",
 plugins : "safari,spellchecker,pagebreak,style,layer,table,save,advhr,advlink,emotions,insertdatetime,searchreplace,print,contextmenu,paste,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras",
 theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",
 theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
 theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
 theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage",
 theme_advanced_toolbar_location : "top",
 theme_advanced_toolbar_align : "left",
  
  
 convert_urls : true,

 external_image_list_url: "htroot/"+item.upload+"/imagelist.js"
 });

 ed.render();

 var tb = new ljex.ToolBar({
 id: item.id+'-editor-tb',
 renderTo: item.id+'-editor-tb-ct',
 border: false,
 
 items:[{
 id: item.id+'-editor-ok',
 text: 'Übernehmen',
 icon: '/ljex/images/ok.png',
 scope: this,
 onclick: function(){
 try {
 tinyMCE.get(areaID).save();  
 $(thisItem.id).value=$(areaID).value;
 thisItem.value=$(areaID).value;
 }catch(e){
 $error("Konnte Änderungen nicht übernehmen, sry.");
 }
 editorWin.close();
 }
 },{
 id: item.id+'-editor-cancel',
 text: 'Abbrechen',
 icon: '/ljex/images/cancel.png',
 scope: this,
 onclick: function(){
 editorWin.close();
 }
 }]
 });

 tb.render();

 editorWin.show();
}

ljex.Form.prototype.configItems = function(items){
 var thisObj=this;
 var fieldFocus=false;

 for(var i=0;i<items.length;i++){
 for(key in items[i]){
 switch(key){
 case 'handler':
 for(handler in items[i]['handler']){
  
  
 if(items[i]['xtype']=='dropdown' && handler=='change'){
 var el=$(items[i]['id']+'-input_lst');
 
 var handleEvent=function(ev){
 var e = window.event||ev;
 var target = e.srcElement||e.target;
 var key = e.keyCode||e.which;

 if(key==13){ 
 thisObj.ddHandler[target.id].call(target);
 }
 }

 if(typeof(items[i]['handler'][handler])=="string"){
 items[i]['handler'][handler]=eval(items[i]['handler'][handler]);
 }
 thisObj.ddHandler[el.id]=items[i]['handler'][handler];

 if(ljex.isIE()){
 el.attachEvent("onclick", items[i]['handler'][handler]);
 el.attachEvent("onkeyup", handleEvent);
 }else{
 el.addEventListener('click',items[i]['handler'][handler] , false);
 el.addEventListener('keyup', handleEvent, false);
 }
 }else{
 var el=$(items[i]['id']);
 if(ljex.isIE())
 el.attachEvent("on"+handler,items[i]['handler'][handler]);
 else
 el.addEventListener(handler, items[i]['handler'][handler],false);
 }
 }
 break;
 case 'xtype':
 switch(items[i]['xtype']){
 case 'textfield':
 if(!fieldFocus){
 var it=$(items[i].id);
 setTimeout(function() { it.focus(); }, 10);
 fieldFocus=true;
 }
 break;
 case 'dropdown':
 if(!fieldFocus){
 var it=$(items[i].id+'-input');
 setTimeout(function() { it.focus(); }, 10);
 fieldFocus=true;
 }
 thisObj.ddOptions[items[i]['id']]=$(items[i]['id']+'-input_lst').cloneNode(true);

 if(items[i]['forceChoice']) 
 $(items[i]['id']+'-input').setAttribute("forceChoice","true");
 else 
 $(items[i]['id']+'-input').setAttribute("forceChoice","false");
 

  
 $(items[i]['id']+'-input_lst').onclick = function(){
 if(this.options[this.selectedIndex].onclick){
 this.options[this.selectedIndex].onclick();
 }else{
 ljex.Form.dropDownClicked(this.id.substring(0,this.id.length-10),this.options[this.selectedIndex].innerHTML,this.options[this.selectedIndex].value);
 }
 }



  
 if(ljex.isSafari()) $(items[i]['id']+'-input_lst').onkeypress = function(){ return false; };

 $(items[i]['id']+'-input_lst').onkeyup =
 function(ev){
 var e = window.event||ev;
 var target = e.srcElement||e.target;
 var key = e.keyCode||e.which;

 var inputID=this.id.substr(0,this.id.length-4);

 switch(key){
 case 13:
 if(this.options[this.selectedIndex].onclick){
 this.options[this.selectedIndex].onclick();
 }else{
 ljex.Form.dropDownClicked(this.id.substring(0,this.id.length-10),this.options[this.selectedIndex].innerHTML,this.options[this.selectedIndex].value);
 }
 break;
 case 27:
 this.style.display="none";
 var id=this.id.substr(0,this.id.length-4);
 $(id).focus();
 break;
 case 9:
 this.style.display="none";
 break;
 
 }
 }


 $(items[i]['id']+'-input').onkeyup =
 function(ev){
 var e = window.event||ev;
 var target = e.srcElement||e.target;
 var key = e.keyCode||e.which;

 var itemID=this.id.substr(0,this.id.length-6);

 if(key==9){
 $(this.id+"_lst").style.display="none";
 if(this.nextSibling && this.nextSibling.focus) this.nextSibling.focus();
 }

 if(key==40 || key==38){
 $(this.id+"_lst").style.display="block";
 $(this.id+"_lst").focus(); 
 return;
 }
 if(key==27){
 $(this.id+"_lst").style.display=($(this.id+"_lst").style.display=="block")?"none":"block";
 return;
 }


 var entryFound=false; var firstEntry=false;
 var entries = thisObj.ddOptions[itemID].childNodes;
 $(this.id+'_lst').innerHTML="";

 for(j=0;j<entries.length;j++){
 if(entries[j].className=='lx-form-dropdown-entry'){
 var regex=eval("/^"+this.value+"/i");
 if(entries[j].firstChild && entries[j].firstChild.data.match(regex)){
 entryFound=true; 
 var tmp=entries[j].cloneNode(true); $(this.id+'_lst').appendChild(tmp);
 if(!firstEntry) firstEntry=tmp;
 } 
 }
 } 

 $(this.id+"_lst").style.display="block";
 if(firstEntry){ $(firstEntry.id).setAttribute("selected","selected"); }

 if(this.getAttribute("forceChoice")=='true'){
 if(!thisObj.check.call(this, "forceChoice", thisObj, entryFound)){
 this.value=this.value.charAt(0);
 for(j=0;j<entries.length;j++){
 entries[j].style.display='block';
 }
 }
 }
 }
 break;
 case 'checkbox':
 $(items[i]['id']+'-div').onclick = function(){
 var mainID=this.getAttribute("mainID");
 var el=$(mainID+'-div');

 if(!thisObj.domForm[mainID].checked){
 thisObj.domForm[mainID].setAttribute("checked","true");
 this.style.backgroundPosition="0 -16";
 }else{
 thisObj.domForm[mainID].removeAttribute("checked");
 el.style.backgroundPosition="0 0";
 }

 if(thisObj.domForm[mainID].onclick) thisObj.domForm[mainID].onclick();
 }

 break;
 case 'radio':
 $(items[i]['id']+'-'+items[i]['value']+'-div').onclick = function(){
 var mainID=this.getAttribute("mainID");
 myIndex=0;
 for(var i=0;i<thisObj.domForm[mainID].length;i++){
 var el=$(mainID+'-'+thisObj.domForm[mainID][i].value+'-div');

 if(thisObj.domForm[mainID][i].value==this.getAttribute("value")){
 thisObj.domForm[mainID][i].checked=true;
 this.style.backgroundPosition="0 -16";
 myIndex=i;
 }else{
 thisObj.domForm[mainID][i].removeAttribute("checked");
 el.style.backgroundPosition="0 0";
 }
 }
 if(thisObj.domForm[mainID][myIndex].onclick)
 thisObj.domForm[mainID][myIndex].onclick();
 }
 break;
 case 'container':
 this.configItems(items[i]['items']);  
 break;
 case 'upload':
 $(items[i]['id']+'-btn').setAttribute("upload", items[i].upload);
 $(items[i]['id']+'-btn').setAttribute("tnwidth", items[i].tnwidth);
 $(items[i]['id']+'-btn').setAttribute("tnheight", items[i].tnheight);
 $(items[i]['id']+'-btn').onclick = function() {
 thisObj.upload.call(this, thisObj);
 }
 break;
 case 'textarea':
 if(items[i].html){
 if(items[i].htmlconfig){
 var ed = new tinymce.Editor(items[i].id, items[i].htmlconfig);
 }else{
 var ed = new tinymce.Editor(items[i].id,{
 theme: "advanced",
 plugins : 'advlink',
 theme_advanced_buttons1 : "bold,italic,underline,|,forecolor,backcolor,|,undo,redo,|,link,unlink,|,charmap,cleanup,code,|,image",
 theme_advanced_buttons2 : "",
 theme_advanced_buttons3 : "",
  
  
  

 theme_advanced_toolbar_location : "top",
 theme_advanced_toolbar_align : "left",
 convert_urls : false

 });
 }
 ed.render();
 }
 break;
 case 'tinyMCE':
 var tb = new ljex.ToolBar({
 id: items[i].id+'-tb',
 renderTo: items[i].id+'-btn-ct',
 bgColor: 'transparent',
 border: false,
 items:[{
 id: items[i].id+'-upload',
 text: 'Bild hochladen',
 upload: items[i].upload,
 onclick: function(){
 loadModule("filemanager","core", {path: this.upload,
 form: thisObj }, true);
 }
 },{
 id: items[i].id+'-edit',
 text: 'Editor starten',
  
 idx: i,
 onclick: function(){
 
  
 thisObj.openEditor(items[this.idx]);
 }
 }]
 });
 tb.render();
 break;
 case 'scriptfield':
 $(items[i]['id']+'-btn').setAttribute("script", items[i].script);
 $(items[i]['id']+'-btn').onclick = function() {
 var script=this.getAttribute("script");
 eval(script+".call(this, thisObj)");
 }
 break;
 case 'stdupload':
 thisObj.stdUploadFields.push(items[i]);
 with($(thisObj.id+'-ifr').style){
 if(ljex.isIE() || ljex.isSafari()){
 position="absolute";
 }else{
 position="fixed";
 }
 marginLeft=parseInt($(thisObj.id+'-ct').offsetWidth)/2-150;
 marginTop=parseInt($(thisObj.id+'-ct').offsetHeight)/2-40;
 }
 break;
 case 'datefield':
 this.flds2check.push($(items[i].id));
 $(items[i].id).onclick=function(){
 }

 $(items[i].id+'-btn').onclick= function(){
 var inputID = this.id.split("-btn");
 inputID=inputID[0];
 var cal = ljex.Calendar.getInstance(inputID); 
 if(!cal){
 var cal = new ljex.Calendar({id: inputID, lang: 'fr'});
 }
 cal.open();
 }

 $(items[i].id).onfocus=function(){
 this.className="lx-form-input-focus";
 this.onclick();
 }
 break;
 case 'nmgridpanel':
 new ljex.nmGridPanel(items[i],thisObj);
 break;
 }
 break;
 case 'readonly':
 if(items[i]['xtype']=="dropdown"){
 var el = $(items[i].id+'-input');
 }else{
 var el = $(items[i].id);
 }
 el.setAttribute("readonly","true");
 break;
 case 'email':
 if(items[i][key]){
 var el = $(items[i].id);
 this.flds2check.push(el);
 el.setAttribute("regex","email");
 el.onkeyup = function(){
 thisObj.check.call(this, "email", thisObj);
 }
 }
 break;
 case 'allowBlank': 
 if(items[i][key]==false ){
 if(items[i]['xtype']=="dropdown"){
 var el = $(items[i].id+'-input');
 }else{
 var el = $(items[i].id);
 }
 this.flds2check.push(el);
 el.setAttribute("regex","allowBlank");
 if(ljex.isIE()){
 el.attachEvent("onkeyup", function(){
 thisObj.check.call(event.srcElement, "allowBlank", thisObj);
 });
 }else{
 el.addEventListener('keyup',function(){
 thisObj.check.call(this, "allowBlank", thisObj);
 },false);
 }

 }
 break;
 case 'submit':
 $(items[i]['id']).onkeyup = function(ev){
  
  
  
 var e = window.event||ev;
 var target = e.srcElement||e.target;
 var key = e.keyCode||e.which;
 if(key==13){
 thisObj.domForm.submit();
 }

 }
 break;
 }
 }
 }
}

ljex.nmGridPanel = function(conf,form){
 $assimilate.call(this, conf);
 var thisObj=this;

 this.conf=conf;
 this.form=form;
 
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=fetchnmdata&id='+form.id+'&myid='+$(thisObj.mykeycol+thisObj.form.uid).value,
 method: 'POST',
 param: {
 item: JSON.stringify(conf)
 }, 
 scope: this,
 callback: function(response){ 
 data = eval("("+response.responseText+")");
 this.data=data;
 
 this.gridpanel = new ljex.GridPanel({
 id: 'nmgrid-'+this.id,
 width: this.width,
 renderTo: this.id+'-nm-container',
 height: 150,
 maxItems: 20,
 cols: eval("("+this.cols+")"),  
 items: data['datasets']
 });

 this.gridpanel.render();

 this.toolbar = new ljex.ToolBar({
 id: this.id+'-toolbar',
 
 renderTo: this.id+'-buttons',
 items: [{
 id: this.id+'-buttons-add',
 text: 'Verknüpfen',
 scope: this,
 onclick: function() {
 if($(thisObj.mykeycol+thisObj.form.uid).value==""){
 $error("Bitte speichern Sie den (neuen) Datensatz zunächst, um Verknüpfungen erstellen zu können.");
 return;
 }

 var gridwin = new ljex.Window({
 id: this.id+'-fkgrid-win',
 title: 'Verknüpfung erstellen',
 html: "<div id='"+this.id+'-fk-container'+"'></div><div id='"+this.id+"-fk-tb-container'></div>",
 center: true
 });

 gridwin.open();

 new ljex.ToolBar({
 id: this.id+'-fk-tb',
 renderTo: this.id+"-fk-tb-container",
 items:[{
 id: this.id+'-btn-add-all',
 text: ' (Alle) Verknüpfen',
 scope: this,
 onclick: function(){
 var fkids=[];
 for(j=0;j<gridp.items.length;j++){
 fkids[j]=gridp.items[j][0];
 }

 gridwin.close();
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=linkallforeignkeys&myid='+$(thisObj.mykeycol+thisObj.form.uid).value+'&formid='+thisObj.form.id,
 method: 'POST',
 param: {
 item: JSON.stringify(thisObj.conf),
 fkids: JSON.stringify(fkids)
 }, 
 callback: function(response){ 
 var result = eval("("+response.responseText+")");
 thisObj.data['datasets']=result['datasets'];
 thisObj.data['fkdatasets']=result['fkdatasets'];
 thisObj.gridpanel.update(result['datasets']);
 thisObj.gridpanel.itemsUnfiltered=result['datasets'];

 }
 }).request();


 }
 }]
 }).render();

 var gridp = new ljex.GridPanel({
 id: 'fkgrid-'+this.id,
 width: this.width,
 renderTo: this.id+'-fk-container',
 height: 150,
 maxItems: 20,
 cols: eval("("+this.cols+")"),  
 items: this.data['fkdatasets'],
 rowclicked: function(){
 gridwin.close();
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=linkforeignkey&myid='+$(thisObj.mykeycol+thisObj.form.uid).value+'&fkid='+gridp.selectedRow.cells.item(0).value+'&formid='+thisObj.form.id,
 method: 'POST',
 param: {
 item: JSON.stringify(thisObj.conf)
 }, 
 callback: function(response){ 
 var result = eval("("+response.responseText+")");
 thisObj.data['datasets']=result['datasets'];
 thisObj.data['fkdatasets']=result['fkdatasets'];
 thisObj.gridpanel.update(result['datasets']);
 }
 }).request();
 }
 });

 gridp.render();

 }
 },{
 id: this.id+'-buttons-del',
 text: '<div style="color:#f00">Verk. lösen</div>',
 scope: this,
 onclick: function() {
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=unlinkforeignkey&myid='+$(thisObj.mykeycol+thisObj.form.uid).value+'&fkid='+thisObj.gridpanel.selectedRow.cells.item(0).value+'&formid='+thisObj.form.id,
 method: 'POST',
 param: {
 item: JSON.stringify(thisObj.conf)
 }, 
 callback: function(response){ 
 var result = eval("("+response.responseText+")");
 thisObj.data['datasets']=result['datasets'];
 thisObj.data['fkdatasets']=result['fkdatasets'];
 thisObj.gridpanel.update(result['datasets']);
 }
 }).request();

 }
 },{
 id: this.id+'-buttons-del-all',
 text: '<div style="color:#f00">Alle Verk. lösen</div>',
 scope: this,
 onclick: function() {
 var fkids=[];
 for(j=0;j<thisObj.gridpanel.items.length;j++){
 fkids[j]=thisObj.gridpanel.items[j][0];
 }

 
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=unlinkallforeignkeys&myid='+$(thisObj.mykeycol+thisObj.form.uid).value+'&formid='+thisObj.form.id,
 method: 'POST',
 param: {
 item: JSON.stringify(thisObj.conf),
 fkids: JSON.stringify(fkids)
 }, 
 callback: function(response){ 
 var result = eval("("+response.responseText+")");
 thisObj.data['datasets']=result['datasets'];
 thisObj.data['fkdatasets']=result['fkdatasets'];
 thisObj.gridpanel.update(result['datasets']);
 thisObj.gridpanel.itemsUnfiltered=result['datasets'];
 thisObj.gridpanel.filtered=false;
 }
 }).request(); 

 }
 },{
 id: this.id+'-buttons-edit',
 text: 'Neu/Bearbeiten',
 scope: this,
 onclick: function() {
 
 if($(thisObj.mykeycol+thisObj.form.uid).value==""){
 $error("Bitte speichern Sie den (neuen) Datensatz zunächst, um Verknüpfungen erstellen zu können.");
 return;
 }

  
 if(thisObj.gridpanel.selectedRow!=null){
 var dsid=thisObj.gridpanel.selectedRow.cells.item(0).value;
 ljex.Form.externalEdit(dsid,thisObj);
 }else{

 ljex.Form.externalEdit(null,thisObj);
 }

 }
 }]
 });

 this.toolbar.render();

 }
 }).request();
}



ljex.Calendar = function(conf){
 $assimilate.call(this, conf);
 
 var names = ljex.Calendar.monthnames[ljex.lang];

 this.calID = this.id+'_calendar';
 
 this.months = [
 { name: names[0], value: "01", days: 31, next: 1, prev: 11 },
 { name: names[1], value: "02", days: 28, next: 2, prev: 0 },
 { name: names[2], value: "03", days: 31, next: 3, prev: 1 },
 { name: names[3], value: "04", days: 30, next: 4, prev: 2 },
 { name: names[4], value: "05", days: 31, next: 5, prev: 3 },
 { name: names[5], value: "06", days: 30, next: 6, prev: 4 },
 { name: names[6], value: "07", days: 31, next: 7, prev: 5 },
 { name: names[7], value: "08", days: 31, next: 8, prev: 6 },
 { name: names[8], value: "09", days: 30, next: 9, prev: 7 },
 { name: names[9], value: "10", days: 31, next: 10, prev: 8 },
 { name: names[10], value: "11", days: 30, next: 11, prev: 9 },
 { name: names[11], value: "12", days: 31, next: 0, prev: 10 }
 ];

 
 ljex.Calendar.instances[this.id]=this;
}

ljex.Calendar.instances = [];
ljex.Calendar.getInstance = function(id){
 return (ljex.Calendar.instances[id]==undefined)?null:ljex.Calendar.instances[id];
}

ljex.Calendar.monthnames = {
 de: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],
 en: ["January","February","March","April","Mai","June","Juli","August","September","October","November","December"],
 fr: ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Auguste","Septembre","Octobre","Novembre","Décembre"]
};

ljex.Calendar.prototype.open = function(){
 var thisObj=this;

 this.aktMonth = ($(this.id).value=="" )?new Date().getMonth()+1:$(this.id).value.substr(5,2);
 if(this.aktMonth=="") this.aktMonth="1";
 this.aktMonth--;

 this.aktYear = ($(this.id).value=="" )?new Date().getFullYear():$(this.id).value.substr(0,4);
 if(this.aktYear%4==0) this.months[1].days=29;

 $(this.id+'_calendar').style.display="block";
 var dayCount=1;

 if($(this.id).value!=""){
 $(this.id+'_calendar').innerHTML="";
 }

 if($(this.id+'_calendar').innerHTML==""){
 var monthCt=$create(this.id+'-month-ct');
 with(monthCt.style){
 position="absolute";
 width="138px";
 marginLeft="1px";
 marginTop="1px";
 backgroundColor="#111";
 color="#fff";
 fontSize="9px";
 height="20px";
 }
 var monthPrevCt=$create(this.id+'-month-prev-ct');
 with(monthPrevCt.style){
 position="absolute";
 margin="2px 2px 0px 2px";
 cursor="pointer";
 cssFloat="left";
 }
 monthPrevCt.innerHTML="«";
 monthPrevCt.onclick = function() {
 var prevmonth = thisObj.months[thisObj.aktMonth].prev;
 thisObj.aktMonth = prevmonth;
 $(thisObj.id+"-month-name-ct").innerHTML=thisObj.months[prevmonth].name;

 var anzdays = thisObj.months[prevmonth].days;
 for(var i=28;i<32;i++){
 if(i<=anzdays) $(thisObj.id+'_day_'+i).style.display="block";
 else $(thisObj.id+'_day_'+i).style.display="none";
 }
 }

 monthCt.appendChild(monthPrevCt);

 var monthNameCt=$create(this.id+"-month-name-ct");
 monthNameCt.innerHTML=this.months[this.aktMonth].name;
 with(monthNameCt.style){
 position="absolute";
 left="10px";
 cssFloat="left";
 width="50px";
 marginTop="4px";
 }
 monthNameCt.align="center";
 monthCt.appendChild(monthNameCt);

 
 var monthNextCt=$create(this.id+'-month-next-ct');
 with(monthNextCt.style){
 position="absolute";
 left="60px";
 margin="2px 0px 0px 2px";
 cursor="pointer";
 cssFloat="left";
 }
 monthNextCt.innerHTML="»";
 monthNextCt.onclick = function() {
 var nextmonth = thisObj.months[thisObj.aktMonth].next;
 thisObj.aktMonth = nextmonth;
 $(thisObj.id+"-month-name-ct").innerHTML=thisObj.months[nextmonth].name;

 var anzdays = thisObj.months[nextmonth].days;
 for(var i=28;i<32;i++){
 if(i<=anzdays) $(thisObj.id+'_day_'+i).style.display="block";
 else $(thisObj.id+'_day_'+i).style.display="none";
 }

 }
 monthCt.appendChild(monthNextCt);
 
 var yearPrevCt=$create(this.id+'-year-prev-ct');
 with(yearPrevCt.style){
 position="absolute";
 left="70px";
 margin="2px 2px 0px 10px";
 cursor="pointer";
 cssFloat="left";
 }
 yearPrevCt.innerHTML="«";
 yearPrevCt.onclick = function() {
 thisObj.aktYear--;
 $(thisObj.id+"-year-name-ct").innerHTML=thisObj.aktYear;
 if(thisObj.aktYear%4==0){
 thisObj.months[1].days=29;
 $(thisObj.id+'_day_29').style.display='block';
 }else{
 thisObj.months[1].days=28;
 if(thisObj.aktMonth==1)
 $(thisObj.id+'_day_29').style.display='none';
 }
 }

 monthCt.appendChild(yearPrevCt);

 var yearNameCt=$create(this.id+"-year-name-ct");
 yearNameCt.innerHTML=this.aktYear;
 with(yearNameCt.style){
 position="absolute";
 left="88px";
 cssFloat="left";
 marginTop="4px";
 }
 yearNameCt.align="center";
 monthCt.appendChild(yearNameCt);

 
 var yearNextCt=$create(this.id+'-year-next-ct');
 with(yearNextCt.style){
 position="absolute";
 left="110px";
 margin="2px 0px 0px 2px";
 cursor="pointer";
 cssFloat="left";
 }
 yearNextCt.innerHTML="»";
 yearNextCt.onclick = function() {
 thisObj.aktYear++;
 $(thisObj.id+"-year-name-ct").innerHTML=thisObj.aktYear; 

 if(thisObj.aktYear%4==0){
 thisObj.months[1].days=29;
 $(thisObj.id+'_day_29').style.display='block';
 }else{
 thisObj.months[1].days=28;
 if(thisObj.aktMonth==1)
 $(thisObj.id+'_day_29').style.display='none';
 }
 }
 monthCt.appendChild(yearNextCt);

 var clCt=$create();
 clCt.style.clear="left";
 monthCt.appendChild(clCt);

 $(this.id+'_calendar').appendChild(monthCt);
 
 var regex=/^\d\d\d\d\-\d\d\-\d\d$/;
 var success = ($(this.id).value!="" && regex.test($(this.id).value))?true:false;
 var aktday = (success)?$(this.id).value.substr(8,2):1;

 for(var j=0;j<5;j++){
 for(var i=0;i<7;i++){
 if(dayCount>31) break;
 var day=$create(this.id+'_day_'+dayCount);
 with(day.style){
 position="absolute";
 top=(j*20+22)+"px";
 left=(i*20)+"px";
 width="18px";
 height="18px";
 backgroundColor=((i==0 || (i%2)==0)?"#aaa":"#ccc");
 cssFloat="left";
 cursor="pointer";
 borderColor=(aktday==dayCount)?"#f00":"#fff";
 borderStyle="solid";
 borderWidth="1px";
 if(dayCount>this.months[this.aktMonth].days) display="none";
 }
 day.setAttribute("dayval",(dayCount<10)?"0"+dayCount:dayCount );
 day.onclick = function(){ 
 thisObj.aktDay=parseInt(this.getAttribute("dayval"));
 $(thisObj.id).value=thisObj.aktYear+"-"+thisObj.months[thisObj.aktMonth].value+"-"+this.getAttribute("dayval");
 $(thisObj.calID).style.display='none';

 $(thisObj.id+'_err').style.display="none";
 $(thisObj.id).className="lx-form-input";
 }
 day.onmouseover = function() { if(thisObj.aktDay!=parseInt(this.getAttribute("dayval"))) this.style.borderColor="#555"; };
 day.onmouseout = function() { if(thisObj.aktDay!=parseInt(this.getAttribute("dayval"))) this.style.borderColor="#fff"; };

 day.innerHTML="<div style='padding-top:4px;' align=center>"+(dayCount++)+"</div>";
 $(thisObj.id+'_calendar').appendChild(day);
 }
 var clCt=$create();
 clCt.style.clear="left";
 $(thisObj.id+'_calendar').appendChild(clCt);
 }
 }
}


ljex.Form.openDropDown=null;


ljex.Form.prototype.updateItems = function(items){
 this.config.items=items;
 this.items=items;
}


 
ljex.Form.prototype.loadForm = function(data){
 var d=data;
 this.updateItems([]);
 var thisObj=this;

 if(this.showLoader)
 $(this.renderTo).innerHTML="<img src='"+ljex.path+"/images/ajax-loader6.gif'>";

 if(typeof cms != "undefined" && cms!=null){
 thisObj.progress = new cms.progressBox("Lade Daten...");
 }

 var transferConf=ljex.clone.call(this.config);
 transferConf.onrender=null;
 if(transferConf.buttons!=undefined){
 for(var k=0;k<transferConf.buttons.length;k++){
 transferConf.buttons[k].scope=null;
 transferConf.buttons[k].handler=null;
 }
 }

 new ljex.Ajax({
 url: '/lib/FormController.php5?command=load',
 method: 'POST',
 param: {
 config: JSON.stringify(transferConf)
 },
 scope: this,
 callback: function(response,scope){
 data = JSON.parse(response.responseText);
 this.searchitems=data['searchitems'];
 this.uid = data['uid'];
 this.updateItems(data['items']);
 this.positionable=data.positionable;
 this.flds2check=[];
 $(this.renderTo).innerHTML=data['html'];
 if(this.footer!=undefined && this.footer!=null){
 $(this.renderTo).innerHTML+=this.footer;
 }

  
  
 if(thisObj.buttons!=undefined){
 for(var i=0;i<thisObj.buttons.length;i++){
 if(thisObj.buttons[i]['submit'] && data['presubmit'] && data.presubmit!=""){
 $loadScript(data.presubmit+'.js',data.presubmit,null);
 thisObj.buttons[i]['preSubmit'] = data.presubmit;
 break;
 }
 if(thisObj.buttons[i]['submit'] && thisObj.formLoader.frm_presubmit && thisObj.formLoader.frm_presubmit!=""){
 $loadScript(thisObj.formLoader.frm_presubmit+'.js',thisObj.formLoader.frm_presubmit,null);
 thisObj.buttons[i]['preSubmit'] = thisObj.formLoader.frm_presubmit;
 break;
 }

 }
 }
 this.init();
 if(this.onrender) this.onrender.call(this);
 if(d && d.callback) d.callback.call(this);
 if(typeof cms != "undefined" && cms!=null && thisObj.progress) thisObj.progress.close();
 }
 }).request();

}

 
ljex.Form.prototype.render = function(rendermode,loadanim,callback){
 if(loadanim || this.showLoader)
 $(this.renderTo).innerHTML="<img src='"+ljex.path+"/images/ajax-loader6.gif'>"+this.showLoader;

 this.config.items = this.items;
 
 var transferConf=ljex.clone.call(this.config);
 transferConf.onrender=null;
 if(transferConf.buttons!=undefined){
 for(var k=0;k<transferConf.buttons.length;k++){
 transferConf.buttons[k].scope=null;
 transferConf.buttons[k].handler=null;
 }
 }

 new ljex.Ajax({
 url: '/lib/FormController.php5?command=render&mode=form&uid='+this.renderTo,
 method: 'POST',
 param: {
 config: JSON.stringify(transferConf)
 },
 scope: this,
 callback: function(response,scope){
  
 var data = eval("("+response.responseText+")");

 if($(this.renderTo)) $(this.renderTo).innerHTML=data['html'];

 if(this.footer!=undefined){
 $(this.renderTo).innerHTML+=this.footer;
 }
 this.init();
 if(this.onrender) this.onrender.call(this);
 }
 }).request();
}

ljex.Form.toggleDropDown = function(id){
 var el = $(id);

 if(el.style.display=='none' || el.style.display==''){
 el.style.display='block';
 if(ljex.Form.openDropDown!=null) ljex.Form.openDropDown.style.display='none';
 ljex.Form.openDropDown=id;  
 }else{
 el.style.display='none';
 ljex.Form.openDropDown=null;
 }
}

ljex.Form.dropDownClicked =function(id,val,realval){
 var el = $(id+'-input');
 el.value=val;
 el.focus();
 $(id).value=realval;
 $(id+'-input_lst').style.display="none";
 $(id+'-input_err').style.display='none';
 el.onchange();  
}

 
ljex.Form.prototype.reload = function(item){
 
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=reload&operation=update_'+item['xtype'],
 method: 'POST',
 param: {
 config: JSON.stringify(item)
 },
 scope: this,
 callback: function(response){
 var data = eval("("+response.responseText+")");

 var newitem=data.item;
 var par=$(item['id']+'-container');

 var sel=document.createElement("select");
 sel.id=item.id+'-input_lst';
 sel.size=5;
 sel.className='lx-form-dropdown-list';

 sel.style.marginLeft=$(item.id+'-input_lst').style.marginLeft;
 sel.style.width=$(item.id+'-input_lst').style.width;
 sel.style.clear="both";
 sel.style.height=$(item.id+'-input_lst').style.height;

 
 for(var i in newitem.items){
 var opt=document.createElement("option");
 opt.className="lx-form-dropdown-entry";
 opt.id=item.id+'-'+i;
 opt.num=i;
 opt.innerHTML=newitem.items[i];
 opt.value=newitem.values[i];

 opt.onclick=function() {
 var val=this.innerHTML.replace(/&amp;/g, "&");  
 ljex.Form.dropDownClicked(item.id, val, this.value);
 }
 sel.appendChild(opt);
 }

 par.replaceChild(sel,$(item['id']+'-input_lst'));
 this.configItems(this.items);

 item=data.item;
 if(item['value']!=undefined && item['value']!=""){
 for(var i in item['values']){
 if(item['values'][i]==item.value){
 $(item.id+'-input').value=item.items[i];
 break;
 }
 }
 }else{
 $(item.id+'-input').value="";
 }
 }
 }).request();
}


ljex.Form.prototype.removeField = function(id){
 var parentEl = $(id+'-container').parentNode;
 parentEl.removeChild($(id+'-container'));
}

 
ljex.Form.prototype.insertField = function(insertBeforeId,config){
 var thisObj=this;
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=render&mode=field',
 method: 'POST',
 param: {
 config: JSON.stringify(config)
 },
 scope: this,
 callback: function(response){
 var outerEl=document.createElement("div");
 outerEl.innerHTML=response.responseText;

 var newEl = outerEl.firstChild;
 $(this.id+'-ct').insertBefore(newEl,$(insertBeforeId+'-container'));
 thisObj.configItems(config);
 }
 }).request();
}

 
ljex.Form.prototype.replaceField = function(oldFieldID, newFieldConfig){  
 var thisObj=this;
 new ljex.Ajax({
 url: '/lib/FormController.php5?command=render&mode=field',
 method: 'POST',
 param: {
 config: JSON.stringify(newFieldConfig)
 },
 scope: this,
 callback: function(response){
 var outerEl=document.createElement("div");
 outerEl.innerHTML=response.responseText;

 $(oldFieldID+'-container').innerHTML=outerEl.firstChild.innerHTML;

 thisObj.configItems(newFieldConfig);
 }
 }).request();
}  

 
ljex.Form.prototype.form2html = function(){
 var bg="background-color:#aaa;";
 
 html="<table cellpadding=5>";
 for(key in this.fldValues){
 var item = this.getField(key);
 if(item!==undefined && !(key.match(/-input/)) && item.label!==undefined && item.xtype!="hidden"){
 var label = item.label;
 if(item.xtype=='dropdown'){
 var value = this.fldValues[key+'-input'];
 }else if(item.xtype=="textarea"){
 var value = this.fldValues[key].replace(/\n/g,"<br>");
 value = value.replace(/\\/g,"");
 }else{
 var value = this.fldValues[key];
 }

 html+="<tr><td style="+bg+">"+label+": </td><td > "+value+"</td></tr>";
 }
 }

 html+="</table>";
 return html;

}

ljex.Form.prototype.getValue = function(id){
 var el=this.domForm.elements[id];
 if(typeof(el)=="object"){
 for(var i=0;i<el.length;i++){
 if(el[i].checked){
 return el[i].value;
 }
 }
 }else{
 return el.value;
 }
}


ljex.Form.prototype.getValues = function(){
 var el=this.domForm.elements;
 var vals = new Array();

 for(var i=0;i<el.length;i++){
  
  
 vals[i] = {};
 vals[i]['id']=el[i].id;
 vals[i]['value']=(el[i].type=="checkbox" || el[i].type=="radio")?el[i].value:el[i].value;
  
 
 
 }

  

 return vals;
}


