/*
   Funkce vyuzivajici XML HTTP Request
*/

//vraci HTTP objekt k zasilani http pozadavku zpet na server
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

//globalni objekt pro pristup k posilani pozadavku na server
var globalHttpObject = getHTTPObject(); 

//stranka, ktera se bude volat kvuli refreshi session
var globalRefreshPage = "";
var globalRefreshTime = 0;

//info, kde byl posledni focus
var globalLastFocus = null;

//zavola pres http request pozadavek na server a tim zpusobi refresh session
function refreshSession() {
  if (globalHttpObject) {
    globalHttpObject.open("GET", globalRefreshPage, true);
    globalHttpObject.send(null);
    setTimeout( "refreshSession()", globalRefreshTime );
  }  
}

//automaticky refresh session po zadany cas v minutach
function setRefreshSession(refreshPage,time) {
   globalRefreshPage = refreshPage;
   globalRefreshTime = time * 1000;
   setTimeout( "refreshSession()", globalRefreshTime );
}

function invokeRequest(actionName, params) {
  var requester = getHTTPObject();
  var rString = globalContextPath + '/' + actionName + globalActionPostfix + '?' + params;
  requester.open("GET", rString, false);
  requester.send(null);

  return requester.responseXML;
}

function invokeTextRequest(actionName, params) {
  var requester = getHTTPObject();
  var rString = globalContextPath + '/' + actionName + globalActionPostfix + '?' + params;
  requester.open("GET", rString, false);
  requester.send(null);
  return requester.responseText;
}

function invokeAsynRequest(actionName, params) {
  var requester = getHTTPObject();
  
  var rString = null;
  
  // GET request lenght limit
  if (params.lenght<1900) { 
	rString = globalContextPath + '/' + actionName + globalActionPostfix + '?' + params;
	requester.open("GET", rString, true);
  	requester.send(null);
  // POST request
  } else {
	rString = globalContextPath + '/' + actionName + globalActionPostfix;
	
	requester.open("POST", rString, true);
	
	//Send the proper header information along with the request
	requester.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	if ((/MSIE \d+\.\d+;/.test(navigator.userAgent)) == false) {
		requester.setRequestHeader("Content-Length", params.length);
		requester.setRequestHeader("Connection", "close");
	}	
	requester.send(params);	  
  }
}

function invokeMethod(method, parameters) {
  var requester = getHTTPObject();
  var paramStr = '';
  for (var i = 0; i < parameters.length; i++) paramStr += '@' + parameters[i];
  
  var rString = globalContextPath + '/WfUniversalActionXML.do' + globalActionPostfix + '?method=' + method + '&parameters=' + paramStr.substring(1);
  requester.open("GET", rString, false);
  requester.send(null);

  return requester.responseXML;
}

//-------------- editor referenci ------------------


//Pripravi defaultni konfiguraci a ulozi ji, je treba naplnit:
//conf.source,conf.result, conf.objId, conf.objPropName
function referenceEditorRegisterConfiguration(name) {
	var conf = new Object();
	conf.name=name;
	conf.properties=new Array();
	conf.showID=true;
	conf.showDisplay=true;
	conf.showIcon=true;
	conf.showEditIcon=true;
	conf.editAsDraft=false;
	conf.showObjectDefName=false;
	conf.showObjectDefNameTitle=false;
	conf.iconUp='/images/reference/up.gif';
	conf.iconDown='/images/reference/down.gif';
	conf.iconCut='/images/reference/remove.gif';
	conf.iconDestroy='/images/reference/destroy.gif';
	conf.showEditFileIcon=false;
	conf.sequence = false;
	conf.fragment= false;
	conf.saveImmediately = false;
	conf.lazyInit = false;
    conf.cache = new Array();
    referenceEditorConfiguration[referenceEditorConfiguration.length] = conf;
	return conf;
}

//moznost definovat obsluhu udalosti (rozsireni editoru referenci)
var referenceEditorModifyEvent = null; //example(conf)
var referenceEditorShowRowEvent = null; //example(row,id,conf)

