function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}
function isFunction(a) {
    return typeof a == 'function';
}

function isNull(a) {
    return typeof a == 'object' && !a;
}

function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}

function isString(a) {
    return typeof a == 'string';
}

function isUndefined(a) {
    return typeof a == 'undefined';
} 
function clearEditor(editorID) {
	 $(editorID).setCode('');
}

function updateEditor(domId) {
	$(domId).updateHTML();
}
function editorToInput(editorId,inputId) {
	$(editorId).updateHTML();
	$(inputId).value = $(editorId).getCode();
}

function remoteLoading(msg) {
   $('ajax_response').innerHTML = '<span id="flash_message">' + msg +'</span>';
}
function getListId() { 
  if (ston_form_action.indexOf('show') != -1 || ston_form_action.indexOf('new') != -1 || ston_form_action.indexOf('create') != -1) {
	  return '/';
  } 
  if(!document.getElementsByClassName('ElementClicked')[0]) return 0;
  var activeID = GrabIDFromString(document.getElementsByClassName('ElementClicked')[0].id);
  var ret =  '/' + activeID;
  return ret;
}
function updateAction(action) {
	ston_form_action = action;
}
var ston_form_action = 'show';

function start_calendars() {
	try {
	  if ($('f-calendar-field-1')) {
	    Calendar.setup({"ifFormat":"%Y-%m-%d","daFormat":"%Y/%m/%d","firstDay":1,"showsTime":true,"showOthers":true,"timeFormat":12,"inputField":"f-calendar-field-1","button":"f-calendar-trigger-1"});
	  }
	  if ($('f-calendar-field-2')) {
	    Calendar.setup({"ifFormat":"%Y-%m-%d","daFormat":"%Y/%m/%d","firstDay":1,"showsTime":true,"showOthers":true,"timeFormat":12,"inputField":"f-calendar-field-2","button":"f-calendar-trigger-2"});
	  }
	} catch(e) {}
}
 
function set_parent_id(id) {
  var activeID = getHighighlightedNode('ElementClicked');
  $(id).value = activeID;
}

function deactivate_page() {
   //document.body.className = 'transparent';
   if (document.all) {
	  var width = document.body.offsetWidth/2 - 70;
	  var height = document.body.offsetHeight/2 - 50;   
   }  else {
	  var width = window.innerWidth/2 - 70;
	  var height = window.innerHeight/2 - 50;
   }
   $('ajax_notifier').style.top = height + 'px';
   $('ajax_notifier').style.left = width + 'px';
   $('ajax_notifier').innerHTML = 'Loading...';
   //new Effect.Appear('ajax_notifier');
   Element.show('ajax_notifier');
}
function activate_page() {
	  Element.hide('ajax_notifier');
	  // document.body.className = 'opague';/
	  //new Effect.Fade('ajax_notifier');
	   //Element.hide('ajax_notifier');

}

