
var Kajax = new Class({
  Extends: Request, 
  options: { secure:false },
	initialize: function(aoptions) { 
	  this.parent(aoptions);
    this.jsonResponse = null;
    this.addEvent('onSuccess', this.onComplete, true);
		this.setHeader('X-Request', 'JSON');	
		this.setHeader('Content-Type', 'application/jsonrequest');
		this.setHeader('Content-Encoding', this.options.encoding); 
		this.setHeader('Accept', 'application/jsonrequest, application/json');
	},

	send: function(obj) {
		return this.parent(JSON.encode(obj));
	},
	
	rpc: function(name, aparams, rpid) {
	if (this.options.link='cancel') this.cancel();
    var jsonRPC = { method: name,params: aparams,id: rpid, module: this.options.module };
    this.send(jsonRPC);
  },  

  processHTML: function(text){
		var container = new Element('div');
		
		return $try(function(){
			var root = '<root>' + text + '</root>', doc;
			
			if (Browser.Engine.trident){
				doc = new ActiveXObject('Microsoft.XMLDOM');
				doc.async = false;
				doc.loadXML(root);
			} else {
				doc = new DOMParser().parseFromString(root, 'text/xml');
			}
			root = doc.getElementsByTagName('root')[0];
			for (var i = 0, k = root.childNodes.length; i < k; i++){
				var child = Element.clone(root.childNodes[i], true, true);
				if (child) container.grab(child);
			}
			return container;
		})() || container.set('html', text);
	},

 
  processAS: function(args) {	
    var elems = $$(args[1]);
    for (var i = 0, l = elems.length; i < l; i++) { 
      elems[i].empty();
      elems[i].set('html', args[2]);
    }
  },
  
  processVL: function(args) {
    $each($$(args[1]), function(el) { el.value = args[2]; });
  },
  
  processAP: function(args) {
    $each($$(args[1]), function(el) { el.set('html', el.innerHTML.concat(args[2])); });
  },
  
  processPP: function(args) {
    $each($$(args[1]), function(el) { el.set('html', args[2].concat(el.innerHTML)); });
  },
  
  processAC: function(args) {
    $$(args[1]).addClass(args[2]);
  },
  
  processRC: function(args) {
    $$(args[1]).removeClass(args[2]);
  },
  
  runScript: function(scripts) {
    (window.execScript) ? window.execScript(scripts) : window.setTimeout(scripts, 0);
  },  
  
  processSC: function(args) {
    this.runScript(args[1]); 
  },  
  
  processAL: function(args) {
    alert(args[1]);
  },
  
  processRD: function(args) {
    window.location = args[1];
  },
  
  processHH: function(args) {
    //globalScroller.scrollTowards(args[1]);  
    window.location.hash = args[1];
  },      

  processInstructions: function() {
    if ($defined(this.jsonResponse) && $defined(this.jsonResponse.code))
      if ( ['array', 'object', 'collection'].contains($type(this.jsonResponse.code)) ) {
      	$each(this.jsonResponse.code, function(value){
		      if ($type(value)=='array') {
            switch (value[0]) {
              case 'AS':
                if (value.length > 3)
                  this.processAS.delay(value[3], this, [value]);
                else
                  this.processAS(value);
                     
                break;
                
              case 'VL':
                if (value.length > 3)
                  this.processVL.delay(value[3], this, [value]);
                else
                  this.processVL(value);
                     
                break;

              case 'AP':
                if (value.length > 3)
                  this.processAP.delay(value[3], this, [value]);
                else
                  this.processAP(value);
                     
                break;
                
              case 'PP':
                if (value.length > 3)
                  this.processPP.delay(value[3], this, [value]);
                else
                  this.processPP(value);
                     
                break;   
                
              case 'AC':
                if (value.length > 3)
                  this.processAC.delay(value[3], this, [value]);
                else
                  this.processAC(value);
                     
                break;    
                
              case 'RC':
                if (value.length > 3)
                  this.processRC.delay(value[3], this, [value]);
                else
                  this.processRC(value);
                     
                break;   
                
              case 'SC':
                if (value.length > 2)
                  this.processSC.delay(value[2], this, [value]);
                else
                  this.processSC(value);
                     
                break;  
                                                 
              case 'AL':
                if (value.length > 2)
                  this.processAL.delay(value[2], this, [value]);
                else
                  this.processAL(value);
                     
                break;  

              case 'RD':
                if (value.length > 2)
                  this.processRD.delay(value[2], this, [value]);
                else
                  this.processRD(value);
                     
                break;
                
              case 'HH':
                if (value.length > 2)
                  this.processHH.delay(value[2], this, [value]);
                else
                  this.processHH(value);
                     
                break;  
                      
              
            }
          }
	      }, this); 
      }
  },
  
  processCallIdentification: function() {
    this.latestRPID = null;
    if ($defined(this.jsonResponse))
      if ($defined(this.jsonResponse.id))
        this.latestRPID = this.jsonResponse.id;
  },
  onSuccess: function(){
    this.fireEvent('onSuccess', arguments).callChain();
	},
  
	onComplete: function(){
		this.jsonResponse = null;
		
    this.jsonResponse = JSON.decode(this.response.text, this.options.secure);
		
    var problem = false;
		try {
      this.result = this.jsonResponse.result || null;
		  
		  if ($defined(this.jsonResponse.error)) 
		    throw true;
		  else
		    this.error = null;
		  
		  this.processCallIdentification()
      this.processInstructions();
    }
    catch(e) {
      alert(e);
		  problem = true;
	  } 
	  
	  
    	  
	  if (problem) {
      this.fireEvent('onFailure', [this, problem]);
	  }
	  else                                
	    this.fireEvent('onComplete', [this, problem]);
    
	},
	
	onFailure: function(){      
    this.latestRPID = null;
    this.result = null;
    this.error = null;
	  this.jsonResponse = null;
	  
	  this.fireEvent('onFailure', [this, true]);
	}

});