//vygeneruje reference editor podle jmena konfigurace
function referenceEditorGenerateHTML(name) {
  var conf = referenceEditorFindConfiguration(name);

  var values = document.getElementById(conf.source).value.split(',');
  var table = document.getElementById(conf.result);
  var row;var cell;
  
  conf.draftsNeedToBeSaved = false;
  
  while(table.rows.length>0) table.deleteRow(0);
  for (var i = 0; i < values.length; i++) {
    if (values[i] == '') continue;
    
    var addInfo;
    
    if (conf.lazyInit==true) {
    	  addInfo = new Object();
    	  addInfo.properties = Array();
    	  addInfo.id = conf.objId;
    	  addInfo.enabledToEdit = (conf.draft) ? true : false;
    	  addInfo.enabledDraft = (conf.draft) ? false : true;
    	  addInfo.directEdit = true;
    	  addInfo.draftVersion = conf.draft;
    	  conf.lazyInit=false;
    } else {
    	addInfo = getAdditionalInfo(name,values[i]);
    }
    if (addInfo == null) continue;
    
    row = table.insertRow(table.rows.length);
    
    //pokud je v referenci draft, nebo objekt, ktery ma draft, dame tomu jiny podklad
    if(!conf.fragment && addInfo.draftVersion != 0) {
    	row.style.background='#ffeeee'; //TODO do spravneho stylu
    	//pokud je to aktivni verze, ktera ma draft a neni to fragment, zapamatujeme si to kvuli odesilani formulare
    	if(!addInfo.isNewDraft) conf.draftsNeedToBeSaved = true;
    }	
    
    if (conf.showID == true) {
      cell = row.insertCell(row.cells.length);
      cell.innerHTML = values[i];
    }

    if (conf.showIcon == true) {
      cell = row.insertCell(row.cells.length);
      var url = globalContextPath + '/PersistentObjectAction.do' + globalActionPostfix + '?id=' + values[i];
      if(linksDisabled) url = 'javascript:linkWarningMessage(\'' + url + '\');';
      cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.show'] + '" href="' + url + '"><img src="' + addInfo.icon + '" style="width : 16px; height : 16px;"></a>';	   
    }
    
    //pokud to neni fragment a neni to bezdraftova editace umoznime praci s draftama
    if(!conf.fragment && !conf.suppressDraft && conf.draftControls) {
      if(addInfo.enabledDraft && !addInfo.error) {	
        cell = row.insertCell(row.cells.length);
        url = "javascript:referenceEditorCreateDraft("+values[i]+",'"+name+"');";
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.draft.create'] + '" href="' + url + '"><img src="' + globalContextPath + '/images/reference/createdraft.gif"></a>';
      } else {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<img src="' + globalContextPath + '/images/reference/createdraft_disabled.gif" title="' + conf.localTexts['persistent.reference.draft.create'] + '">';    	  
      }
    
    
      //pokud lze ulozit draft (draft existuje), nabidneme ulozeni a storno
      if(addInfo.draftVersion != 0 && !addInfo.error) {
        cell = row.insertCell(row.cells.length);
        url = "javascript:referenceEditorSaveDraft("+addInfo.draftVersion+","+values[i]+",'"+name+"');";
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.draft.save'] + '" href="' + url + '"><img src="' + globalContextPath + '/images/reference/savedraft.gif"></a>';
        cell = row.insertCell(row.cells.length);
        url = "javascript:referenceEditorStornoDraft("+addInfo.draftVersion+","+values[i]+",'"+name+"',"+addInfo.isNewDraft+","+i+")";
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.draft.storno'] + '" href="' + url + '"><img src="' + globalContextPath + '/images/reference/stornodraft.gif"></a>';	       	        
      } else {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<img src="' + globalContextPath + '/images/reference/savedraft_disabled.gif" title="' + conf.localTexts['persistent.reference.draft.save'] + '">';    	  
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<img src="' + globalContextPath + '/images/reference/stornodraft_disabled.gif" title="' + conf.localTexts['persistent.reference.draft.storno'] + '"">';    	      	  
      }
    }
    
    
    if (conf.showEditIcon == true) {
      if (conf.showDisabledEditIcon || addInfo.enabledToEdit) {
        cell = row.insertCell(row.cells.length);
        if (addInfo.enabledToEdit && (conf.fragment || conf.suppressDraft || addInfo.draftVersion != 0) && !addInfo.error)
          cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.edit'] + '" href="javascript:referenceEditorOpenForEdit(' + conf.editAsDraft + ', ' + values[i] + ')"><img src="' + globalContextPath + '/images/reference/edit.gif"></a>';
        else
          cell.innerHTML = '<img src="' + globalContextPath + '/images/reference/edit_disabled.gif" style="width : 15px; height : 15px;" title="' + conf.localTexts['persistent.reference.editdisabled'] + '" />';
      }
    }
   
    
    if (conf.showEditFileIcon == true) {
      if (addInfo.directAddress != null && (conf.fragment || addInfo.draftVersion != 0) && !conf.suppressDraft && !addInfo.error) {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.fileedit'] + '" href="' + addInfo.directAddress + '"><img src="' + globalContextPath + '/images/reference/directedit.gif"></a>';
      } else {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '&nbsp';	
      } 
    }
    
    if(addInfo.directEdit && (conf.fragment || addInfo.draftVersion != 0) && !conf.suppressDraft && !addInfo.error) {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.fileedit'] + '" href="javascript:directOpenFileSimple(' + addInfo.draftVersion + ');"><img src="' + globalContextPath + '/images/reference/directedit.gif"></a>';    
    } else {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '&nbsp';	
    } 
    
    if (referenceEditorShowRowEvent != null) referenceEditorShowRowEvent(row,values[i],conf);
    if (conf.iconDown != null) {cell = row.insertCell(row.cells.length); cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.down'] + '" href="javascript:referenceEditorMove(\'' + name + '\','+i+',false)"><img border="0" src="'+ globalContextPath + conf.iconDown + '"></a>';}    
    if (conf.iconUp != null) {cell = row.insertCell(row.cells.length); cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.up'] + '" href="javascript:referenceEditorMove(\'' + name + '\','+i+',true)"><img border="0" src="'+ globalContextPath + conf.iconUp +'"></a>';}
    if (conf.iconCut != null) {
    	//if(conf.fragment || addInfo.isNewDraft || addInfo.draftVersion == 0 || addInfo.error) { //bud fragment, nebo ve volne vazbe nesmi byt reference z aktivni na draft
    	if(true) {
    	  cell = row.insertCell(row.cells.length); cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.remove'] + '" href="javascript:referenceEditorRemove(\'' + name + '\','+i+')"><img border="0" src="'+ globalContextPath + conf.iconCut + '"></a>';
    	} else {
          cell = row.insertCell(row.cells.length);
          cell.innerHTML = '<img src="' + globalContextPath + conf.iconCut +'" title="' + conf.localTexts['persistent.reference.remove'] + '">';    	      	      	      		
    	}
    }
    if (conf.iconDestroy != null) {
      //if (conf.fragment || ((!conf.destroyOnlyNewDraft || addInfo.isNewDraft) && (addInfo.isNewDraft || addInfo.draftVersion == 0))) {
    	if(!conf.destroyOnlyNewDraft) {
        cell = row.insertCell(row.cells.length);
        cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.destroy'] + '" href="javascript:referenceEditorDestroy(\'' + name + '\','+i+')"><img border="0" src="'+ globalContextPath + conf.iconDestroy + '"></a>';
      } else {
          cell = row.insertCell(row.cells.length);
          cell.innerHTML = '<img src="' + globalContextPath + conf.iconDestroy +'" title="' + conf.localTexts['persistent.reference.destroy'] + '">';    	      	      	  
      }
    }

    if (conf.showObjectDefName == true) {cell = row.insertCell(row.cells.length); cell.innerHTML = addInfo.objectDefName;}
    if (conf.showObjectDefNameTitle == true) {cell = row.insertCell(row.cells.length); cell.innerHTML = addInfo.objectDefNameTitle;}
    if (conf.showDisplay == true) {cell = row.insertCell(row.cells.length); cell.innerHTML = addInfo.display;}
    
    for (var j = 0; j < addInfo.properties.length; j++) {
       cell = row.insertCell(row.cells.length);
       cell.innerHTML = addInfo.properties[j];
    }
  }  
  // IE 'hack' pro spravne zobrazovani tabulky
  table.style.display = 'none';
  table.style.display = 'block';
}

// posledni editovany objekt
var referenceEditorLastEditObjID = -1;

// otevre editaci hodnoty
function referenceEditorOpenForEdit(editAsDraft, objID) {
  var realID = objID;
  
  // pokud dokument -> nutno editovat v draftu, jestli existuje
  var responseXML = referenceEditorInvoke('getDocumentDraft', [objID,editAsDraft]);
  if (responseXML != null) {
    var dd = responseXML.getElementsByTagName('id');
    if (dd != null && dd.length > 0) realID = dd[0].childNodes[0].nodeValue;
  } 
     
  referenceEditorLastEditObjID = realID;
  referenceEditorOpenNewWindow(globalContextPath + '/PersistentObjectAction.do' + globalActionPostfix + '?id=' + realID + '&direct=true&pageType=singleedit',800,600);
}

//presuneme vybranou polozku nahoru nebo dolu
function referenceEditorMove(name, position, up)
{
 var conf = referenceEditorFindConfiguration(name);
 var val = document.getElementById(conf.source).value;
 var values = val.split(',');
 if(values.length < 2) return;
 var tmp;
 
 if(up && position == 0) {
 	tmp = values[0];   
    for(var i=0; i<values.length - 1;i++)
     values[i]=values[i+1];
    values[values.length - 1] = tmp;
 } else if(!up && position == values.length - 1) {
    tmp = values[values.length - 1];
    for(var i=values.length - 1; i>0; i--) 
     values[i]=values[i-1];
    values[0] = tmp;
 } else {
 
 	var c;
 	if(up) c = position - 1;
  	else c = position + 1;

 	tmp = values[c];
 	values[c] = values[position]
 	values[position] = tmp;
 	}
 	
 val = '';
 for(var i=0; i<values.length; i++) {
    if(val.length !=0) val = val + ',';
    val = val + values[i];
 }
 document.getElementById(conf.source).value = val; 
 referenceEditorUpdateAfterChange(name);
 
}

//odebere vybranou polozku
function referenceEditorRemove(name, position)
{
  var conf = referenceEditorFindConfiguration(name);
  var val = document.getElementById(conf.source).value;
  var values = val.split(',');
  val = '';
  for(var i=0; i<values.length; i++) 
     if(position != i) {
        if(val.length !=0) val = val + ',';
        val = val + values[i];
     }
  document.getElementById(conf.source).value = val;
  referenceEditorUpdateAfterChange(name);
}

function referenceEditorDestroy(name, position) {
  var conf = referenceEditorFindConfiguration(name);

  if(confirm(conf.localTexts['confirms.reference.destroy']) == false) return;
  
  var val = document.getElementById(conf.source).value;
  var values = val.split(',');
  //posleme pozadavek 
  var requester = getHTTPObject();
  var rString = globalContextPath + "/DestroyReferenceActionXML.do" + globalActionPostfix + "?id=" +conf.objId + "&property=" + conf.objPropName + "&reference=" + values[position];
  requester.open("GET", rString, false);
  requester.send(null);

  //test neuspesnosti	
  if(requester.responseXML == null) return;
  var errElements = requester.responseXML.getElementsByTagName("errorMessage");
  if(errElements.length > 0) {
     alert(errElements[0].childNodes[0].nodeValue);
     return;
  }   
  
  //odebereme polozku i z naseho editoru
  val = '';
  for(var i=0; i<values.length; i++) 
     if(position != i) {
        if(val.length !=0) val = val + ',';
        val = val + values[i];
     }
  document.getElementById(conf.source).value = val;
  referenceEditorUpdateAfterChange(name);  
}

//vraci dodatecne informace z aplikace
function getAdditionalInfo(name, id) {
  var conf = referenceEditorFindConfiguration(name);
  
  // zkusime najit v cache, jestli existuje
  for (var i = 0; i < conf.cache.length; i++) {
    if (conf.cache[i].id == id) return conf.cache[i];
  }
  
  var requester = getHTTPObject();
  var rString = globalContextPath + "/PersistentObjectXMLInfo.do" + globalActionPostfix + "?id=" + id + "&properties=";
  
  for (var i = 0; i < conf.properties.length; i++) {
    if( i != 0) rString = rString + ",";
    rString = rString + conf.properties[i];
  }
  
  requester.open("GET", rString, false);
  requester.send(null);

  var info = new Object();
  info.properties = Array();
  info.id = id;

  // test neuspesnosti	
  if (requester.responseXML == null) return null;
  var errElements = requester.responseXML.getElementsByTagName("errorMessage");
  if (errElements.length > 0) {
    info.icon = globalContextPath + "/images/persistent/object.gif";
    info.display = "# " + errElements[0].childNodes[0].nodeValue;
    info.objectDefName = "";
    info.objectDefNameTitle = "";
    info.error = true;
    return info;   
  }

  info.icon = requester.responseXML.getElementsByTagName("icon")[0].childNodes[0].nodeValue;
  if (requester.responseXML.getElementsByTagName("display")[0].childNodes.length != 0)
    info.display = requester.responseXML.getElementsByTagName("display")[0].childNodes[0].nodeValue;
  else 
    info.display = '';
  
  var props = requester.responseXML.getElementsByTagName("property");
  for (var i = 0; i < conf.properties.length; i++)
    info.properties[i] = props[i].childNodes.length == 0  ? '' : props[i].childNodes[0].nodeValue;
  
  info.objectDefName = requester.responseXML.getElementsByTagName("objectDefName")[0].childNodes[0].nodeValue;
  info.objectDefNameTitle = requester.responseXML.getElementsByTagName("objectDefNameTitle")[0].childNodes[0].nodeValue;
  
  // moznost editace
  if (requester.responseXML.getElementsByTagName("enabledToEdit") && 
      requester.responseXML.getElementsByTagName("enabledToEdit").length > 0)
      info.enabledToEdit = requester.responseXML.getElementsByTagName("enabledToEdit")[0].childNodes[0].nodeValue == 1;
  
  // prima editace
  if (requester.responseXML.getElementsByTagName("directAddress") && 
      requester.responseXML.getElementsByTagName("directAddress").length > 0)
      info.directAddress = requester.responseXML.getElementsByTagName("directAddress")[0].childNodes[0].nodeValue;
  else 
    info.directAddress = null;
 
  // prima editace pres applet
  if (requester.responseXML.getElementsByTagName("directEdit") && 
      requester.responseXML.getElementsByTagName("directEdit").length > 0)
      info.directEdit = requester.responseXML.getElementsByTagName("directEdit")[0].childNodes[0].nodeValue == 1;
  else 
    info.directEdit = false;
    
  // novy draft
  if (requester.responseXML.getElementsByTagName("newdraft") && 
      requester.responseXML.getElementsByTagName("newdraft").length > 0)
      info.isNewDraft = requester.responseXML.getElementsByTagName("newdraft")[0].childNodes[0].nodeValue == 1;
      
  //existence nejakeho draftu
  info.draftVersion = 0;
  if (requester.responseXML.getElementsByTagName("draftVersion") && 
	      requester.responseXML.getElementsByTagName("draftVersion").length > 0)
      info.draftVersion = requester.responseXML.getElementsByTagName("draftVersion")[0].childNodes[0].nodeValue;
  
  //moznost vytvorit draft
  if (requester.responseXML.getElementsByTagName("enabledDraft") && 
	      requester.responseXML.getElementsByTagName("enabledDraft").length > 0)
      info.enabledDraft = requester.responseXML.getElementsByTagName("enabledDraft")[0].childNodes[0].nodeValue == 1;
  
  //moznost ulozit draft
  if (requester.responseXML.getElementsByTagName("enabledActual") && 
	      requester.responseXML.getElementsByTagName("enabledActual").length > 0)
      info.enabledActual = requester.responseXML.getElementsByTagName("enabledActual")[0].childNodes[0].nodeValue == 1;
  
  // ulozime pro pozdejsi pouziti
  conf.cache[conf.cache.length] = info;
  
  return info;
}

function referenceEditorRefreshObject(name, id) {
	  var conf = referenceEditorFindConfiguration(name);	  
	  // zkusime najit v cache, jestli existuje
	  for (var i = 0; i < conf.cache.length; i++) {
	    if (conf.cache[i].id == id) return conf.cache[i].id=-1; //zneplatnime
	  }	
}

//najde pozadovanou konfiguraci
function referenceEditorFindConfiguration(name) {
	for(var i=0; i < referenceEditorConfiguration.length; i++)
		if(referenceEditorConfiguration[i].name == name) return referenceEditorConfiguration[i];
	return null;	
}

//refreshne vsechny reference editory na strance
function referenceEditorRefreshAllHTML(hard) {
	for(var i=0; i < referenceEditorConfiguration.length; i++) {
	  if(hard == true) referenceEditorConfiguration[i].cache = new Array();
	  
	  // pripadne ulozeni draftu
	  if (referenceEditorConfiguration[i].editAsDraft && referenceEditorLastEditObjID > -1) {
	    referenceEditorInvoke('saveDraft', [referenceEditorLastEditObjID]);
  	  referenceEditorLastEditObjID = -1;
	  }
		referenceEditorGenerateHTML(referenceEditorConfiguration[i].name);
	}	
}

//vraci true, pokud v nejakem referencnim editoru je volna vazba na aktivni verzi, ktera ma draft 
function referenceEditorIsDraftToSave() {
	for(var i=0; i < referenceEditorConfiguration.length; i++) {
	  if (referenceEditorConfiguration[i].draftsNeedToBeSaved) return true;
	}
	return false;
}


function referenceEditorOpenNewWindow(url,width,height) {
    var config = 'resizable=yes,scrollbars=1,width=' + width + ',height=' +height;	
	var popup = window.open(url,'_blank',config);
    //disable ostatnich linku v prubehu editace
    //disableAllLinks();	
}

function referenceEditorAddNewDraft(name,objectDefName) {
    //zjistime si hodnotu
    var conf = referenceEditorFindConfiguration(name);
    var val = document.getElementById(conf.source).value;    
    //pokud neni vicenasobna a uz tam neco je, koncime
    if(conf.sequence == false && val.length > 0) {
      alert(conf.localTexts['persistent.reference.objexists']);
      return 0;
    }
    
    var requester = getHTTPObject();
    var rString = globalContextPath + "/CreateDraftActionXML.do" + globalActionPostfix + "?objectDefName=" + objectDefName +"&uploadDefaultTemplate=true";
    
    requester.open("GET", rString, false);
    requester.send(null);
	
	//test neuspesnosti	
    if(requester.responseXML == null) return;
    var errElements = requester.responseXML.getElementsByTagName("errorMessage");
    if(errElements.length > 0) {
     alert(errElements[0].childNodes[0].nodeValue);
     return 0;
    }       
	if(requester.responseXML.getElementsByTagName("id")[0].childNodes.length == 0) return 0;
	//zjistime id
	var id = requester.responseXML.getElementsByTagName("id")[0].childNodes[0].nodeValue;
	//ulozime to input boxu
    if(val.length != 0) val = val + ",";
    val = val + id;
    document.getElementById(conf.source).value = val;
    
    referenceEditorUpdateAfterChange(name);
    return id;
}


function referenceEditorAddNew(name, id) {
    //zjistime si hodnotu
    var conf = null;
	for(var i=0; i < referenceEditorConfiguration.length; i++)
		if(referenceEditorConfiguration[i].name.indexOf(name)>-1) conf=referenceEditorConfiguration[i];
    
    var val = document.getElementById(conf.source).value;
        
    //pokud neni vicenasobna a uz tam neco je, koncime
    if(conf.sequence == false && val.length > 0) {
      alert(conf.localTexts['persistent.reference.objexists']);
      return 0;
    }
	//ulozime to input boxu
    if(val.length != 0) val = val + ",";
    val = val + id;
    document.getElementById(conf.source).value = val;
    
    referenceEditorUpdateAfterChange(conf.name);
    return id;
}


function referenceEditorDirectUpload(name,mode) {
    // id uploadovanych souboru
    var uploadIDs = "";
    var applet = document.applets[name+'_applet'];
    if (applet == null) {
      alert('Direct Upload Applet not found.');
      return "";
    }
    // metoda appletu
    uploadIDs = applet.uploadFiles(mode);
    if (uploadIDs == null || uploadIDs =="") {
      return "";
    }
    
    //zjistime si konfiguraci
    var conf = referenceEditorFindConfiguration(name);
    
    var val = document.getElementById(conf.source).value;
        
    //pokud neni vicenasobna a uz tam neco je, koncime
    if(conf.sequence == false && val.length > 0) {
      alert(conf.localTexts['persistent.reference.objexists']);
      return 0;
    }
	//ulozime to input boxu
    if(val.length != 0) val = val + ",";
    val = val + uploadIDs;
    document.getElementById(conf.source).value = val;
    
    referenceEditorUpdateAfterChange(conf.name);
    return val;
}


//refreshne ref.editor a updatne na server, pokud vyzadovano
function referenceEditorUpdateAfterChange(name) {
  var conf = referenceEditorFindConfiguration(name);
   
  //pokud je to set, zajistime, aby se hodnoty neopakovaly
  if(conf.set) document.getElementById(conf.source).value = removeDuplicity(document.getElementById(conf.source).value);

  //  refresh
  referenceEditorGenerateHTML(name);		
  
  //eventy zavislych ciselniku
  if(conf.onChangeExpr!=null) conf.onChangeExpr();
  
  // mame to hned ukladat?
  if(conf.saveImmediately == true && conf.objId !=0) {
    var requester = getHTTPObject();
    var rString = globalContextPath + "/PersistentObjectEditXML.do" + globalActionPostfix + "?id=" + conf.objId + "&__" + conf.objPropName + "=" + document.getElementById(conf.source).value;

    requester.open("GET", rString, false);
    requester.send(null);
    
    // test neuspesnosti	
    if(requester.responseXML == null) return;
    var errElements = requester.responseXML.getElementsByTagName("errorMessage");
    if(errElements.length > 0) alert(errElements[0].childNodes[0].nodeValue);
    
    // reload stranky
    if (conf.saveImmediatelyAndReload) {
      var op = conf.originalPath;
      if (op == '') op = globalContextPath + "/PersistentObjectAction.do?id=" + conf.objId;
      else op = globalContextPath + op;
      
      //posledni focus
      if(globalLastFocus!=null) {
       op = op + "&lastFocus="+globalLastFocus;
      }
      
      // cid
      if (globalActionPostfix != null && globalActionPostfix.length > 0)
        op = op.replace(/(^[^?&]+\.do)(\?.*)/, '$1' + globalActionPostfix + '$2');
      
      document.location.href = op;
    }
  } else if (conf.saveImmediatelyComplete) {
    var actions = ['PersistentObjectEditAction', 'MacroAction', 'ChoiceAction'];
    var idx =     [                          -1,            -1,             -1];

    var frms = document.getElementsByTagName('form');
    for (var i = 0; i < frms.length; i++)
      for (var a = 0; a < actions.length; a++)
        if (frms[i].action.indexOf(actions[a] + '.do') > -1) idx[a] = i;
        
    
    for (var a = 0; a < idx.length; a++)
      if (idx[a] > -1) {
        // param + submit
        var inp = document.createElement('INPUT');
        inp.type = 'hidden';
        inp.name = 'refEdSaveImmediatelyCompleteFlag';
        inp.value = '1';

        frms[idx[a]].appendChild(inp);
        
        //info o poslednim focusu
        if(globalLastFocus!=null) {
         inp = document.createElement('INPUT');
         inp.type = 'hidden';
         inp.name = 'lastFocus';
         inp.value = globalLastFocus;   
         frms[idx[a]].appendChild(inp);     
        }
        
        // nesmi byt forward na close
        var fwds = frms[idx[a]].getElementsByTagName('input');
        
        if (fwds != null && fwds.length > 0)
          for (var i = 0; i < fwds.length; i++)
            if (fwds[i].name.toLowerCase() == 'f_pagetype' && fwds[i].value == 'close')
              fwds[i].value = 'singleedit';
              
        frms[idx[a]].submit();
        return;
      }
  } else {	  
	  disableAllLinks(); //pokud neukladame, musime disablovat linky
  }
  
  //volame callback, pokud treba
  if(referenceEditorModifyEvent!= null) {
     var conf = referenceEditorFindConfiguration(name);    
     referenceEditorModifyEvent(conf);    	
  }
}

// single value dotazy s kontrolou vysledku
function referenceEditorSingleValSet(name, searchParameters, warnOnEmptyRes, warnOnEmptyResText) {
  var ret = referenceEditorAddFromSearch(name, searchParameters);
  var cnt = ret.count;
  if (warnOnEmptyRes && cnt == 0) {
    var conf = referenceEditorFindConfiguration(name);
    alert(warnOnEmptyResText == '' ? conf.localTexts['persistent.reference.emptysingleval'] : warnOnEmptyResText);
  }
}

// vyhledavani, searchParameters - parametry pro SearchAction.do
function referenceEditorAddFromSearch(name, searchParameters) {
  var requester = getHTTPObject();
  var rString = globalContextPath + "/SearchActionXML.do" + globalActionPostfix;

  requester.open("POST", rString, false);
  requester.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  requester.send(searchParameters);

  var ret = new Object();
  ret.count = -1;
  ret.textQuery = '';
  
  // test neuspesnosti	
  if(requester.responseXML == null) return ret;
  var errElements = requester.responseXML.getElementsByTagName("errorMessage");

  if(errElements.length > 0) {
    alert(errElements[0].childNodes[0].nodeValue);
    return ret;
  }   
 
  //zjistime skutecne textQuery
  if(requester.responseXML.getElementsByTagName("textQuery").length > 0)
    ret.textQuery = requester.responseXML.getElementsByTagName("textQuery")[0].childNodes[0].nodeValue;
  
  //spocitame, kolik je tam radku (row)
  var x = requester.responseXML.getElementsByTagName("result");
  var count = 0;
  if(x.length > 0) {
     for (i=0;i<x[0].childNodes.length;i++)
       if(x[0].childNodes[i].nodeName == 'row') count++;
  } 
  //konec, pokud to neni prave jeden
  if(count != 1) {
    ret.count = count;
    return ret;
  }
  
  // zjistime id
  var id = requester.responseXML.getElementsByTagName("id")[0].childNodes[0].nodeValue;

  // ulozime do input boxu
  var conf = referenceEditorFindConfiguration(name);
  if(conf == null) {
    alert('Cannot find a reference editor');return ret;
  }
  
  var val = document.getElementById(conf.source).value;
  if(conf.sequence) {
    if(val.length != 0) val = val + ",";
    val = val + id;
  } else val = id;
     
  document.getElementById(conf.source).value = val;	
    
  referenceEditorUpdateAfterChange(name);
  ret.count = 1;
  return ret;
}

function referenceEditorInvoke(method, parameters) {
  var requester = getHTTPObject();
  var paramStr = '';
  for (var i = 0; i < parameters.length; i++) paramStr += '@' + parameters[i];
  
  var rString = globalContextPath + '/RefEditorUniversalActionXML.do' + globalActionPostfix + '?method=' + method + '&parameters=' + paramStr.substring(1);
  requester.open("GET", rString, false);
  requester.send(null);

  if (requester.responseXML.normalize) requester.responseXML.normalize();

  var err = requester.responseXML.getElementsByTagName('errorMessage');
  if (err != null && err.length > 0) {
    alert(err[0].childNodes[0].nodeValue);
    return null;
  }

  return requester.responseXML;
}

function referenceEditorCreateDraft(id,name) {
    referenceEditorInvoke('createDraft',[id]);
    referenceEditorRefreshObject(name,id);
    referenceEditorGenerateHTML(name);
}

function referenceEditorSaveDraft(draftId,id,name) {
    if(window.directUpload) directUpload(draftId);
    referenceEditorInvoke('saveDraftSimple',[draftId]);
    referenceEditorRefreshObject(name,id);
    referenceEditorGenerateHTML(name);
}

function referenceEditorStornoDraft(draftId,id,name,newDraft,pos) {
    if(window.directStorno) directStorno(draftId);
    referenceEditorInvoke('stornoDraft',[draftId]);
    referenceEditorRefreshObject(name,id);
    referenceEditorGenerateHTML(name);
    if(newDraft) referenceEditorRemove(name,pos);
}

//globalni promena vsech konfiguraci vlastnosti
var referenceEditorConfiguration = new Array();

function loadContentDiv(divID, href) {
  var div = document.getElementById(divID);
  if (div == null) return;
  
  var req = getHTTPObject();
  req.open("GET", href, true);
  
  req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) { 
      if (req.responseText != null) {
		div.innerHTML = req.responseText;
		if (typeof _ftMakeDraggable == 'function')
			_ftMakeDraggable(div);
      }
    }
  }
  req.send(null);
}

// stejna funkce jako nahore, akorat se vysledkem naplnuje
// dalsi DIV - IE neni schopne slozitejsi retezce vkladat primo
// -> pouziva se pro dynamicke nacitani vysledku vyhledavani
function loadContentResultDiv(divID, href) {
  var div = document.getElementById(divID);
  if (div == null) return;
  
  var req = getHTTPObject();
  req.open("GET", href, true);
  
  req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) { 
      if (req.responseText != null) {
		  // pro IE musime naplnit dalsi div, jinak chyba na strance
		  var wrappingDiv = document.createElement('div');
		  wrappingDiv.innerHTML = req.responseText;
		  div.appendChild(wrappingDiv);
      }
    }
  }          
  req.send(null);
}