var Effect = {
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[Element.visible(element) ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {}

Effect.Transitions.linear = function(pos) {
  return pos;
}
Effect.Transitions.sinoidal = function(pos) {
  return (-Math.cos(pos*Math.PI)/2) + 0.5;
}
Effect.Transitions.reverse  = function(pos) {
  return 1-pos;
}
Effect.Transitions.flicker = function(pos) {
  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
Effect.Transitions.wobble = function(pos) {
  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
Effect.Transitions.pulse = function(pos) {
  return (Math.floor(pos*10) % 2 == 0 ? 
    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
}
Effect.Transitions.none = function(pos) {
  return 0;
}
Effect.Transitions.full = function(pos) {
  return 1;
}

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval) 
      this.interval = setInterval(this.loop.bind(this), 40);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();

    this.effects.invoke('loop', timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn + (this.options.duration*1000);
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
      Element.setStyle(this.element, {zoom: 1});
    var options = Object.extend({
      from: Element.getOpacity(this.element) || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    Element.setOpacity(this.element, position);
  }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    Element.makePositioned(this.element);
    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
    this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    Element.setStyle(this.element, {
      left: this.options.x  * position + this.originalLeft + 'px',
      top:  this.options.y  * position + this.originalTop  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  initialize: function(element, percent) {
    this.element = $(element)
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || {});
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = Element.getStyle(this.element,'position');
    
    this.originalStyle = {};
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));
      
    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;
    
    var fontSize = Element.getStyle(this.element,'font-size') || '100%';
    ['em','px','%'].each( function(fontSizeType) {
      if(fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));
    
    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
    
    this.dims = null;
    if(this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if(/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if(!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if(this.options.scaleContent && this.fontSize)
      Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = {};
    if(this.options.scaleX) d.width = width + 'px';
    if(this.options.scaleY) d.height = height + 'px';
    if(this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if(this.elementPositioning == 'absolute') {
        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if(this.options.scaleY) d.top = -topd + 'px';
        if(this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    Element.setStyle(this.element, d);
  }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {
      backgroundImage: Element.getStyle(this.element, 'background-image') };
    Element.setStyle(this.element, {backgroundImage: 'none'});
    if(!this.options.endcolor)
      this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = Element.getStyle(this.element, 'background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    Element.setStyle(this.element, Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  var oldOpacity = Element.getInlineOpacity(element);
  var options = Object.extend({
  from: Element.getOpacity(element) || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { with(Element) { 
    if(effect.options.to!=0) return;
    hide(effect.element);
    setStyle(effect.element, {opacity: oldOpacity}); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  var options = Object.extend({
  from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
  to:   1.0,
  beforeSetup: function(effect) { with(Element) {
    setOpacity(effect.element, effect.options.from);
    show(effect.element); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200, 
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
     Object.extend({ duration: 1.0, 
      beforeSetupInternal: function(effect) { with(Element) {
        setStyle(effect.effects[0].element, {position: 'absolute'}); }},
      afterFinishInternal: function(effect) { with(Element) {
         hide(effect.effects[0].element);
         setStyle(effect.effects[0].element, oldStyle); }}
     }, arguments[1] || {})
   );
}

Effect.BlindUp = function(element) {
  element = $(element);
  Element.makeClipping(element);
  return new Effect.Scale(element, 0, 
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) { with(Element) {
        [hide, undoClipping].call(effect.element); }} 
    }, arguments[1] || {})
  );
}

Effect.BlindDown = function(element) {
  element = $(element);
  var oldHeight = Element.getStyle(element, 'height');
  var elementDimensions = Element.getDimensions(element);
  return new Effect.Scale(element, 100, 
    Object.extend({ scaleContent: false, 
      scaleX: false,
      scaleFrom: 0,
      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
      restoreAfterFinish: true,
      afterSetup: function(effect) { with(Element) {
        makeClipping(effect.element);
        setStyle(effect.element, {height: '0px'});
        show(effect.element); 
      }},  
      afterFinishInternal: function(effect) { with(Element) {
        undoClipping(effect.element);
        setStyle(effect.element, {height: oldHeight});
      }}
    }, arguments[1] || {})
  );
}

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = Element.getInlineOpacity(element);
  return new Effect.Appear(element, { 
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, { 
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) { with(Element) {
          [makePositioned,makeClipping].call(effect.element);
        }},
        afterFinishInternal: function(effect) { with(Element) {
          [hide,undoClipping,undoPositioned].call(effect.element);
          setStyle(effect.element, {opacity: oldOpacity});
        }}
      })
    }
  });
}

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: Element.getStyle(element, 'top'),
    left: Element.getStyle(element, 'left'),
    opacity: Element.getInlineOpacity(element) };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) { with(Element) {
          makePositioned(effect.effects[0].element); }},
        afterFinishInternal: function(effect) { with(Element) {
          [hide, undoPositioned].call(effect.effects[0].element);
          setStyle(effect.effects[0].element, oldStyle); }} 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $(element);
  var oldStyle = {
    top: Element.getStyle(element, 'top'),
    left: Element.getStyle(element, 'left') };
	  return new Effect.Move(element, 
	    { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
	  new Effect.Move(effect.element,
	    { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
	  new Effect.Move(effect.element,
	    { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
	  new Effect.Move(effect.element,
	    { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
	  new Effect.Move(effect.element,
	    { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
	  new Effect.Move(effect.element,
	    { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) {
        undoPositioned(effect.element);
        setStyle(effect.element, oldStyle);
  }}}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
  element = $(element);
  Element.cleanWhitespace(element);
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
  var elementDimensions = Element.getDimensions(element);
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) { with(Element) {
      makePositioned(effect.element);
      makePositioned(effect.element.firstChild);
      if(window.opera) setStyle(effect.element, {top: ''});
      makeClipping(effect.element);
      setStyle(effect.element, {height: '0px'});
      show(element); }},
    afterUpdateInternal: function(effect) { with(Element) {
      setStyle(effect.element.firstChild, {bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
    afterFinishInternal: function(effect) { with(Element) {
      undoClipping(effect.element); 
      // IE will crash if child is undoPositioned first
      if(/MSIE/.test(navigator.userAgent)){
        undoPositioned(effect.element);
        undoPositioned(effect.element.firstChild);
      }else{
        undoPositioned(effect.element.firstChild);
        undoPositioned(effect.element);
      }
      setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
    }, arguments[1] || {})
  );
}
  
Effect.SlideUp = function(element) {
  element = $(element);
  Element.cleanWhitespace(element);
  var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
  return new Effect.Scale(element, 0, 
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) { with(Element) {
      makePositioned(effect.element);
      makePositioned(effect.element.firstChild);
      if(window.opera) setStyle(effect.element, {top: ''});
      makeClipping(effect.element);
      show(element); }},  
    afterUpdateInternal: function(effect) { with(Element) {
      setStyle(effect.element.firstChild, {bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
    afterFinishInternal: function(effect) { with(Element) {
        [hide, undoClipping].call(effect.element); 
        undoPositioned(effect.element.firstChild);
        undoPositioned(effect.element);
        setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
   }, arguments[1] || {})
  );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, 
    { restoreAfterFinish: true,
      beforeSetup: function(effect) { with(Element) {
        makeClipping(effect.element); }},  
      afterFinishInternal: function(effect) { with(Element) {
        hide(effect.element); 
        undoClipping(effect.element); }}
  });
}

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: Element.getInlineOpacity(element) };

  var dims = Element.getDimensions(element);    
  var initialMoveX, initialMoveY;
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0; 
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }
  
  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01, 
    beforeSetup: function(effect) { with(Element) {
      hide(effect.element);
      makeClipping(effect.element);
      makePositioned(effect.element);
    }},
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) { with(Element) {
               setStyle(effect.effects[0].element, {height: '0px'});
               show(effect.effects[0].element); }},
             afterFinishInternal: function(effect) { with(Element) {
               [undoClipping, undoPositioned].call(effect.effects[0].element); 
               setStyle(effect.effects[0].element, oldStyle); }}
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: Element.getInlineOpacity(element) };

  var dims = Element.getDimensions(element);
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':  
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }
  
  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({            
         beforeStartInternal: function(effect) { with(Element) {
           [makePositioned, makeClipping].call(effect.effects[0].element) }},
         afterFinishInternal: function(effect) { with(Element) {
           [hide, undoClipping, undoPositioned].call(effect.effects[0].element);
           setStyle(effect.effects[0].element, oldStyle); }}
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || {};
  var oldOpacity = Element.getInlineOpacity(element);
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
  reverser.bind(transition);
  return new Effect.Opacity(element, 
    Object.extend(Object.extend({  duration: 3.0, from: 0,
      afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); }
    }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  Element.makeClipping(element);
  return new Effect.Scale(element, 5, Object.extend({   
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, { 
      scaleContent: false, 
      scaleY: false,
      afterFinishInternal: function(effect) { with(Element) {
        [hide, undoClipping].call(effect.element); 
        setStyle(effect.element, oldStyle);
      }} });
  }}, arguments[1] || {}));
}



//Control.js
var Autocompleter = {}
Autocompleter.Base = function() {};
Autocompleter.Base.prototype = {
  base_initialize: function(element, update, options) {
    this.element     = $(element); 
    this.update      = $(update);  
    this.has_focus   = false; 
    this.changed     = false; 
    this.active      = false; 
    this.index       = 0;     
    this.entry_count = 0;

    if (this.setOptions)
      this.setOptions(options);
    else
      this.options = options || {};
     
    this.options.tokens       = this.options.tokens || new Array();
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.min_chars    = this.options.min_chars || 1;
    this.options.onShow       = this.options.onShow || 
    function(element, update){ 
      if(!update.style.position || update.style.position=='absolute') {
        update.style.position = 'absolute';
          var offsets = Position.cumulativeOffset(element);
          update.style.left = offsets[0] + 'px';
          update.style.top  = (offsets[1] + element.offsetHeight) + 'px';
          update.style.width = element.offsetWidth + 'px';
      }
      new Effect.Appear(update,{duration:0.15});
    };
    this.options.onHide = this.options.onHide || 
    function(element, update){ new Effect.Fade(update,{duration:0.15}) };
    
    if(this.options.indicator)
      this.indicator = $(this.options.indicator);

    if (typeof(this.options.tokens) == 'string') 
      this.options.tokens = new Array(this.options.tokens);
       
    this.observer = null;
    
    Element.hide(this.update);
    
    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(this.update.style.display=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && this.update.style.position=='absolute') {
      new Insertion.After(this.update, 
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) {
      Position.clone(this.update, this.iefix);
      this.iefix.style.zIndex = 1;
      this.update.style.zIndex = 2;
      Element.show(this.iefix);
    }
  },
  
  hide: function() {
    if(this.update.style.display=='') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },
  
  startIndicator: function() {
    if(this.indicator) Element.show(this.indicator);
  },
  
  stopIndicator: function() {
    if(this.indicator) Element.hide(this.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.select_entry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.mark_previous();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.mark_next();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
      }
     else 
      if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN) 
        return;
    
    this.changed = true;
    this.has_focus = true;
    
    if(this.observer) clearTimeout(this.observer);
      this.observer = 
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },
  
  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex) 
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },
  
  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.select_entry();
    Event.stop(event);
  },
  
  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.has_focus = false;
    this.active = false;     
  }, 
  
  render: function() {
    if(this.entry_count > 0) {
      for (var i = 0; i < this.entry_count; i++)
        this.index==i ? 
          Element.addClassName(this.get_entry(i),"selected") : 
          Element.removeClassName(this.get_entry(i),"selected");
        
      if(this.has_focus) { 
        if(this.get_current_entry().scrollIntoView) 
          this.get_current_entry().scrollIntoView(false);
        
        this.show();
        this.active = true;
      }
    } else this.hide();
  },
  
  mark_previous: function() {
    if(this.index > 0) this.index--
      else this.index = this.entry_count-1;
  },
  
  mark_next: function() {
    if(this.index < this.entry_count-1) this.index++
      else this.index = 0;
  },
  
  get_entry: function(index) {
    return this.update.firstChild.childNodes[index];
  },
  
  get_current_entry: function() {
    return this.get_entry(this.index);
  },
  
  select_entry: function() {
    this.active = false;
    value = Element.collectTextNodesIgnoreClass(this.get_current_entry(), 'informal').unescapeHTML();
    this.updateElement(value);
    this.element.focus();
  },

  updateElement: function(value) {
    var last_token_pos = this.findLastToken();
    if (last_token_pos != -1) {
      var new_value = this.element.value.substr(0, last_token_pos + 1);
      var whitespace = this.element.value.substr(last_token_pos + 1).match(/^\s+/);
      if (whitespace)
        new_value += whitespace[0];
      this.element.value = new_value + value;
    } else {
      this.element.value = value;
    } 
  },
  
  updateChoices: function(choices) {
    if(!this.changed && this.has_focus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.firstChild);

      if(this.update.firstChild && this.update.firstChild.childNodes) {
        this.entry_count = 
          this.update.firstChild.childNodes.length;
        for (var i = 0; i < this.entry_count; i++) {
          entry = this.get_entry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else { 
        this.entry_count = 0;
      }
      
      this.stopIndicator();
      
      this.index = 0;
      this.render();
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;   
    if(this.getEntry().length>=this.options.min_chars) {
      this.startIndicator();
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
  },

  getEntry: function() {
    var token_pos = this.findLastToken();
    if (token_pos != -1)
      var ret = this.element.value.substr(token_pos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
    else
      var ret = this.element.value;
    
    return /\n/.test(ret) ? '' : ret;
  },

  findLastToken: function() {
    var last_token_pos = -1;

    for (var i=0; i<this.options.tokens.length; i++) {
      var this_token_pos = this.element.value.lastIndexOf(this.options.tokens[i]);
      if (this_token_pos > last_token_pos)
        last_token_pos = this_token_pos;
    }
    return last_token_pos;
  }
}

Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
  initialize: function(element, update, url, options) {
	  this.base_initialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this)
    this.options.method        = 'post';
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },
  
  getUpdatedChoices: function() {
    entry = encodeURIComponent(this.element.name) + '=' + 
      encodeURIComponent(this.getEntry());
      
    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;
        
    if(this.options.defaultParams) 
      this.options.parameters += '&' + this.options.defaultParams;
    
    new Ajax.Request(this.url, this.options);
  },
  
  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }

});

Autocompleter.Local = Class.create();
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
  initialize: function(element, update, array, options) {
    this.base_initialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partial_search: true,
      partial_chars: 2,
      ignore_case: true,
      full_search: false,
      selector: function(instance) {
        var ret       = new Array(); // Beginning matches
        var partial   = new Array(); // Inside matches
        var entry     = instance.getEntry();
        var count     = 0;
        
        for (var i = 0; i < instance.options.array.length &&  
            ret.length < instance.options.choices ; i++) { 
          var elem = instance.options.array[i];
          var found_pos = instance.options.ignore_case ? 
            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
            elem.indexOf(entry);

          while (found_pos != -1) {
            if (found_pos == 0 && elem.length != entry.length) { 
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partial_chars && 
              instance.options.partial_search && found_pos != -1) {
              if (instance.options.full_search || /\s/.test(elem.substr(found_pos-1,1))) {
                partial.push("<li>" + elem.substr(0, found_pos) + "<strong>" +
                  elem.substr(found_pos, entry.length) + "</strong>" + elem.substr(
                  found_pos + entry.length) + "</li>");
                break;
              }
            }

            found_pos = instance.options.ignore_case ? 
              elem.toLowerCase().indexOf(entry.toLowerCase(), found_pos + 1) : 
              elem.indexOf(entry, found_pos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || {});
  }
});


function blurLastByClassName(findC,replaceC) {
     var anchors = document.getElementsByTagName('a');
	 for(i=0;i<anchors.length;i++) { 
	   if (anchors[i].className == findC) {
	     anchors[i].className = replaceC;
	   }
	 }
  }
   var dataGridHighlightedRow = '';
   
   function clearFocusFile(findC,replaceC) {
	   dataGridHighlightedRow = '';
	   blurLastByClassName(findC,replaceC);
   }
   
   function focusListObject(obj,classN) {
      dataGridHighlightedRow = obj.id;
      obj.className = classN;
   }
   
   function sendHiddenDown(divId) {
  var IdValue = GrabIDFromString(dataGridHighlightedRow);
  var InputArr = $(divId).getElementsByTagName('input');
  for(i=0;i<InputArr.length;i++) {
	 if (InputArr[i].value == IdValue) {
	   return false;
	 }
  }
  var NameValue = $(dataGridHighlightedRow).getElementsByTagName('input')[0].value;
  var InsertHtml = '<div class="unSelected" style="curson:pointer; white-space:nowrap;" onmouseover="this.className = this.className == \'selected\' ? \'selected\' : \'mouseOver\';" onclick="this.className = this.className == \'selected\' ? \'unSelected\' : \'selected\';" onmouseout="this.className = this.className == \'selected\' ? \'selected\' : \'unSelected\';"';
  InsertHtml += '<input type="hidden" name="article_related[]" value="'+IdValue+'"/><a href="#">'+NameValue+'</a></div>';
  new Insertion.Bottom(divId,InsertHtml);
}

function sendHiddenUp(divId) {
  var RemoveArr = document.getElementsByClassName('selected');
  for(i=0;i<RemoveArr.length;i++){
	 if (divId == RemoveArr[i].parentNode.id) {
	   Element.remove(RemoveArr[i]);  
	 }
  }
}

function array_search(ary,val) {
  for(k=0;k<ary.length;k++) {
	if (ary[k] == val) return true;  
  }
  return false;
}

function sendHiddenDown1(divId,destDivId,hiddenName,sendAll) {
  if (sendAll != null) {
	  trAry = $(divId).getElementsByTagName('tr');
	  idAry = new Array();
	  idAryId = new Array();
	  for(i=0;i<trAry.length;i++) {
		if (!isNaN(parseInt(GrabIDFromString(trAry[i].id)))) {
	   	 idAry.push(trAry[i].id);
		 ///idAryId.push(parseInt(GrabIDFromString(trAry[i].id)));
		}//alert(idAry[i]);
	  }
	  var InputArr = new Array();
	  InputArr = $(destDivId).getElementsByTagName('input');
	  for(j=0;j<InputArr.length;j++) {
		idAryId.push(InputArr[j].value);
	  }
	  for(i=0;i<idAry.length;i++) {
		var IdValue = GrabIDFromString($(idAry[i]).id);
		if (!array_search(idAryId,IdValue)) {
		  var NameValue = $(idAry[i]).getElementsByTagName('input')[0].value;
          var InsertHtml = '<div class="unSelected" style="curson:pointer; white-space:nowrap;" onmouseover="this.className = this.className == \'selected\' ? \'selected\' : \'mouseOver\';" onclick="this.className = this.className == \'selected\' ? \'unSelected\' : \'selected\';" onmouseout="this.className = this.className == \'selected\' ? \'selected\' : \'unSelected\';">';
          InsertHtml += '<input type="hidden" name="'+hiddenName+'[]" value="'+IdValue+'" /><a href="#">'+NameValue+'</a></div>';
          new Insertion.Bottom(destDivId,InsertHtml);
	   }
	  }
	  return ;
  }
  var IdValue = GrabIDFromString(dataGridHighlightedRow);
  var InputArr = $(destDivId).getElementsByTagName('input');
  for(i=0;i<InputArr.length;i++) {
	 if (InputArr[i].value == IdValue) {
	   return false;
	 }
  }
  var NameValue = $(dataGridHighlightedRow).getElementsByTagName('input')[0].value;
  var InsertHtml = '<div class="unSelected" style="curson:pointer; white-space:nowrap;" onmouseover="this.className = this.className == \'selected\' ? \'selected\' : \'mouseOver\';" onclick="this.className = this.className == \'selected\' ? \'unSelected\' : \'selected\';" onmouseout="this.className = this.className == \'selected\' ? \'selected\' : \'unSelected\';">';
  InsertHtml += '<input type="hidden" name="'+hiddenName+'[]" value="'+IdValue+'" /><a href="#">'+NameValue+'</a></div>';
  new Insertion.Bottom(destDivId,InsertHtml);
}

function sendHiddenUp1(destDivId,sendAll) {
  if (sendAll != null) {
	var RemoveArr = document.getElementsByClassName('selected').concat(document.getElementsByClassName('unSelected'));
  } else {
    var RemoveArr = document.getElementsByClassName('selected');
  }
  for(i=0;i<RemoveArr.length;i++){
	 if (destDivId == RemoveArr[i].parentNode.id) {
	   Element.remove(RemoveArr[i]);  
	 }
  }
}

function sendOnClassNameandDivIdWithHidden(classN,DivId,destDivId,hiddenName,allNodes) {
	arr = allNodes? $(DivId).childNodes : document.getElementsByClassName(classN);
	for(i=0;i<arr.length;i++) {
	  if (arr[i].parentNode.id == DivId && arr[i].id) {
		if (!contains(destDivId,arr[i].id)) { 
		  var idValue  = GrabIDFromString(arr[i].id);
		  var InsertHtml = '<div id="' + arr[i].id + '" class="unSelected" style="cursor:pointer; white-space:nowrap;"  onclick="ToggleClass(this,\'unSelected\',\'selected\');" >';
		  InsertHtml += arr[i].innerHTML + '<input type="hidden" name="' + hiddenName + '[]" value="' + idValue + '" /></div>';
		  new Insertion.Bottom(destDivId,InsertHtml);
		}
         Element.remove(arr[i]);
		 if (allNodes) {i--;}
	  }
    }
}

function sendBackOnClassNameandDivId(classN,DivId,destDivId,allNodes) {
   arr = allNodes? $(destDivId).childNodes : document.getElementsByClassName(classN);
   for(i=0;i<arr.length;i++) {
	  if (arr[i].parentNode.id == destDivId && arr[i].id) {
	      if (!contains(DivId,arr[i].id)) {
		    var InsertHtml = '<div id="' + arr[i].id + '" class="unSelected" style="cursor:pointer; white-space:nowrap;"  onclick="ToggleClass(this,\'unSelected\',\'selected\');" >';
		    if (arr[i].getElementsByTagName('input')[0]) {
			  Element.remove(arr[i].getElementsByTagName('input')[0]);
			}
			InsertHtml += arr[i].innerHTML + '</div>';
            new Insertion.Bottom(DivId,InsertHtml);
		  }
		  Element.remove(arr[i]);
		  if (allNodes) {i--;}
      }
    }
}

function sendOnClassNameandDivIdWithHiddenAndCheckbox(classN,DivId,destDivId,hiddenName,checkName,allNodes) {
	arr = allNodes? $(DivId).childNodes : document.getElementsByClassName(classN);
	for(i=0;i<arr.length;i++) {
	  if (arr[i].parentNode.id == DivId && arr[i].id) {
		
		if (!contains(destDivId,arr[i].id)) { 
		  
		  var idValue  = GrabIDFromString(arr[i].id);
		  var InsertHtml = '<div id="' + arr[i].id + '" class="unSelected" style="cursor:pointer; white-space:nowrap;"  onclick="ToggleClass(this,\'unSelected\',\'selected\');" >';
		  InsertHtml += '<input type="checkbox" name="' + checkName+ '[]" value="' + idValue + '" />' + arr[i].innerHTML + '<input type="hidden" name="' + hiddenName + '[]" value="' + idValue + '" /></div>';
          new Insertion.Bottom(destDivId,InsertHtml);
		}
         Element.remove(arr[i]);
		 if (allNodes) {i--;}
	  }
    }
}

function sendOnClassNameAndDivId(classN,DivId,destDivId) {
  arr = document.getElementsByClassName(classN);
  url = '';
  for(i=0;i<arr.length;i++) {
	if (arr[i].parentNode.id == DivId) {
	  url += '/'+GrabIDFromString(arr[i].id);
	}
  }
  return url;
}

function inputInDiv(DivId,IdValue) {
  var InputArr = $(DivId).getElementsByTagName('input');
  for(i=0;i<InputArr.length;i++) {
	 if (InputArr[i].value == IdValue) {
	   return true;
	 }
  }
  return false;
}

function contains(divId,id) {
  ary = $(divId).childNodes;
  for(j=0;j<ary.length;j++) {
	 if (ary[j].id == id) {
	  return true; 
	 }
  }
  return false;
}

function datagrid_selector(gridId,destDivId,hiddenName,sendAll) {
  trArr = $(gridId).getElementsByTagName('tr');
  for(i=0;i<trArr.length;i++) {
	if (trArr[i].getElementsByTagName('input')[0] != null && trArr[i].getElementsByTagName('input')[0].style.backgroundColor == 'beige') {
	  var divId = hiddenName + '_' + GrabIDFromString(trArr[i].id);
      if (!contains(destDivId,divId)) {
	    var InsertHtml = '<div class="unSelected" id="' + divId + '" style="curson:pointer; white-space:nowrap;" onclick="ToggleClass(this,\'selected\',\'unSelected\')" >';
        InsertHtml += '<input type="hidden" name="'+hiddenName+'[]" value="'+GrabIDFromString(trArr[i].id)+'" /><a href="#">'+trArr[i].getElementsByTagName('input')[0].value+'</a></div>';
        new Insertion.Bottom(destDivId,InsertHtml);
	    return;
	  }
	}
  }
}
function throwEl(direction,allOfThem,names) {
  var divCollection = direction == 'right' ? document.getElementById('mainContainer').getElementsByTagName('div') : document.getElementById('finalList').getElementsByTagName('div');
  var parentDiv = direction == 'right' ? document.getElementById('mainContainer') : document.getElementById('finalList');
  var otherDiv = direction == 'right' ? document.getElementById('finalList') : document.getElementById('mainContainer');

  for(var i=0;i<divCollection.length;i++) { 
    if (divCollection[i].className == 'selected' || allOfThem == true) {
	   var movedDiv = divCollection[i].cloneNode(true);
	   if (direction == 'right') {
		  var hiddenEl = document.createElement('input');
		  hiddenEl.setAttribute('type','hidden');
		  hiddenEl.setAttribute('name',names+'[]');
		  hiddenEl.setAttribute('value',GrabIDFromString(movedDiv.id));
	      movedDiv.appendChild(hiddenEl);
	   }  else {
		  movedDiv.removeChild(movedDiv.getElementsByTagName('input')[0]);
	   }
	   movedDiv.className = 'unSelected';
	   otherDiv.insertBefore(movedDiv,otherDiv.firstChild);
	   parentDiv.removeChild(divCollection[i]);
	   --i;
	}
  }
}

 function removePrevNew(img,divId) {
	  if ($('newListItem')) {
		$('newListItem').parentNode.style.display = '';
		//$('newListItem').parentNode = '/STON/STON_images/tree/n.gif';
	    Element.remove($('newListItem'));
	  }
	  if (document.getElementsByClassName('ElementClicked')[0]) {
		var sel = document.getElementsByClassName('ElementClicked')[0];
	  } else {
		return;  
	  }
	  var html = '<li id="newListItem"><img src="/STON/STON_images/tree/n.gif" style="" border="none" width="11" height="21"><img src="/STON/STON_images/' + img + '">';
	  html += '<a href="#" id="newListItemTitle" class="ElementBlurred">&nbsp;</a></li>';
	  id = GrabIDFromString(sel.id);
	  new Insertion.Bottom('ListEditor_ul_'+ id,html);
      $('ListEditor_ul_'+ id).style.display = 'block';
   }
   
   function removePrevSel() {
	  if ($('newListItem')) {
		$('newListItem').parentNode.style.display = '';
	    Element.remove($('newListItem'));
	  }
   }
   
  function ToggleTreeNode(node,id,name){	
	 if (name==null) { name = 'ListEditor_ul_';}
	 else {name += '_ul_';}
     if (node.alt == 'closed') {
	     node.src= '/STON/STON_images/tree/m1.gif';
		 node.alt = 'opened';
		 $(name+id).style.display = 'block';
     }
	 else {
	     node.src= '/STON/STON_images/tree/p.gif';
		 node.alt = 'closed';
         $(name+id).style.display = 'none';
	 }
   }
  
  function toggleIfChecked(cbox,el) {
	if ($(cbox).checked) Element.show(el);
	else Element.hide(el);
  }
  
 function toggleVisIfChecked(cbox,el) {
	if ($(cbox).checked) $(el).style.visibility = 'visible';
	else $(el).style.visibility = 'hidden';
  }
  
  
  
  function get_id() {
  var activeID = GrabIDFromArray(document.getElementsByClassName('docManager_treeClicked')[0].id);
  return '/' + activeID;
}
function getId() {
  var activeID = GrabIDFromString(document.getElementsByClassName('ElementClicked')[0].id);
  return '/' + activeID;
}

//function showXinha() {
 // var text = document.getElementById('treeElementResponse').innerHTML;
  //xinha_editors.body_pgc.setHTML(text);
//}
function GrabIDFromArray(id) {
	return id.substring(id.indexOf('[')+1,id.indexOf(']'));
}
function GrabIDFromString(id) {
	var newID = parseInt(id.substring(id.lastIndexOf('_')+1));
	return newID;
}
  
 function DeleteListNode(className,element,keep) {
	  var activeID = GrabIDFromString(document.getElementsByClassName(className)[0].id);
      var activeNode = $(document.getElementsByClassName(className)[0]);
	  if (confirm('Are you sure you want to delete this '+element+'?')) {
		  if (!keep) {
		    Element.remove(activeNode.parentNode);
		  }
		  return true;
	  }
	  return false;
	  
  }
  
  function getHighighlightedNode(className) {
	  var activeNode = $(document.getElementsByClassName(className)[0]);
	  var activeID = GrabIDFromString(activeNode.id);
	 //alert(activeID);
      return activeID;
  }
  function SendUpListNode(className) {
	  var activeNode = $(document.getElementsByClassName(className)[0]);
	  var activeID = GrabIDFromString(activeNode.id);
	  var sibling =  activeNode.parentNode.previousSibling;
	  var dupNode =  activeNode.parentNode.cloneNode(true);
	  var parent  =  activeNode.parentNode.parentNode;
      try {
		 if (sibling != null) {
           parent.insertBefore(dupNode,sibling);
	       Element.remove(activeNode.parentNode);
		 }
	 } catch(e) {}
  }
  
  function SendDownListNode(className) {
	  var activeNode = $(document.getElementsByClassName(className)[0]);
      var activeID = GrabIDFromString(activeNode.id);
	  var sibling =  activeNode.parentNode.nextSibling;
	  var dupNode =  sibling.cloneNode(true);
	  var parent  =  activeNode.parentNode.parentNode;
	  
      try {
		 if (sibling != null) {
		   parent.insertBefore(dupNode,activeNode.parentNode);
           Element.remove(sibling);
         }
	  } catch(e) {}
  }
 
  function SendUpTreeListNode(className) {
      var activeNode = $(document.getElementsByClassName(className)[0]);
	  var activeID = GrabIDFromString(activeNode.id);
	  var sibling =  activeNode.parentNode.parentNode.previousSibling;
	  var dupNode =  activeNode.parentNode.parentNode.cloneNode(true);
	  var parent  =  activeNode.parentNode.parentNode.parentNode;
	  //try {
		 if (sibling.nodeType != 3) {
           parent.insertBefore(dupNode,sibling);
	       Element.remove(activeNode.parentNode.parentNode);
		 }
	 //} catch(e) {}
  }
    function SendDownTreeListNode(className) {
      var activeNode = $(document.getElementsByClassName(className)[0]);
	  var activeID = GrabIDFromString(activeNode.id);
	  var sibling =  activeNode.parentNode.parentNode.nextSibling;
	  var dupNode =  sibling.cloneNode(true);
	  var parent  =  activeNode.parentNode.parentNode.parentNode;
	  try {
		 if (sibling.nodeType != 3) {
           parent.insertBefore(dupNode,activeNode.parentNode.parentNode);
	       Element.remove(sibling);
		 }
	 } catch(e) {}
  }
 var dataGridHighlightedRow = '';
  function selectRow(tblRow) {
	  var tdArr = tblRow.getElementsByTagName('td');
      if (dataGridHighlightedRow == tblRow.id)  {
		   tdArr = $(dataGridHighlightedRow).getElementsByTagName('td');
		   for(i=0;i<tdArr.length;i++) {
		      tdArr[i].style.backgroundColor = 'beige';
		      if (tdArr[i].getElementsByTagName('input')[0]) {
	            tdArr[i].getElementsByTagName('input')[0].style.backgroundColor = 'beige';
		      }
		   }
	    return;
	  }
	  var currentTable = tblRow.parentNode.parentNode.id;
	  for(i=0;i<tdArr.length;i++) {
		  tdArr[i].style.backgroundColor = 'beige';
		  if (tdArr[i].getElementsByTagName('input')[0]) {
	         tdArr[i].getElementsByTagName('input')[0].style.backgroundColor = 'beige';
		  }
	   }
	   if (dataGridHighlightedRow != '' && document.getElementById(dataGridHighlightedRow)) { 
	     var prevTdArr = document.getElementsByTagName('td');
		 for(i=0;i<prevTdArr.length;i++) {
			 if (currentTable == prevTdArr[i].parentNode.parentNode.parentNode.id && prevTdArr[i].parentNode.id != tblRow.id) {
				 prevTdArr[i].style.backgroundColor = 'white';
				 if (prevTdArr[i].getElementsByTagName('input')[0]) {
	               prevTdArr[i].getElementsByTagName('input')[0].style.backgroundColor = 'white';
		         }
			 }
		 }
	  }
	  dataGridHighlightedRow = tblRow.id;
  }


function clearRows(tableId) {
    var prevTdArr = document.getElementsByTagName('td');
	for(i=0;i<prevTdArr.length;i++) {
		if (tableId == prevTdArr[i].parentNode.parentNode.parentNode.id) {
			prevTdArr[i].style.backgroundColor = 'white';
	    }
	}
}

function getHighlightedRow() {
  return '/'+ GrabIDFromString(dataGridHighlightedRow);
}

function getHighlightedRowFrom(id) {
	if (dataGridHighlightedRow.indexOf(id) != -1) {
		return '/'+ GrabIDFromString(dataGridHighlightedRow);
	} 
}

function DeleteRowNode(element) {
		if (getHighlightedRow == '/') return false;
		if (confirm('Are you sure you want to delete this '+element+'?')) {
          return true;
	  }
	  return false;
	}
   
function ston_success(elId) {
	if ($(elId).innerHTML.indexOf('Successful sTON Transaction') != -1) {	//alert($(elId).innerHTML);

	  return true;
	}
	return false;
}

function changeAllByClass(classTo,classFrom) {
	var arr = document.getElementsByClassName(classFrom);
	for(i=0;i<arr.length;i++) { arr[i].className = classTo; }
}

function getIdFromClassName(classFrom,noSlash) {
	if (!document.getElementsByClassName(classFrom)[0]) {
	  return 0;
	}
	var id = document.getElementsByClassName(classFrom)[0].id;
	if (noSlash){
	  return GrabIDFromString(id);
	}
	return '/'+GrabIDFromString(id);
}

function getIdFromClassNameN(classFrom) {
	if (!document.getElementsByClassName(classFrom)[0]) {
	  return '/';
	}
	var id = document.getElementsByClassName(classFrom)[0].id;
	return '/'+GrabIDFromString(id);
}

function ToggleClass(obj,class1,class2) {
  if (!obj.className) { obj = $(obj); }
  obj.className = obj.className == class1? class2 : class1;
}
function ToggleVisible() {
  for (var i = 0; i < arguments.length; i++) {
	 $(arguments[i]).style.visibility = $(arguments[i]).style.visibility == 'hidden'? 'visible' : 'hidden';
	}
}

function hidden_field(name,id,value) {
  return '<input type="hidden" name="' + name + '" id="' + id + '" value="' + value + '" />';	
}
function hide_all(container) { 
  var containers = $(container).getElementsByTagName('div');
  for (var i = 0; i < containers.length; i++) {
	Element.hide(containers[i]);
  }
}


   function ajax_indicator(id) {
	 return '<img src="/STON/STON_images/general/indicator.gif" alt="Indicator" id="'+ id +'" />';   
   }
   
   function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}
function getDataGridRowId(id) {
	var rows = $(id).getElementsByTagName('tr');
	for(i=0;i<rows.length;i++) {
	  if (rows[i].getElementsByTagName('td').length <= 0) continue;
	  if (rows[i].getElementsByTagName('td')[0].style.backgroundColor == 'beige') return '/'+GrabIDFromString(rows[i].id);
	}
	return 0;
}

function adjust_max_height() {
  var max_height = 0;
  for (var i = 0; i < arguments.length; i++) {
    if(max_height < parseInt($(arguments[i]).offsetHeight)) max_height = parseInt($(arguments[i]).offsetHeight);
  }
  for(var i = 0; i < arguments.length; i++) {
	$(arguments[i]).style.height = max_height + 'px';  
  }
}


function correctPermissions(el) {
  var pm = el.parentNode.getElementsByTagName('span')[0].innerHTML;
  if (pm == 'Modify' && el.checked) { //check view
    el.parentNode.parentNode.getElementsByTagName('input')[0].checked = true;
  } else if (pm == 'View' && !el.checked) {  //keep view checked if modify checked
    var mod_cb = el.parentNode.parentNode.getElementsByTagName('input')[1];
	if (mod_cb.checked) el.checked = true;
  }
}

function safe_file(name) {
  return name.replace(/\s/g,'_');	
}
function selectBoxValue(id) { 
  return $(id).options[$(id).selectedIndex].value;
}

 function blurLastByClassName(findC,replaceC) {
     var anchors = document.getElementsByTagName('a');
	 for(i=0;i<anchors.length;i++) { 
	   if (anchors[i].className == findC) {
	     anchors[i].className = replaceC;
	   }
	 }
  }
   var dataGridHighlightedRow = '';
   
   function clearFocusFile(findC,replaceC) {
	   dataGridHighlightedRow = '';
	   blurLastByClassName(findC,replaceC);
   }
   
   function focusListObject(obj,classN) {
      dataGridHighlightedRow = obj.id;
      obj.className = classN;
   }
   
     
   function removePrevNew(img,divId) {
	  if ($('newListItem')) {
		$('newListItem').parentNode.style.display = '';
		//$('newListItem').parentNode = '/STON/STON_images/tree/n.gif';
	    Element.remove($('newListItem'));
	  }
	  if (document.getElementsByClassName('ElementClicked')[0]) {
		var sel = document.getElementsByClassName('ElementClicked')[0];
	  } else {
		return;  
	  }
	  var html = '<li id="newListItem"><img src="/STON/STON_images/tree/n.gif" style="" border="none" width="11" height="21"><img src="/STON/STON_images/' + img + '">';
	  html += '<a href="#" id="newListItemTitle" class="ElementBlurred">&nbsp;</a></li>';
	  id = GrabIDFromString(sel.id);
	  new Insertion.Bottom('ListEditor_ul_'+ id,html);
      $('ListEditor_ul_'+ id).style.display = 'block';
   }
   
   function removePrevSel() {
	  if ($('newListItem')) {
		$('newListItem').parentNode.style.display = '';
	    Element.remove($('newListItem'));
	  }
   }
   /*
   if (!self.ToggleTreeNode) {
  function ToggleTreeNode(node,id){
     if (node.alt == 'closed') {
	     node.src= '/STON/STON_images/tree/m1.gif';
		 node.alt = 'opened';
		 $('ListEditor_ul_'+id).style.display = 'block';
     }
	 else {
	     node.src= '/STON/STON_images/tree/p.gif';
		 node.alt = 'closed';
         $('ListEditor_ul_'+id).style.display = 'none';
	 }
   }
   }*/
   
   function ToggleTreeList(node,requrl) {
	 if (node.src.match(/tree\/p.gif/)) {
	   node.src = '/STON/STON_images/tree/m1.gif';
	   if (node.alt != 'fetched'){
		 Element.show(node.parentNode.getElementsByTagName('img')[2]);
         new Ajax.Updater(node.parentNode.getElementsByTagName('span')[0],requrl,{onComplete: function(request) {Element.hide(node.parentNode.getElementsByTagName('img')[2]);}});
	     node.alt = 'fetched';
	   } else {
	     node.parentNode.getElementsByTagName('span')[0].style.display = '';
	   }
	 } else {
	   node.src = '/STON/STON_images/tree/p.gif';
	   node.parentNode.getElementsByTagName('span')[0].style.display = 'none';
	 }
   }
   
   function SiteMapLink(node) {
	 var url = '/show'
	 var urlArray = [node.name]
	 var tmpNode = node
	 var count = 0
	 while(tmpNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('a')[0].name != 'Home') {
		if (tmpNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('a')[0].name == '') break;
		urlArray.push(tmpNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('a')[0].name)
		tmpNode = tmpNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('a')[0]
		if (++count > 10) break;
	 }
	 for(i=urlArray.length-1;i>=0;i--) {
	   url += '/'+urlArray[i]
	 }
	 window.location = url
   }
  function changeEditorCode(divIdToCopy,editorID) {
	 try {
	   var content = $(divIdToCopy).innerHTML;
	   $(editorID).setCode(content);
	 } catch(e) {}
}
function update_xinha(id) {
  $(id).value = xinha_editors[id].getHTML();	
}
function remove_xinha(id) {
  xinha_editors[id]=null;
}

function hideEditor() {
	 for (var i = 0; i < arguments.length; i++) {
	   $(arguments[i]).style.position = 'absolute';
	   $(arguments[i]).style.left = '-2000px';
	 }
}
function changeStyle(editorID,styleSheet) {
  $(editorID).stylesheet = ["/site/site_styles/" + styleSheet + ".css"];
  $(editorID).updateWysiwyg();
}
function inputToEditor(editorID,inputID) {
  $(editorID).setCode($(inputID).value);
  $(editorID).updateWysiwyg();
}
function changeInserts(editorID,insertsAry) {
  $(editorID).custom_inserts = insertsAry;
  $(editorID).updateWysiwyg();
}
function clearInserts(editorID,ary) {
  $(editorID).custom_inserts = ary == null? [] : ary;
  $(editorID).updateWysiwyg();	
}
function showEditor() {
    for (var i = 0; i < arguments.length; i++) {
	 $(arguments[i]).style.position = '';
	 $(arguments[i]).style.left = '';
	}
}
function clearId() {
	 for (var i = 0; i < arguments.length; i++) {
	    if ($(arguments[i]) != null)
	     $(arguments[i]).innerHTML = '';
	 }
}
function empty(id) { 
  return !isString($(id).innerHTML) || $(id).innerHTML.length < 10;//a small number less than any error message
}