var tinyMCE = null;
var disableEffects = $empty;
var enableEffects = $empty;
var commonCompleteHandler = $empty;
var global_xindi_elem = null;
var xindi = $empty();
var ResScripts = {};

var changeHash = function(newhash) {
	var tempid, el = $(newhash);
	if (el) { tempid = el.get('id'); el.set('id', 'hashtemporary_id'); }
	window.location.hash = '#' + newhash;
	if (el) { el.set('id', tempid); }
}

String.implement({LToC: function() { return this.replace(',', '.').replace(/[^\d\.]/g, ''); } } );

var submitListFilterForm = function(form, mainid, suffix) {
  if (validateForm(form))
  {
    bform = $(mainid+suffix+"bindingform");
    
    $tfn(xindi,this,[mainid+suffix+"searchform",-24,0,0]);
    $rpc(mainid+":filter", [form.filter.value, serializeForm(bform)], null);   
  }
}

var submitBindingForm = function(form, mainid, suffix) {
  if (validateForm(form))
  {
    $tfn(xindi,this,[mainid+suffix+"bindingform",-24,0,0]);
    $rpc(mainid+":saveBinding", serializeForm(form), null);   
  }
}

var submitParentForm = function(el)
{
	var form = findClosest(el, 'form');	
	if (form)
	{
		form = $(form);
		if (form.onsubmit) form.onsubmit.run(null, form);		
		else form.submit();
	}
	
	return false;
}

var submitParentForm2 = function(el)
{
	var node = el.get('tag').toLowerCase() == 'a' ? el : findClosest(el, 'a');
	if (node.hasClass('isdisabled')) return false;
	
	var form = findClosest(el, 'form');	
	if (form)
	{
		form = $(form);
		if (form.onsubmit) form.onsubmit.run(null, form);		
		else form.submit.run(null, form);
	}
	
	return false;
}


        
function $tfn(fn, bind, args){
	try {
		return fn.apply(bind, $splat(args));
	} catch(e){
		return false;
	}
};

var findClosest = function(beginat, tagname) {
  var ul = beginat;
  
  while ($defined(ul) && ((ul.tagName && ul.tagName.toLowerCase() != tagname) || (!ul.tagName))) 
    ul = ul.parentNode;
      
  if ($defined(ul) && ul.tagName && (ul.tagName.toLowerCase()  == tagname)) 
    return ul;
  else
    return null;
}

var findParentMatch = function(beginat, selector) {
  var ul = $(beginat);
  
  while ($defined(ul) && !ul.match(selector)) 
    ul = $(ul.parentNode);
      
  if ($defined(ul)) 
    return ul;
  else
    return null;
}


var submitForm = function(el) {
  var form = findClosest(el, "form");
  if (form.onsubmit)
    form.onsubmit.apply(form);
  else
    form.submit.apply(form);
    
  return false;
}

var stdSubmitForm = function(form, rpcfnc) {
  form = $(form);
  if (validateForm(form)) {
    $tfn(xindi,this,[form,-20,0,0]);
    $rpc(rpcfnc, serializeForm(form), null);  
  }
}

var unvalSubmitForm = function(form, rpcfnc) {
  form = $(form);
  $tfn(xindi,this,[form,-20,0,0]);
  $rpc(rpcfnc, serializeForm(form), null);  
}


var stdCallProc = function(xpost, rpcfnc, args) {
  $tfn(xindi,this,[$(xpost),-20,0,0]);
  $rpc(rpcfnc, args, null);  
  return false;
}


var carGoTo = function(carplace, pageidx) {
  var cp = $(carplace);
  var wrapper = cp.getElement(".wrapper");
  var pages = cp.getElements(".carpage");
  if (pages.length <= pageidx) return;
  
  var page = pages[pageidx];
  var x = page.offsetLeft;
  //alert(x);
  wrapper.tween("margin-left", -x);
}

var onlyNumbers = function(event) {
  var event = new Event(event);
 
  if (event.key.length > 1 || event.control || event.alt || event.meta)
    return true;
    
  numcheck = /\d/;
  return numcheck.test(event.key);
}

var onlyDateChars = function(event) {
  var event = new Event(event);
 
  if (event.key.length > 1 || event.control || event.alt || event.meta)
    return true;
    
  // numcheck = /[\d\.]/;
  // return numcheck.test(event.key);
  return (event.code <= 31 || (event.code >= 48 && event.code <= 57))
}

var onlyPswChars = function(event) {
  var event = new Event(event);
 
  if (event.key.length > 1 || event.control || event.alt || event.meta)
    return true;
    
  numcheck = /\S/;
  return numcheck.test(event.key);
}

var validateDate = function(mm, dd, yyyy) {
  var dayobj = new Date(yyyy, mm-1, dd);
  
  if ((dayobj.getMonth()+1!=mm)||(dayobj.getDate()!=dd)||(dayobj.getFullYear()!=yyyy)) {
      alert("Invalid Day, Month, or Year range detected. Please correct and submit again.");
      return false;
  }
  
  return true;
}