//pokud jsou tam stejna id, tak je odstrani
function removeDuplicity(value) {
  var ids = value.split(",");
  for(var i=0; i<ids.length-1;i++) 
  	for(var j=i+1; j<ids.length;j++)
  	 if(parseInt(ids[i]) == parseInt(ids[j])) {
  	   var ret = "";
  	   var first = true;
  	   for(var k=0; k<ids.length; k++) {
  	     if(k==j) continue;
  	     if(first) first = false; else ret=ret+",";
  	     ret = ret+ids[k];
  	   }  	   
  	   return removeDuplicity(ret);
  	 }
  return value;
}

function sendFormWithoutReload() {
  var frm = document.forms['autoSaveDraftForm'];
  if (frm == null) return false;
  var rString = globalContextPath + '/PersistentObjectEditXML.do' + globalActionPostfix;
  //pripravime parametry z formulare
  var parameters = "";
  for(i=0;i<frm.elements.length;i++){
   if(frm.elements[i] == null || frm.elements[i].name == null || frm.elements[i].name == "" || frm.elements[i].value == null) continue; 
   if(i!=0) parameters = parameters + "&";
   parameters = parameters + frm.elements[i].name + "=" + encodeURIComponent(frm.elements[i].value);
  }
  //posilame formular
  var req = getHTTPObject();
  req.open("POST", rString, false);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", parameters.length);
  req.setRequestHeader("Connection", "close");
  req.send(parameters);  

  // test neuspesnosti	
  if(req.responseXML == null) return false;
  var errElements = req.responseXML.getElementsByTagName("errorMessage");
  if(errElements.length > 0) {
     alert(errElements[0].childNodes[0].nodeValue);
     return false;
  }
  return true;
}

