function openLink(id) {
  var e = getElement(id) ;
  if (! e) { alert("internal error: no ID " + id) ; return ; }
  if (e.value) { window.open (e.value,"_blank"); }
    else { alert ("vnesi URL") ; e.focus(); }
}

function showHelp(id) {
  var h = getElement("help_" + id) ;
  var i = getElement("image_" + id) ;
  if (h) { 
    if (h.style) { 
      if (h.style.display == "") {
        h.style.display = "none" ; i.src = "/images/question.gif" ;
      } else {
        h.style.display = "" ; i.src = "/images/question_down.gif" ;
      }
      return ;
    }
  }
  alert ("Internal error: Cannot display help") ;
}

function showInHelp(id) {
  var h = getElement("help_"+id) ; if (!h) return ;
  if (h.outTimeout) { clearTimeout(h.outTimeout) ; h.outTimeout = false; }
}

function showOutHelp(id) {
  var h = getElement("help_"+id) ; if (!h) return ;
  if (h.style.display == "") h.timeout = setTimeout("hideHelp('"+id+"');",250) ;
}
 
function hideHelp(id) {
//  alert("hideHelp "+id) ;

  var h = getElement("help_"+id) ;
  var i = getElement("image_" + id) ;
  hideElement("help_"+id) ;
  if (i) i.src = "/images/question.gif" ;
}  
  
function setSelect(id,v) {
  var s = getElement(id) ;
//  alert ("Select "+id+"="+v) ;
  if (s) {
    for (i = 0 ; i < s.length ; i++) {
      if (s.options[i].value == v) { s.selectedIndex = i ; }
    }
  } else {
    alert ("Internal error: Cannot set value for " + id) ;
  }
}

function edit_checkbox(c) {
  var cid = c.id ;
  var cgrp = getElement("group_" + cid) ; if (!cgrp) return ;
  cgrp.style.display = c.checked ? "" : "none" ;
}

function optArea_checkbox(c) {
  var cid = c.id ;
  var cfid = cid.replace(/_o_/,"") ;
  var cf = getElement(cfid) ;
  var ctd = getElement("_ot_" + cfid) ;
  cf.disable = ! c.checked;
  ctd.style.display = c.checked ? "" : "none" ;
}

function goForm() {
  var f = getElement("userEntryForm") ;
  if (! f) f = document.forms[0] ;
  if (! f) { alert("internal error: cannot submit form"); return; }
  if (editNoteID) { alert("Najprej prekini ali zakljuci urejanje teksta"); return; }
  if (checkMaskFields(f)) { 
    f.userSubmit ? f.userSubmit() : f.submit() ; }
}

function getValue(f) {
  if (f.type.search(/select/) >= 0) {
    var si = f.selectedIndex ;
    return si >= 0 ? f.options[f.selectedIndex].value : "" ;
  }
  if (f.type == "checkbox") { return f.checked ? f.value : "" ; }
  return f.value ;
}

function checkFail (f,t) {
  var fn = f.form_name ;
  if (! fn) fn = f.name ;
  
  alert ("Polje '" + fn + "' " + t) ; 
  if (f.focus) f.focus() ;
  return false ;
}