var openTab = function(me, xinditarget) { 
  var trgt = $(xinditarget).getElement(".content");
  trgt.empty();
  
  $tfn(xindis, this, [trgt, 0, 26, 4]);
  me = $(me);
   
  var ul = findClosest(me, 'ul');
  var li = findClosest(me, 'li');
  
  if ($defined(ul)) {
    var curactive = $(ul).getElement('li.active');
    
    if ($defined(curactive) && (curactive != li))
      curactive.removeClass('active');
  }
  
  if ($defined(li))
    $(li).addClass('active');
}

var xindiFunction = function(evt) {
  if (!$defined(this)) return;
    
  if (['string', 'element'].contains($type(evt)))
    var elem = $(evt);
  else {
    evt = evt || window.event;
    var elem = evt.target || evt.srcElement; 
  }
  
  if ((elem.nodeType) && (elem.nodeType == 3)) 
    elem = $(elem.parentNode);
  
  if (elem) {
    var relx = arguments.length > 1 ? arguments[1] : 16;
    var rely = arguments.length > 2 ? arguments[2] : 0;
    var ori = arguments.length > 3 ? arguments[3] : 0;
    
    var posit = elem.getPosition();
    posit.x += relx;
    posit.y += rely;
    
    this.setStyles({opacity: 0, display: 'block'});
    
    switch (ori) {
      case false:
      case 0: posit.x += elem.offsetWidth; break;
      case 1: posit.x -= this.offsetWidth; break;
      case 2: posit.y += elem.offsetHeight; break;
      case 3: posit.y -= this.offsetHeight; break;
      case 4: posit.x += ( (elem.scrollWidth-this.offsetWidth) / 2); break;
      default:;
    }
    
    this.setStyles({left: posit.x, top: posit.y});
    this.fade('in');
   }

  return true;
}

var augmentForm = function(form, c) {
  form = $(form);
  if (form.retrieve('augmented', false) && !c)
    return;
  
  var blurHandler = function(evt, input) {
     if (input.value == "") {
       input.addClass("editDefault");
       if (input.hasClass('psw')) input.type = "text";
       input.value = input.retrieve('defaultValue');
     }
  }
  
  var writeHandler = function(evt, input) {
    if (input.hasClass("editDefault")) {
      input.removeEvents("keypress");
      focusHandler(evt, input);
    }
  }
  
  var focusHandler = function(evt, input) {
    if (input.value == input.retrieve('defaultValue')) {
      input.value = "";
      if (input.hasClass('psw')) input.type = "password";
      input.removeClass("editDefault");
    }
  }
  
  form.addEvent('reset', 
    function() { 
      var inputs = form.getElements('input[type=text]');
      
      $each(inputs, function(input) {
        input.value = input.retrieve('defaultValue');
      });
    });
    
  $each(form.getElements('input[type=text]'), function(input) {
    if ($defined(input.retrieve('defaultValue')))
      return;
      
    input.store('defaultValue', input.value);
    
    input.addEvent('blur', blurHandler.bindWithEvent(this, input));
    if (Browser.Engine.trident)
      input.addEvent('keypress', writeHandler.bindWithEvent(this, input));
    
    input.addEvent('focus', focusHandler.bindWithEvent(this, input));
    
    
  }, this);
  
  form.store('augmented', true);
  // form.setAttribute("autocomplete", "off");
}

augmentForm.undefaultForm = function(form) {
  var inputs = form.getElements('input[type=text]');
  
  $each(inputs, function(input) {
    if (input.value == input.retrieve('defaultValue')) 
      input.value = "";
  }, this);
}

augmentForm.defaultForm = function(form) {
  var inputs = form.getElements('input[type=text]');
  
  $each(inputs, function(input) {
    if (input.value == "")
      input.value = input.retrieve('defaultValue');
  }, this);
}


var makeTableTrackableClickable = function(id) {
  var mytable = $(id);
  if ($type(mytable) == "element") {
    mytable.addEvent("mouseover", trackTableHightlight);
    mytable.addEvent("mouseout", trackTableHightlight);
    
    $each(mytable.getElements('tr'), function(tr) {
      var tda = tr.getElement('td a');
      if (tda) {
        tr.setStyle('cursor', 'pointer');    
        tr.addEvent('click', tda.onclick);
        tda.getParent().set('html', tda.innerHTML);
      }
    });
  }
}
 
var trackTableHightlight = function(event) {
  event.stop();
  
  var curhltr = $pick(this.currenthighlight, null);
  
  if (curhltr) 
      curhltr.removeClass('highlight');
    
  if (event.type == "mouseover") {
    var tr = $(event.target);
    while (tr && (tr != this) && ((tr.tagName && tr.tagName.toLowerCase() != 'tr') || (!tr.tagName)))
      tr = tr.getParent();
    
    if (tr && tr.tagName && (tr.tagName.toLowerCase() == 'tr')) {
      this.currenthighlight = tr;
          
      tr.addClass('highlight');
    }
    else
      this.currenthighlight = null;
  }
  else
    this.currenthighlight = null;
}
var closeDragWin = function (dw) {
  elem = $(dw);
  if (elem) {    
    elem.visfx = elem.visfx || new Fx.Tween(elem, {property: 'opacity', duration: 400, wait: false});
    elem.visfx.options.onComplete = $empty;
    elem.visfx.start(0)
  }          
}