//na zaklade vyrazu zmeni hodnoty a styly na formulari
function expressionUpdate(formId,expression) {
  var frm = document.getElementById(formId);
  if(frm == null) {alert("Invalid form: "+formId);return;}
  expressionUpdateFormId = frm;
  var rString = globalContextPath + '/ExpressionActionXML.do' + globalActionPostfix;
  var parameters = "expression="+encodeURIComponent(expression);
  for(i=0;i<frm.elements.length;i++){
   var el = frm.elements[i];	  	  
   if(el == null || el.name == null || el.name == "" || el.value == null) continue;
   if(el.type == "select-multiple") {
	   for(j=0;j<el.options.length;j++)
		   if(el.options[j].selected && el.options[j].value.length > 0) parameters = parameters + "&" + el.name + "=" + encodeURI(el.options[j].value);
	   continue;
   }
   parameters = parameters + "&" + el.name + "=" + encodeURI(el.value);
  }
  
  //posilame to asynchronne k spocitani
  var req = getHTTPObject();
  req.open("POST", rString, true);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", parameters.length);
  req.setRequestHeader("Connection", "close"); 
  req.onreadystatechange = function expressionUpdateResolve() {
    if (req.readyState == 4 && req.status == 200) { 
      if (req.responseXML != null) {
      //jsou nejake chyby?
      var errElements = req.responseXML.getElementsByTagName('errorMessage');
      if (errElements.length > 0) {
        alert(errElements[0].childNodes[0].nodeValue);
        return;   
      }
	  var frm = expressionUpdateFormId;
      
      //nastavime tedy hodnoty inputu
      var updateValues = req.responseXML.getElementsByTagName('property');
      for(var i=0; i<updateValues.length; i++) {
        var name = updateValues[i].getAttribute('name').toLowerCase();
        var value = updateValues[i].childNodes.length>0?updateValues[i].childNodes[0].nodeValue:"";
        for(j=0;j<frm.elements.length;j++)
         if(frm.elements[j].name.toLowerCase() == name) {frm.elements[j].value = value;break;}        
      }
      //classa inputu
      var updateStyles = req.responseXML.getElementsByTagName('style');
      for(var i=0; i<updateStyles.length; i++) {
        var name = updateStyles[i].getAttribute('name').toLowerCase();
        var value = updateStyles[i].childNodes.length>0?updateStyles[i].childNodes[0].nodeValue:"";
        for(j=0;j<frm.elements.length;j++)
         if(frm.elements[j].name.toLowerCase() == name) {
            if(expressionUpdateOldStyles[name]==null) expressionUpdateOldStyles[name]=frm.elements[j].className;
            frm.elements[j].className = expressionUpdateOldStyles[name] + ' ' + value;
            break;
         }        
      }
      //titulky inputu
      var updateTitles = req.responseXML.getElementsByTagName('title');
      for(var i=0; i<updateTitles.length; i++) {
        var name = updateTitles[i].getAttribute('name').toLowerCase();
        var value = updateTitles[i].childNodes.length>0?updateTitles[i].childNodes[0].nodeValue:"";
        for(j=0;j<frm.elements.length;j++)
         if(frm.elements[j].name.toLowerCase() == name) {
            if(expressionUpdateOldTitles[name]==null) expressionUpdateOldTitles[name]=frm.elements[j].title;
            if(value.length>0) frm.elements[j].title=value; else frm.elements[j].title = expressionUpdateOldTitles[name];
            break;
         }               
      }

      //disabled inputu
      var updateDisables = req.responseXML.getElementsByTagName('disable');
      for(var i=0; i<updateDisables.length; i++) {
        var name = updateDisables[i].getAttribute('name').toLowerCase();
        var value = updateDisables[i].childNodes[0].nodeValue;
        for(j=0;j<frm.elements.length;j++)
         if(frm.elements[j].name.toLowerCase() == name) {
            frm.elements[j].disabled=value=="true"?true:false;
            break;
         }               
      }
      //listove vlastnosti
      var updateLists = req.responseXML.getElementsByTagName('list');
      for(var i=0; i<updateLists.length; i++) {
        var name = updateLists[i].getAttribute('name').toLowerCase();
        var select = null;
        for(j=0;j<frm.elements.length;j++) 
         if(frm.elements[j].name.toLowerCase() == name) {
            select = frm.elements[j];
            break;
         }
        if(select == null) continue;
        if(select.type == "select-multiple" || select.type == "select-one") {
         var selectedOptions = new Array();
         var selectedIndex = 0;
         for(var k=0; k<select.options.length;k++)
           if(select.options[k].selected) selectedOptions[selectedIndex++]=select.options[k].value;
         while(select.options.length > 0) select.remove(0);                 
         
         for(var k=0;k<updateLists[i].childNodes.length;k++) {
           var item = updateLists[i].childNodes[k];
           var option = document.createElement('option');
           if(item.childNodes[0].childNodes.length > 0) option.value = item.childNodes[0].childNodes[0].nodeValue;
           if(item.childNodes[1].childNodes.length > 0) option.text = item.childNodes[1].childNodes[0].nodeValue;
           for(var f=0; f<selectedOptions.length; f++) 
             if(selectedOptions[f] == option.value) {
               option.selected = true;
               break;
             }          
           try {  
           select.add(option,null);
           } catch (ex) {
             select.add(option); //pro IE
           }
         }
        } else 
        	if(updateLists[i].childNodes.length >= 1) {
        		var item = updateLists[i].childNodes[1]; //prvni je prazdne
        		if(item.childNodes[0].childNodes.length > 0) select.value = item.childNodes[0].childNodes[0].nodeValue;      		
        	}        
      }   
      //informacni hlasky
      var scriptMessages = req.responseXML.getElementsByTagName('message');
      for(var i=0; i<scriptMessages.length; i++) {
        alert(scriptMessages[i].childNodes[0].nodeValue);
      }      
      
      //refresh referencniho editoru
      referenceEditorRefreshAllHTML(false);
    }
   }
  }
  req.send(parameters);
}