var maxDate = [0,31,28,31,30,31,30,31,31,30,31,30,31] ;
var monName = ["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] ;

function validDate(d,m,y) {
  var dNow = new Date() ;
  if (y < 2000 || y > dNow.getFullYear()) { return "Napacna letnica"; }
  if ((m < 1) || (m > 12)) { return "Napacen mesec"; }
  if (d > 0 && d <= maxDate[m]) { return null; }
  if (m == 2 && d == 29 && y % 4 == 0) { return null; }
  return "Napa&#269;en dan v mesecu" ;
}

function checkDate(d) {
  var dErr ;
  var re = new RegExp("^(\\d+)[.](\\d+)[.](\\d+)$") ;
  var reShort = new RegExp("^(\\d+)[.](\\d+)[.]?$") ;
  var reNoZero = new RegExp("^[0]*(\\d+)$") ;
  var dVal = d.value ;
  var now = new Date() ;
  var zArr

  if (zArr = reShort.exec(dVal)) {
    dVal = zArr[1] + "." + zArr[2] + "." + now.getFullYear() ;
    d.value = dVal ;
  }

  var rArr = re.exec(dVal) ;
  if (rArr == null) return "Napacen zapis datuma" ;
  
  for (var i = 1 ; i <= 3 ; i++) {
    zArr = reNoZero.exec(rArr[i]) ;
    if (zArr != null) { rArr[i] = zArr[1] ; }
  }
  dErr = validDate(rArr[1],rArr[2],rArr[3]) ;
  if (dErr != null) return dErr ;
  return false ;
}

function checkNumber(v) {
  if (v.search(/^[+-]?\d+([.,]\d+)?$/) < 0) return "ni število" ;
  return false ;
}

function checkFieldType(f) {
  var v = getValue(f) ;
  var msg ;
  if (! v) return true ;
  
  switch (f.form_type) {
    case "number" :
      msg = checkNumber(v) ; if (msg) return checkFail(f,msg) ;
      break ;
    case "date" : 
      msg = checkDate(f) ; if (msg) return checkFail(f,msg) ;
      break ;
    default : 
      alert ("Internal error - illegal field type " + f.form_type + " on " +f.name) ; return false ;
  }
  return true ;
}

function checkMaskFields(frm) {
  var i,f ;
  for (i = 0 ; i < frm.length ; i++) {
    f = frm.elements[i] ;
    if (f.form_type) {
      if (! checkFieldType(f)) return false ;
    }
    if (f.form_validation) {
      if (! f.form_validation(f)) return false ;
    }
    if (f.form_check) {
      if (! f.form_check(f)) return false ;
    }
    if (f.form_required) {
      if (! getValue(f)) return checkFail(f,"mora imeti vrednost") ;
    }
  }
  return true ;
}

function formSetName(id,n) {
  var e = getElement(id) ; 
  if (! e) { alert("internal error: cannot set name on " + id); return; }
  if (e) e.form_name = n ;
}

function formSetType(id,n) {
  var e = getElement(id) ; if (e) e.form_type = n ;
}

function formSetRequired(id) {
  var e = getElement(id) ; if (e) e.form_required = true ;
}

function formSetValidation(id,vf) {
  var e = getElement(id) ; if (e) e.form_validation = vf ;
}

// inline note editing functions

var noteID = [] ;
var editNoteID;
var editNoteHTML;
var editTemplateText;
var saveNoteTimeout;
var buttonIdCount;

function registerAltNote(id) {
  noteID[noteID.length] = id ;
}

function disableAllNotes() {
  var abtn,ediv,i ;
  for (i = 0 ; i < noteID.length ; i++) {
    hideElement("add_"+noteID[i]) ; 
    hideElement("chg_"+noteID[i]) ;
  } 
}

function hideButtonTag(t) {
  if (t.ewmHideCount) { t.ewmHideCount++ ; return; }
  if (t.style.display != "none") {
    if (!t.id) { buttonIdCount++ ; t.id = "btn_gen_"+buttonIdCount; }
    hideElement(t) ; t.ewmHideCount = 1;
  }
}

function showButtonTag(t) {
  if (t.ewmHideCount) {
    if ((-- t.ewmHideCount) == 0) showElement(t);
  }
}

function isButton(t) {
  var cn = t.className ; 
  if (!cn) return false ;
  return (cn.indexOf("btn") >= 0 || cn.indexOf("btx") >= 0) && (cn.indexOf("alwaysOn") < 0)
}

function processAllButtons(cbf) {
  var bt ;
  var i ;
  
  bt = getTags("div");
  if (bt && bt.length) {
    for (i = 0 ; i < bt.length ; i++) if (isButton(bt[i])) cbf(bt[i]) ;
  }
  bt = getTags("p");
  if (bt && bt.length) {
    for (i = 0 ; i < bt.length ; i++) if (isButton(bt[i])) cbf(bt[i]) ;
  }
}

function disableAllButtons() { processAllButtons(hideButtonTag); }
function enableAllButtons()  { processAllButtons(showButtonTag); }

function showNoteButton(id) {
  var nv = getCheckElement("note_"+id) ; if (!nv) return ;
  if (nv.value) {
    hideElement("add_"+id) ; showElement("chg_"+id) ;
  } else {
    showElement("add_"+id) ; hideElement("chg_"+id) ;
  }
}

function enableAllNotes() {
  var i ;
  for (i = 0 ; i < noteID.length ; i++) { showNoteButton(noteID[i]); }
}

function addAltNote(id) {
  editAltNote(id) ;
}

function editAltNote(id) {
  var nv = getCheckElement("note_"+id) ; if (!nv) return ;
  var hv = getCheckElement("html_"+id) ; if (!hv) return ;
  var et = getCheckElement("textTemplate") ;
  
  if (!editTemplateText) { 
    if (!et) return ;
    editTemplateText = et.innerHTML ; 
  }
  if (et) et.innerHTML = "";

  disableAllButtons() ;
  editNoteHTML = hv.innerHTML ;
  hv.innerHTML = editTemplateText ;
  
  var ta = getCheckElement("textInputBox") ; 
  ta.value = nv.value ;
  
//  disableAllNotes() ;
  editNoteID = id ;
}

function abortEditNote() {
  if (!editNoteID) return ;
  
  enableAllButtons();
  var hv = getCheckElement("html_"+editNoteID) ; if (!hv) return ;
  hv.innerHTML = editNoteHTML ;
  editNoteID = false ;
  enableAllNotes() ;
}
  
function saveNote() {
  if (saveNoteTimeout) {
    alert ("Wait for the previous operation to complete"); return;
  }
  var id  = editNoteID ; if (!id) return ;
  var sf  = getIframeDocument(getCheckElement("textTransformFrame")) ; if (!sf) return ;
  var ta  = getCheckElement("textInputBox") ; if (!ta) return ;
  if (!sf.postform) { alert("Post form missing in postNote bean") ; return; }
  sf.postform.textNote.value = ta.value ;
  sf.postform.submit() ;
  makeRPCcallback = saveNoteDone;
  saveNoteTimeout = setTimeout("saveNoteFailed()",10000) ;
}

function saveNoteFailed() {
  saveNoteTimeout = false ;
  alert("postNote bean has failed, operation aborted") ;
}

function saveNoteDone() {
  if (saveNoteTimeout) { clearTimeout(saveNoteTimeout); saveNoteTimeout = false ; }

  enableAllButtons();
  var id = editNoteID ; if (!id) return ;
  var sf = getIframeDocument(getCheckElement("textTransformFrame")) ; if (!sf) return ;
  var ta = getCheckElement("textInputBox") ; if (!ta) return ;
  var nv = getCheckElement("note_"+id) ; if (!nv) return ;
  var hv = getCheckElement("html_"+id) ; if (!hv) return ;
  var ct = getElementFromDocument("content",sf) ;
  if (!ct) { alert ("postNote bean did not return any content"); return; }
  
  nv.value = ta.value ;
  hv.innerHTML = ct.innerHTML ;
  editNoteID = false ;
  enableAllNotes() ;
}

function delAltNote(id) {
  var nv = getCheckElement("note_"+id) ; nv.value = "" ;
  var dv = getCheckElement("_def_"+id) ;
  var hv = getCheckElement("html_"+id) ; hv.innerHTML = dv.value ;
  showNoteButton(id) ;
}

// text editing functions

var imageTag = false;
var theSelection = false;

// Check for Browser & Platform for PC & IE specific bits
// More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html

var ccSelection = document.selection && document.selection.createRange && true ;

var textHelp = {
  b : "krepko: [b]text[/b]  (alt+b)",
  i : "lezece: [i]text[/i]  (alt+i)",
  u : "podcrtano: [u]text[/u]  (alt+u)",
  q : "citat: [quote]text[/quote]  (alt+q)",
  c : "prikaz kode: [code]code[/code]  (alt+c)",
  l : "seznam: [list]text[/list] (alt+l)",
  o : "stevilcni seznam: [list=]text[/list]  (alt+o)",
  p : "vstavi sliko: [img]http://image_url[/img]  (alt+p)",
  w : "vstavi URL povezavo: [url]http://url[/url] ali [url=http://url]URL text[/url]  (alt+w)",
  a : "zakljuci oblikovanje",
  s : "barva besedila: [color=red]text[/color]",
  f : "velikost besedila: [size=x-small]small text[/size]" } ;

var textStyleCode = new Array();
var textStyleTags = new Array('[b]','[/b]','[i]','[/i]','[u]','[/u]','[quote]','[/quote]','[code]','[/code]','[list]','[/list]','[list=]','[/list]','[img]','[/img]','[url]','[/url]');

// Shows the help messages in the helpline window
function textShowHelp(help) {
  var hl = getElement("textHelpline") ;
  if (hl) hl.value = textHelp[help] ;
}

// Replacement for arrayname.length property
function getarraysize(thearray) {
	for (i = 0; i < thearray.length; i++) {
		if ((thearray[i] == "undefined") || (thearray[i] == "") || (thearray[i] == null))
			return i;
		}
	return thearray.length;
}

// Replacement for arrayname.push(value) not implemented in IE until version 5.5
// Appends element to the array
function arraypush(thearray,value) {
	thearray[ getarraysize(thearray) ] = value;
}

// Replacement for arrayname.pop() not implemented in IE until version 5.5
// Removes and returns the last element of an array
function arraypop(thearray) {
	thearraysize = getarraysize(thearray);
	retval = thearray[thearraysize - 1];
	delete thearray[thearraysize - 1];
	return retval;
}


function textSmiley(text) {
  var ta = getCheckElement("textInputBox"); if (!ta) return ;
  
  text = ' ' + text + ' ';
  if (ta.createTextRange && ta.caretPos) {
	var caretPos = ta.caretPos;
	caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
	ta.focus();
  } else {
	ta.value  += text;
	ta.focus();
  }
}

function textFontStyle(sopen, sclose) {
  var ta = getCheckElement("textInputBox"); if (!ta) return ;

  if (ccSelection) {
	theSelection = document.selection.createRange().text;
	if (!theSelection) {
      ta.value += sopen + sclose;
	  ta.focus();
	  return;
	}
	document.selection.createRange().text = sopen + theSelection + sclose;
	ta.focus();
	return;
  } else {
	ta.value += sopen + sclose;
	ta.focus();
	return;
  }
}

function textPushButton(bn,doPush) {
  var tb = getElement("tb_"+bn) ; if (!tb) return ;
  if (tb.style) {
    tb.style.borderStyle = doPush ? "inset":"" ;
    tb.style.borderWidth = doPush ? "3px" :"";
  }
}

function textStyle(snumber) {
  var ta = getCheckElement("textInputBox"); if (!ta) return ;

  donotinsert = false;
  theSelection = false;
  slast = 0;

  if (snumber == -1) { // Close all open tags & default button names
	while (textStyleCode[0]) {
	  butnumber = arraypop(textStyleCode) - 1;
	  ta.value += textStyleTags[butnumber + 1];
	  textPushButton(butnumber,false) ;
	}
	imageTag = false; // All tags are closed including image tags :D
	ta.focus();
	return;
  }

  if (ccSelection) theSelection = document.selection.createRange().text; // Get text selection

  if (theSelection) {
	document.selection.createRange().text = textStyleTags[snumber] + theSelection + textStyleTags[snumber+1];
	ta.focus();
	theSelection = '';
	return;
  }

// Find last occurance of an open tag the same as the one just clicked
  for (i = 0; i < textStyleCode.length; i++) {
	if (textStyleCode[i] == snumber+1) {
	  slast = i;
	  donotinsert = true;
	}
  }

  if (donotinsert) {		// Close all open tags up to the one just clicked & default button names
	while (textStyleCode[slast]) {
	  butnumber = arraypop(textStyleCode) - 1;
	  ta.value += textStyleTags[butnumber + 1];
	  textPushButton(butnumber,false) ;
      imageTag = false;
	}
	ta.focus();
	return;
  } else { // Open tags

	if (imageTag && (snumber != 14)) {		// Close image tag before adding another
 	  ta.value += textStyleTags[15];
	  lastValue = arraypop(textStyleCode) - 1;	// Remove the close image tag from the list
	  textPushButton(14,false) ;
	  imageTag = false;
	}

	ta.value += textStyleTags[snumber];
	if ((snumber == 14) && (imageTag == false)) imageTag = 1; // Check to stop additional tags after an unclosed image tag
	arraypush(textStyleCode,snumber+1);
	textPushButton(snumber,true) ;
	ta.focus();
	return;
  }
  storeCaret(document.post.message);
}

// Insert at Claret position. Code from
// http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
function storeCaret(textEl) {
	if (textEl.createTextRange) textEl.caretPos = document.selection.createRange().duplicate();
}

function goBack() {
  if (window.ewmReferer) { 
//    alert("ewmReferer=" + ewmReferer);
    location.href = window.ewmReferer; 
  } else { history.back(); }
}

function registerOnloadHandler(h) {
  var olf = window.onload ;
  window.onload = function () {
    if (typeof(h) == 'string') { eval(h); } else { h(); }
    if (olf) olf(); 
  }
}

//
// Link editing functions
//
function showLinkAuthor(id) {
  var sfx  = "_author_row" ;
  var lfld = getCheckElement(id);
  if (lfld.value) { showElement(id+sfx); }
    else { hideElement(id+sfx); }
}

// Keyboard shortcuts
//
var EWM = new Object();

EWM.getBody = function() {
  return document.body ? document.body : xGetElementById("body");
}

EWM.registerSpecialCode = function(spcCode,xString) {
  EWM.addKeyCode(spcCode,false,false,xString);
}

EWM.registerCtrlKey = function(key,xString) {
  if (typeof(key) != "string") throw "registerCtrlKey expects string as first arg";
  EWM.addKeyCode(key.toUpperCase().charCodeAt(0),true,false,xString);
//  alert("EWM.RCK="+key);
}

EWM.registerAltKey = function(key,xString) {
  if (typeof(key) != "string") throw "registerCtrlKey expects string as first arg";
  EWM.addKeyCode(key.toUpperCase().charCodeAt(0),false,true,xString);
}

EWM.addKeyCode = function(keyCode,ctrl,alt,xString) {
  if (! EWM.keyCodeLookup) {
    EWM.registerKeyHandler(); EWM.keyCodeLookup = [];
  }
  EWM.keyCodeLookup[EWM.keyCodeLookup.length] = { code: keyCode, ctrl: ctrl, alt: alt, xString: xString } ;
}

EWM.registerKeyHandler = function() {
  if (! EWM.loadDone) return;
  if (EWM.keyHandlerRegistered) return;
//  xAddEventListener(EWM.getBody(),"keydown",function(e) { return(EWM.keyHandler(e)); } );
  xAddEventListener(document,"keydown",function(e) { return(EWM.keyHandler(e)); } );
//  document.onkeydown = function(e) { return(EWM.keyHandler(e)); }
  EWM.keyHandlerRegistered = true;
}

EWM.keyHandler = function(e) {
  var evt = new xEvent(e); 
  if (!EWM.keyCodeLookup) return;
  for (var i = 0; i < EWM.keyCodeLookup.length; i++) {
    var c = EWM.keyCodeLookup[i];
    if (c.code == evt.keyCode && c.ctrl == evt.ctrlKey && c.alt == evt.altKey) {
      if (typeof(c.xString) == "string") {
        var xeval;
        if (c.xString.indexOf("javascript:") == 0) { xeval = c.xString.replace("javascript:",""); }
          else { xeval = "location = '" + c.xString + "'"; }
        setTimeout(xeval,1);
      } else {
        setTimeout(c.xString,1);
      }
      if (e && e.preventDefault) e.preventDefault();
      if (e && e.stopPropagation) e.stopPropagation();
      return false;
    }
  }
}

EWM.focusFirstElement = function() {
  alert("focus first "+document+" "+document.forms.length+"/"+document.links.length);
  for (var i = 0; i < document.forms.length; i++) {
    alert("forms: "+document.forms[i].name);
    for (var j = 0; j < documents.forms[i].elements.length; j++) {
      try { document.forms[i].elements[j].focus(); return; } catch(e) {}
    }
  }
  for (var i = 0; i < document.links.length; i++) {
    alert("anchor: "+document.links[i].href);
    try { document.links[i].focus(); return; } catch(e) {}
  }
  var otherLinks = xGetElementsByTagName("A");
  for (var i = 0; i < otherLinks.length; i++) {
    alert("anchor: "+otherLinks[i].href);
    try { otherLinks[i].focus(); return; } catch(e) {}
  }
}

EWM.documentLoaded = function() {
  EWM.loadDone = true;
  if (EWM.keyCodeLookup) {
    EWM.registerKeyHandler();
//    EWM.focusFirstElement();
  }
}
  
try { xAddEventListener(window,"load",function () { setTimeout(EWM.documentLoaded,100); }) } catch(e) {}