var showDragWin = function (dw, width, height, pos, evt) {
  elem = $(dw);
  if (elem) {
    
    width = width ? width : 500;
    height = height ? height : 250; 
      
    if (pos==1) {
      var atop = (Window.getScrollTop() + ((Window.getHeight()-height)/2));
      var aleft = ((Window.getWidth()-width)/2);
    } else {
      evt = new Event(evt, Document.getWindow());
      
      var atop = evt.page.y;
      var aleft = evt.page.x;
      if (pos<0) aleft -= width;
      if (pos<=-2) atop -= height;  
    }      
    elem.setStyles( { 'width'  : width, 'height' : height,'top'    : atop,'left'   : aleft,'visibility' : 'visible','display' : 'block','opacity' : '1' }  );
  }
}

var setupDragWins = function () {
  var draggables = $$('div.dragwin');
  
  draggables.each(function(el) {
    var ar = el.getElements('.handle');
    if (ar && ar.length) el.makeDraggable({handle: ar[0]});
    ar=el.getElements('.resize');
    if (ar && ar.length) el.makeResizable({handle: ar[0]});
  });
}

var resizeHandler = function() {
  // vsetky veci co potrebuju menit velkost podla velkosti okna
  
  var o = $('globalOverlay');
  
  if ($defined(o)) {                                       
    var site = $('site');             
    if ($defined(document.body) && $defined(site)) {
      w = Math.max(Window.getScrollWidth(), document.body.scrollWidth, document.body.scrollWidth, site.scrollWidth);
      // h = Math.max(Window.getScrollHeight(), document.body.scrollHeight, site.scrollHeight);
      t = 0;
      l = 0;
    }
    else { 
      w = Window.getScrollWidth();
      // h = Window.getScrollHeight();
      t = Window.getScrollTop();
      l = Window.getScrollLeft(); 
    }
    
    o.setStyles({'top': t, 'left': l, 'width': w, 'height': Window.getScrollHeight()});
  }
}
                             
var globalBlock = function() {
  var o = $('globalOverlay');
  if (o) {
    resizeHandler();
    o.fx = o.fx || new Fx.Tween(o, {property: 'opacity', duration: 300})
    o.setStyle('opacity', '0');
    o.fx.start(0.9);
    
    o.setStyles({'display': 'block'});
  }
}

var globalUnblock = function() {
  var o = $('globalOverlay');
  if (o) {
    o.fx = o.fx || new Fx.Tween(o, {property: 'opacity', duration: 300})
    o.fx.start(0);
    
    (function() { o.setStyle('display', 'none') }).delay(270);
    
  }
}

function visiblePortion(elem) {
  var coords = elem.getCoordinates();
    
  var nd = $(elem.parentNode);
  while (nd && $type(nd)=='element' && nd.getStyle('overflow')!='hidden')
    nd = $(nd.parentNode); 
    
  if (nd && ($type(nd) == 'element')) {
    var pportion = visiblePortion(nd);
    
    coords.left = Math.max(coords.left, pportion.left);
    coords.top = Math.max(coords.top, pportion.top);
    coords.bottom = Math.min(coords.bottom, pportion.bottom);
    coords.right = Math.min(coords.right, pportion.right);
  }
  
  return coords;   
}

function hackSH(el) {
  el = $(el);
  
  if (Browser.Engine.trident4) 
    return el.scrollHeight;
    
  var x=el.offsetHeight; 
  el.style.height='auto'; 

  var sH=el.scrollHeight; 
  el.style.height=x+'px';
  
  return sH;
}

var reenableForms = function(form)
{
  updateForm(form, false);
}

var completeHandler = function(kajax, problem) {
  if ($defined(global_xindi_elem))
    global_xindi_elem.fade('out');
  
  if (disabledForms.length)
  {
    disabledForms.forEach(reenableForms, window);
    disabledForms.clean();
  }
    
  if (problem) 
    alert('Server communication error! [js-cmn-ch]');
  else { 
  }
}     
var disabledForms = new Array();
var updateForm = function(form, disabled) {
  if (!form) return form;
  form = $(form);
  if (!form) return form;
  
  var toclear = updateForm.arguments.length > 2 && updateForm.arguments[2];
  var buttontext = updateForm.arguments.length > 3 && updateForm.arguments[3];
  if (disabled && updateForm.arguments.length > 4 && updateForm.arguments[4])
  {
    disabledForms.include(form.get("id"));
  }
  
  $(form).getElements('input, textarea, select, button').each(function(el) {
	  el = $(el);
    el.prevDisabled = $pick(el.prevDisabled, el.disabled);
	  el.disabled = el.prevDisabled || disabled;
	  
	  var tag = el.get('tag');
	  if (tag =='input') {
	    if (el.type=='submit') {
        el.value = buttontext || (disabled ? 'Please wait...' : 'Submit');
        el.setAttribute("autocomplete", "off");
      }
      else if (toclear && el.type=='text')
        el.value = el.retrieve('defaultValue') || '';
    } 
    else if (toclear && el.get('tag')=='textarea') {
      el.value = '';
    }
    else if (tag == 'button' && el.type=="submit")
    {
      el.setAttribute("autocomplete", "off");
      if (disabled)
        el.store("oldvalue", el.get("html")).set("html", buttontext || 'sending');
      else
        el.set("html", buttontext || el.retrieve("oldvalue", "Submit"));
    }
	});
	
	return form; 
}

var showFor = function(elem, time) {
  elem = $(elem);
  if (elem)
  {
	  elem.setStyles({'opacity': 0, 'display': 'block'});
  elem.fade('in', {duration:300});
	  (function() { elem.fade('out').get('tween').chain(elem.setStyle.pass(['display', 'none'], elem)); }).delay(time);
  }  
}