//na zaklade vyrazu vrati vysledek
function simpleExpressionUpdate(formId,expression,variableName,variableValue) {
  var frm = document.getElementById(formId);
  if(frm == null) {alert("Invalid form: "+formId);return;}
  expressionUpdateFormId = frm;
  var rString = globalContextPath + '/ExpressionActionXML.do' + globalActionPostfix;
  var parameters = "expression="+encodeURIComponent(expression)+"&simple=true&variableName="+variableName+"&variableValue="+variableValue;
  for(i=0;i<frm.elements.length;i++){
   var el = frm.elements[i];	  	  
   if(el == null || el.name == null || el.name == "" || el.value == null) continue;
   if(el.type == "select-multiple") {
	   for(j=0;j<el.options.length;j++)
		   if(el.options[j].selected && el.options[j].value.length > 0) parameters = parameters + "&" + el.name + "=" + encodeURI(el.options[j].value);
	   continue;
   }
   parameters = parameters + "&" + el.name + "=" + encodeURI(el.value);
  }
  
  //posilame to synchronne k spocitani
  var req = getHTTPObject();
  req.open("POST", rString, false);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", parameters.length);
  req.setRequestHeader("Connection", "close"); 
  req.send(parameters);
  
  if(req.responseXML==null) {alert('simpleExpressionUpdate: No value returned');return;}
  //jsou nejake chyby?
  var errElements = req.responseXML.getElementsByTagName('errorMessage');
  if (errElements.length > 0) {
    alert(errElements[0].childNodes[0].nodeValue);
    return;   
  }
  errElements = req.responseXML.getElementsByTagName('result');
  if (errElements.length == 0) {
	    alert('simpleExpressionUpdate: No result');
	    return;   
  }
  return encodeURIComponent(errElements[0].childNodes[0].nodeValue);  
}

//pomocne promenne pro funkci expressionUpdate
var expressionUpdateOldStyles = new Object();
var expressionUpdateOldTitles = new Object();
var expressionUpdateFormId = null;