var serializeForm = function(form) {
  var obj = {};
  if (!form) return false;
  
	$(form).getElements('input, textarea, select').each(function(el){
		var name = el.name;        
    
    if (!name || el.disabled) return;                    
		
		if (name.substr(1,3) != "mce") {
		  var tag = el.tagName.toLowerCase();       
		  
      if ( (!el.disabled) && (tag == 'textarea') && (el.hasClass('wysiwyg')) && $defined(window.tinyMCE) ) {        
        var editor = window.tinyMCE.getInstanceById(el.id);
        
        if ($defined(editor) && ($defined(editor.save))) {
          editor.execCommand('mceCleanup');
          editor.save(obj);
        }
      }
      var value = null;
      
      if (tag == 'select') {  
        value = Element.getSelected(el).map(function(opt) { return opt.value; });
        if (!el.multiple && value && $type(value) == 'array' && value.length > 0)
          value = value[0]; 
      }
      else  
        value = ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
        	  	
  		if (value === null) return;
  		
  		if ((tag == 'input') && (name.substr(name.length-2, 2) == '[]')) {
        if (obj[name])
          obj[name].push(value);
        else
          obj[name] = new Array(value);
      } else {
        obj[name] = value;
      }
    }
	});
	
	return obj; 
}

customOrder = function(objname, ob) {
  $rpc(objname+':orderby', ob, null);
  return false;
}

var focusInput = function(elem) {
  if ($defined(elem))
    try {
      elem.focus();
      elem.select();
    
    } catch (e) {}
}

var rpcx = new Kajax(window.kjxoptions);             
var rpcxc = new Kajax(window.kjxoptions);
rpcxc.options.link = 'cancel'; 

rpcx.addEvent('onComplete', completeHandler);
rpcx.addEvent('onFailure', completeHandler);
rpcxc.addEvent('onComplete', completeHandler);

var $rpc = rpcx.rpc.bind(rpcx);

var $rpcc = rpcxc.rpc.bind(rpcxc);

var DOMReadyHandler = function() { 
  global_xindi_elem = $("xindi");
  global_xindi_elem.set("tween", {duration: 200});

  xindi = xindiFunction.bind(global_xindi_elem);
  
  var site = $('site');
  if ($defined(site)) 
    site.addEvent('resize', resizeHandler);    
}

window.addEvent('domready', DOMReadyHandler);
window.addEvent('resize', resizeHandler);


if (Browser.Engine.presto)
  Native.implement([Window, Document], { 
    getSize: function(){ return {x: window.innerWidth, y: window.innerHeight}; }  
  });


var augmentFormVisual = function(formname) {
  var form = $(formname);
  
  if (form) {
              
    var blurevent = function(event) {
      var el = findClosest(event.target, 'li');
      if (el) $(el).removeClass('active');
    }
    
    var focusevent = function(event) {
      var el = findClosest(event.target, 'li');
      if (el) $(el).addClass('active');
    }
    
    $each(form.getElements('input, textarea, select'), function(el) {
      if (el.retrieve('augmentedVisual')) return; 
      
      el.addEvents({'blur': blurevent, 'focus': focusevent});
      el.store('augmentedVisual', true);
    });
  }
}

var savebtn = function(myuid, btn, back, supressValidate) {
  var form = $(myuid+'form');
  if (supressValidate || validateForm(form)) {
    $tfn(xindi,this,[myuid+'save'+btn,-20]);
    var obj = serializeForm(form);
    var pswfields = form.getElements("input[type=password]");
    if (pswfields.length > 0)
    {
      var key = form.getElement("input.keyfield").value.toLowerCase().trim();
      var origfield = form.getElement("input.origkey");
      
      var origkey = $defined(origfield) ? origfield.value.toLowerCase().trim() : false;
      
      for(var i=0; i<pswfields.length; i++) 
      {
        var pswf = pswfields[i];
        
        if (obj[pswf.name].trim() != "")
        	obj[pswf.name] = hex_hmac_sha1(pswf.hasClass("useorigkey") ? origkey : key, obj[pswf.name]);
        else
        	obj[pswf.name] = "";
      }
    }
    
    $rpc(myuid+':save',[obj, back],null);
  }
  return false;
}

var togglebtn = function(myuid, tab) {
  var form = $(myuid+'form');
  var obj = {};
  
  if (form)
  {
    if (!validateForm(form)) return false;
       
    obj = serializeForm(form);
    var pswfields = form.getElements("input[type=password]");
    if (pswfields.length > 0)
    {
      var key = form.getElement("input.keyfield").value.toLowerCase().trim();
      var origfield = form.getElement("input.origkey");
      
      var origkey = $defined(origfield) ? origfield.value.toLowerCase().trim() : false;
      
      for(var i=0; i<pswfields.length; i++) 
      {
        var pswf = pswfields[i];
        if (obj[pswf.name].trim() != "")
        	obj[pswf.name] = hex_hmac_sha1(pswf.hasClass("useorigkey") ? origkey : key, obj[pswf.name]);
        else
        	obj[pswf.name] = "";
      }
    }  
  }
  
  $tfn(xindi,this,[myuid+'tabs',-20]); 
  $rpc(myuid+':tabToggle',[obj, tab],null);

  return false;
}

function makeScrollbar(content,scrollbar,handle,horizontal,ignoreMouse){
	var steps = (horizontal?(content.getScrollSize().x - content.getSize().x):(content.getScrollSize().y - content.getSize().y))
	if (!steps)
	{
		scrollbar.setStyle('display', 'none');
	}
	else
		scrollbar.setStyle('display', 'block');
		
	var slider = new Slider(scrollbar, handle, {	
		steps: steps,
		mode: (horizontal?'horizontal':'vertical'),
		onChange: function(step){
			// Scrolls the content element in x or y direction.
			var x = (horizontal?step:0);
			var y = (horizontal?0:step);
			content.scrollTo(x,y);
		}
	}).set(0);
	if( !(ignoreMouse) ){
		// Scroll the content element when the mousewheel is used within the 
		// content or the scrollbar element.
		$$(content, scrollbar).addEvent('mousewheel', function(e){	
			e = new Event(e).stop();
			var step = slider.step - e.wheel * 30;	
			slider.set(step);					
		});
	}
	// Stops the handle dragging process when the mouse leaves the document body.
	$(document.body).addEvent('mouseleave',function(){slider.drag.stop()});
}

Element.implement({
  customClone: function(contents, oldsuf, newsuf){
		switch ($type(this)){
			case 'element':
				var attributes = {};
				for (var j = 0, l = this.attributes.length; j < l; j++){
					var attribute = this.attributes[j], key = attribute.nodeName.toLowerCase();
					if (Browser.Engine.trident && (/input/i).test(this.tagName) && (/width|height/).test(key)) continue;
					var value = (key == 'style' && this.style) ? this.style.cssText : attribute.nodeValue;
					if (!$chk(value) || key == 'uid') continue;					
					if (value != 'inherit' && ['string', 'number'].contains($type(value))) 
          {
            if (key == 'id' || key == 'name' || key=='class')
            {
              attributes[key] = value.replace(oldsuf, newsuf);
            }
            else 
              attributes[key] = value;
          }
				}
				var tagname = this.nodeName.toLowerCase();
				var element = new Element(tagname, attributes);
				if (tagname == 'input' && element.hasClass("dateinput"))
				{
				  var oldcal = this.retrieve('calendar-obj');
				  if (oldcal)
				  {
				  
            new vlaDatePicker(element, { filePath: oldcal.filePath , prefillDate: oldcal.prefillDate, format: oldcal.format , separator: oldcal.separator});
          }
        }
				if (contents !== false){
					for (var i = 0, k = this.childNodes.length; i < k; i++){
						var child = Element.customClone(this.childNodes[i], true, oldsuf, newsuf);
						if (child) element.grab(child);
					}
				}
				return element;
			case 'textnode': return document.newTextNode(this.nodeValue);
		}
		return null;
	}

});

var cloneBlockRegroup = function(groups)
{
  var original = groups[0];
  var oldsuf = original.className.substr(original.className.lastIndexOf('--'));
  var newsuf = new String("--").concat($time());
  var clone = original.customClone(true, oldsuf, newsuf);
  clone.inject(groups[groups.length-1], 'after');
  var inputs = clone.getElements("input[type=text]");
  
  for(var i=0;i<inputs.length;i++)
  {
    inputs[i].set('value', '');
  }
}

var toggleCatContents = function(checkbox)
{
  var group = findParentMatch(checkbox, '.group');
  var contents = group.getElement('.catcontents');
  if (checkbox.get('checked'))
  {
    contents.removeClass('catoff');
    group.addClass('caton');
  }
  else {
    contents.addClass('catoff');
    group.removeClass('caton');
  }
}










var generalRemoveTinyMCEeditors = function()
{
  if (!$defined(window.tinyMCE)) return;
  
	try 
	{ 
		var AR = $H(window.tinyMCE.editors); 
		
		$each(AR, function(e) { 
			try 
			{ 
				try 
				{ 
					e.remove();								
				} 
				catch(ex) {}
				
				window.tinyMCE.remove(e);
				
				delete e;
			} catch(ex) {} 
		}); 
	} 
	catch (ex) {}

  delete AR;
		
	for (n in window.tinyMCE.instances) 
  {
     window.tinyMCE.removeInstance(window.tinyMCE.instances[n]);
  }

}

window.kfm_for_tiny_mce = function(field_name, url, type, win){
  try
  {
  window.SetUrl=function(url,width,height,caption){
   win.document.forms[0].elements[field_name].value = url;
   if(caption){
    win.document.forms[0].elements["alt"].value=caption;
    win.document.forms[0].elements["title"].value=caption;
   }
  }
  window.open(window.wmsurl+'kfm/index.php?mode=selector&type='+type,'kfm','modal,width=800,height=600');
  } catch (exc) {}
}

var initTinyMCEFirst = function()
{
  if (!$defined(window.tinyMCE)) return;
  
	window.tinyMCE.init({
		add_unload_trigger: false,mode:"textareas",editor_selector : "wysiwyg",theme : "advanced",theme_advanced_disable: "styleselect",
		plugins : "paste,advlink,searchreplace,layer,xhtmlxtras,style,table",extended_valid_elements: "a[name|href|target|title|onclick|rel|class|rev|*]",
		theme_advanced_buttons1_add: "styleprops,tablecontrols", theme_advanced_buttons3_add : "paste,pastetext,pasteword,selectall,insertlayer,moveforward,movebackward,absolute",table_styles : "Header 1=header1;Header 2=header2;Header 3=header3",
		theme_advanced_buttons2_add: "cite,ins,del,abbr,acronym,attribs",
		table_cell_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Cell=tableCel1",
		table_row_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1",language : "en",
		add_form_submit_trigger : 0,submit_patch : 0,invalid_elements : "applet",fix_list_elements: true,fix_table_elements : true,paste_auto_cleanup_on_paste : true,paste_use_dialog: false,
		file_browser_callback : "kfm_for_tiny_mce",cleanup_on_startup : true, cleanup: true,debug : false,
		table_cell_limit : 150,table_row_limit : 50,table_col_limit : 5,verify_css_classes:false,strict_loading_mode:true,
    hidden_input:false});
}

var internalLoadTinyMCE = function()
{
/*	try
	{
		window.document.body.normalize();
	}
	catch (exc)
	{
	}*/
	if (!$defined(window.tinyMCE)) return;
	
	var elems = $$("textarea.wysiwyg");
	var len = elems.length;
	
	if (len > 0) 
	{	
		try 
		{ 
			var t = window.tinyMCE;
			if (!t.settings) 
      { 
        initTinyMCEFirst();
        internalLoadTinyMCE.delay(500);
      }
			else
			{				
				$each(elems, function(elem) 
				{
					elem = $(elem);
					if (!elem.id)
						elem.id = 'textarea' + $uid(elem);
					
					var exi = t.get(elem.id);					
					if (exi)
					{
						try 
						{ 
							try 
							{ 
								exi.remove();								
							} 
							catch(ex) {}							
							window.tinyMCE.remove(exi);							
							delete exi;
						} catch(ex) {} 
						exi = null;
					}
					
					ed = new tinymce.Editor(elem.id, t.settings);
					ed.render();	
					try { ed.focus(); } catch(exc) {}
                  							
				});
			
			}																
		} 
		catch (exc) 
		{ 
			alert(exc); 
		} 
		
	//	try { window.document.body.normalize(); } catch (exc) {}
  	
  	(function() {
  	//  try { window.document.body.normalize(); } catch (exc) {}
      var editors = $$(".mceEditor");
      $each(editors, function(e) { $(e).setStyle('display', 'none') } );
      
        (function() {
      //  try { window.document.body.normalize(); } catch (exc) {}
        var editors = $$(".mceEditor");
        $each(editors, function(e) { $(e).setStyle('display', 'block') } );
      
      }).delay(150);
    
    }).delay(150);
  	
	}
	
	return len;
}

var generalLoadTinyMCE = function()
{
  if (!$defined(window.tinyMCE)) return;
  
	generalRemoveTinyMCEeditors();
	
	(function() {
		if (!internalLoadTinyMCE())
			internalLoadTinyMCE.delay(200);	  
	}).delay(300);

}

var CommonLogic = {
		CheckBox_BillingSameHandler: function(chb)
		{
			var base = chb.getParent("form");
			var grp = base.getElement('.grp_d');
			var inputs = grp.getElements('input');
			for(var i=0;i<inputs.length;i++)
			{
				var inp = inputs[i];
				if (inp.get('name') == 'clientBillingZIP')
					chb.checked ? inp.removeClass("integer") : inp.addClass("integer");
				else
					chb.checked ? inp.removeClass("notempty") : inp.addClass("notempty");
					
				inp.set('disabled', chb.checked);
			}
			
			chb.checked ? grp.addClass('mh') : grp.removeClass('mh');
		},
		
		SetupClientStates: function(states)
		{			
			var clientState = document.getElement('input[name=clientState]');
			if (clientState)
			{				
				var acl_cs = new Autocompleter.Local(clientState, states, {forceSelect: true, selectMode: "type-ahead"});
			}
		}
		
};



var valstrings = {
  notempty: "Please fill in the required field.", 
  number: "Enter only numbers into the field.",
  integer: "Enter only integer numbers into the field.",
  emailaddr: "Verify the email address format.",
  psw: "Passwords must be 6-30 characters in length.",
  phone: "Phone number format is incorrect"
};

function isRadioChecked(elem, errorfunc, state) {
  var numChecked = 0;
  
  for(var idx=0;idx<elem.length;idx++) {
    el = elem[idx]; 
    if (el.checked)
    {
      if (el.value == "#other#")
      {
      	var inp = el.form.getElement("input[name=" + el.name + "_OTHER]");
      	if (inp)
      	{
      	  if (isNotEmpty(inp, errorfunc))
      	  {
      	  	numChecked++;      	  	
      	  }   
      	  else 
      	  {
      	    if (state)
      	    	state[el.name] = inp;
      	    return false;
      	  }
      	}
      }
      else
        numChecked++;
    }
  }
  
  if (numChecked != 1) {
	if (errorfunc) errorfunc(elem, 'rc', valstrings.notempty);
    
    return false;
  } else {
    return true;
  }
}

// validates that the field value string has one or more characters in it
function isNotEmpty(elem, errorfunc) {
    var str = elem.value;
    var re = /.+/;
    if(!str.match(re)) {
        if (errorfunc) errorfunc(elem, 'ne', valstrings.notempty);
        return false;
    } else {
        return true;
    }
}

// validates that the field value string has one or more characters in it
function isPsw(elem, errorfunc) {
    var str = elem.value;
    var re = /\S+/;
    if(!str.match(re)) {
      if (errorfunc) errorfunc(elem, 'psw', valstrings.notempty);
      return false;
    } 
    
    var len = str.length;
    if (len < 6 || len > 30) {
      if (errorfunc) errorfunc(elem, 'psw', valstrings.psw);
      return false;
    }
    
    return true;
}



function isEmpty(elem) {
    var str = elem.value;
    var re = /.+/;
    return (!str.match(re));
}

   
//validates that the entry is a positive or negative number
function isNumber(elem, errorfunc) {
    var str = elem.value;
    var re = /^\d*[\.,]?\d*$/;
    str = str.toString( );
    if (!str.match(re)) {
        if (errorfunc) errorfunc(elem, 'num', valstrings.number);
        return false;
    }
    return true;
}

function isInteger(elem, errorfunc) {
    var str = elem.value;
    var re = /^\d*$/;
    str = str.toString( );
    if (!str.match(re)) {
        if (errorfunc) errorfunc(elem, 'int', valstrings.integer);
        return false;
    }
    return true;
}

function isTelefon(elem, errorfunc) {
	var str = elem.value;
    var re = /^\d{10}$/;
    str = str.toString( );
    if (!str.match(re)) {
        if (errorfunc) errorfunc(elem, 'phone', valstrings.phone);
        return false;
    }
    return true;
}
   
// validates that the entry is formatted as an email address
function isEMailAddr(elem, errorfunc) {
    var str = elem.value;
    var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
    if (!str.match(re)) {
        if (errorfunc) errorfunc(elem, 'email', valstrings.emailaddr);
        return false;
    } else {
        return true;
    }
}

function validateElem(elem, errorfunc, state) {
  elem = $(elem);
  var typ = elem.getAttribute('datatype');
  if (!typ) {
    if (elem.hasClass("donotval"))
      return true;
        
    var bres = true;
    
     if (bres && elem.hasClass('number'))
      bres = bres && isNotEmpty(elem, errorfunc) && isNumber(elem, errorfunc);
      
    if (bres && elem.hasClass('integer'))
      bres = bres && isNotEmpty(elem, errorfunc) && isInteger(elem, errorfunc);
    
    if (bres && elem.hasClass('numberempty'))
      bres = bres && (isEmpty(elem) || isNumber(elem, errorfunc));
    
    if (bres && elem.hasClass('integerempty'))
      bres = bres && (isEmpty(elem) || isInteger(elem, errorfunc));
      
    if (bres && elem.hasClass('email'))
      bres = bres && isEMailAddr(elem, errorfunc);
         
    if (bres && elem.hasClass('emailempty'))
      bres = bres && (isEmpty(elem) || isEMailAddr(elem, errorfunc)); 

    if (bres && elem.hasClass('psw'))
      bres = bres && isNotEmpty(elem, errorfunc) && isPsw(elem, errorfunc);      
    
    if (bres && elem.hasClass('pswempty'))
      bres = bres && (isEmpty(elem) || isPsw(elem, errorfunc));         
    
    if (bres && elem.hasClass('telefon'))
      bres = bres && isNotEmpty(elem, errorfunc) && isTelefon(elem, errorfunc);
    
    if (bres && elem.hasClass('notempty'))
      bres = bres && isNotEmpty(elem, errorfunc); 
      
    if (bres && elem.hasClass('radionotempty'))
    {      
      if (!state[elem.name])
	  {      
      	state[elem.name] = elem;
        bres = bres && isRadioChecked(elem.form.getElements('input[name='+elem.name+']'), errorfunc, state);
      }
    }
             
    return bres;
  } 
    
  typ = typ.toLowerCase()
  
  if (typ=="number")
    return isNotEmpty(elem, errorfunc) && isNumber(elem, errorfunc);
  else if (typ=="integer")
    return isNotEmpty(elem, errorfunc) && isInteger(elem, errorfunc);
  else if (typ=="email")
    return isEMailAddr(elem, errorfunc);
  else if (typ=="notempty")
    return isNotEmpty(elem, errorfunc);
  else 
    return true;   
}

function validateForm(form, af) {
  var objForm = $(form);
  
  if (af) af.undefaultForm(form);
  
  var formElements = $(objForm).getElements('input, textarea, select');
  var result = true;
  var myAlert = function(el, kind, message)
  {
  	alert(message);
  }
  
  var i = 0;
  while ( result && (i < formElements.length) ) {
    var elem = formElements[i];
  	if (elem.disabled && elem.disabled == true) {
  		i++;
      continue;
  	}
  		
  	state = {};
  		
  		
  	result = result && validateElem(elem, myAlert, state);
  	if (!result) {
  	  if (af) af.defaultForm(form);
  	  if (state[elem.name]) elem = state[elem.name]; 
  	  elem.focus();
  	  elem.select();
  	}
  	
    i++;	 
  }        
  
  return result;
}


var FormPreprocessor = {
	getIcon: function(elem)
	{
		var icon = elem.retrieve('valicon');
		if (!icon) {
			icon = new Element('span', {'class': 'valicon'}).inject(elem, 'after');
			elem.store('valicon', icon);
		}	
		
		return icon;
	},
	
	changeTtle: function(el, kind, title)
	{
		this.set('title', title);
	},
	
	onlineValElem: function(elem, li)
	{
		if (!elem.hasClass("nocheck"))
		{
			var icon = FormPreprocessor.getIcon(elem);
		
			if (validateElem(elem, FormPreprocessor.changeTtle.bind(icon)))
			{
				icon.addClass('valcheck');
				icon.removeClass('valcross');
			}
			else {
				icon.removeClass('valcheck');
				icon.addClass('valcross');
			}
		} 
	},

	Augment: function(formname, onlineValidate) {
	  var form = $(formname);
	  
	  if (form) {
	              
	    var blurevent = function(event) {
	      var el = findClosest(event.target, 'li');
	      if (el) $(el).removeClass('active');
	      if (onlineValidate) FormPreprocessor.onlineValElem(this, el);
	    }
	    
	    var focusevent = function(event) {
	      var el = findClosest(event.target, 'li');
	      if (el) $(el).addClass('active');
	    }
	    
	    $each(form.getElements('input, textarea, select'), function(el) {
	      if (el.retrieve('augmentedVisual')) return; 
	      
	      el.addEvents({'blur': blurevent, 'focus': focusevent});
	      el.store('augmentedVisual', true);
	    });
	  }
}
	


};