  var YSAJAX = {};   
  
  YSAJAX.bShowURL = true;
  
  
  
  YSAJAX.cancelRequest = function(oRequest) {
    if ( oRequest != null ) {
      oRequest.stopped = true;
      if ( oRequest.xmlhttp != null )
        oRequest.xmlhttp.abort();
      oRequest.xmlhttp = null;
    }
  };
  
  
  
  YSAJAX.createXMLHttpRequest = function() {
    var xmlhttp = null;
        if(window.XMLHttpRequest) {
      try { xmlhttp  = new XMLHttpRequest(); }
      catch(e) { }
    } 
    else if(window.ActiveXObject) {
      for ( var i=6; i>0 && xmlhttp == null; i-- ) {
        try { 
          if ( i == 2 ) xmlhttp  = new ActiveXObject("Microsoft.XMLHTTP");
          else xmlhttp = new ActiveXObject("Msxml2.XMLHTTP."+ i + ".0");
        }
        catch(e) { xmlhttp = null; }
      }
    }
    if ( !xmlhttp )
      alert('Your browser doesn\'t support AJAX communications...');
      
    return xmlhttp;
  };
  
  
  
  YSAJAX.sendRequest = function(sURL, sParameters, bPost, fnCallback, objCallback, 
                              oParam, bAddAjaxcallParam) {
    if ( !isDefined(bAddAjaxcallParam) ) bAddAjaxcallParam = true;
    if ( !isDefined(oParam) ) oParam = null;
    if ( !isDefined(objCallback) ) objCallback = window;
    if ( !isDefined(fnCallback) ) fnCallback = null;
    if ( !isDefined(bPost) ) bPost = false;
    var oRequest = {xmlhttp: YSAJAX.createXMLHttpRequest(), 
                    stopped: false};
        if ( !sParameters ) sParameters = '';
    else if ( bAddAjaxcallParam ) sParameters += '&';
    if ( bAddAjaxcallParam )
      sParameters += 'ajax'+(bPost?'=':'');
      
        if ( !bPost ) {
      if ( sURL.indexOf('?') == -1 ) sURL += '?'+sParameters;
      else sURL += '&'+sParameters;
    }
    if ( bPageLoaded && YSAJAX.bShowURL ) 
      YSLog.writeText(sURL+(bPost?'?'+sParameters:''));
    
        try { 
      oRequest.xmlhttp.open((bPost?"POST":"GET"), sURL, true);
      oRequest.xmlhttp.onreadystatechange = 
        function () {
          if ( oRequest.xmlhttp.readyState == 4 ) {
            if ( !oRequest.stopped ) {
              if ( oRequest.xmlhttp.responseText && 
                   oRequest.xmlhttp.responseText.trim &&
                   oRequest.xmlhttp.responseText.trim() == 'refresh' ) {
                YSDOM.refreshPage(); 
              }
              else if (fnCallback)                 fnCallback.call(objCallback, oRequest.xmlhttp, oParam);
            }
            try { oRequest.xmlhttp.onreadystatechange = null; } 
            catch (e) {}
            oRequest.xmlhttp = null;
            oRequest = null;    
          }
        };
      
            if ( bPost ) {
        oRequest.xmlhttp.setRequestHeader("Content-type", 
                                          "application/x-www-form-urlencoded");
        oRequest.xmlhttp.setRequestHeader("Content-length", sParameters.length);
      }
      oRequest.xmlhttp.setRequestHeader("Connection", "close");
      oRequest.xmlhttp.send((bPost?sParameters:null));
    }
    catch (e) { YSLog.write('sendRequest error: '+YSDebug.print_r(e, true)); }
    return oRequest;
  };
  
  
  
  YSAJAX.showRequestURLs = function(bShowURL) {
    YSAJAX.bShowURL = bShowURL == true;
  };
  
  
  
  YSAJAX.updateElement = function(eElement, sURL, sJScript, sLoadingImage, sOverlayClassName) {
    if ( bSubmitting ) return;
    if ( !isDefined(sLoadingImage) || !sLoadingImage ) sLoadingImage = 'loading.gif';
    if ( !bPageLoaded || !document.body ) {
      setTimeout(YSString.getJSCall('YSAJAX.updateElement', 
         [eElement, sURL, sJScript, sLoadingImage, sOverlayClassName]), 500);
      return;
    }
    
    eElement = YSDOM.getObj(eElement);
    if ( !eElement ) {
      YSLog.write('obj "'+eElement+'" not found');
      return;
    }
    
        var oPos = YSDOM.getElementPosition(eElement);
    var oSize = YSDOM.getElementSize(eElement);
    var divOverlay = document.createElement('div');
    YSCSS.setMultiStyle(divOverlay,
                      ['position', 'display', 'left', 'top', 
                       'width', 'height', 'zIndex'],
                      ['absolute', 'block', oPos.left+'px', oPos.top+'px', 
                       oSize.width+'px', oSize.height+'px', 1001]);
    if ( isDefined(sOverlayClassName) )
      divOverlay.className = sOverlayClassName;
    else YSCSS.setStyle(divOverlay, 'backgroundColor', 'white');
    
    var imgLoading = document.createElement('img');
    if ( sLoadingImage.substr(0, 4) == 'http' && 
         sLoadingImage.indexOf(':\/\/') != -1 ) 
      imgLoading.src = sLoadingImage;
    else imgLoading.src = 'images/'+sLoadingImage; 
    YSCSS.setMultiStyle(imgLoading, 
      ['marginTop', 'marginLeft'], 
      [(oSize.height*0.5 - 16)+'px',(oSize.width*0.5 - 16)+'px']);
    divOverlay.appendChild(imgLoading);
    
        var aSelects = eElement.getElementsByTagName('select');
    for ( var i=0; i<aSelects.length; i++ ) 
      YSCSS.setStyle(aSelects.item(i), 'display', 'none');
    
        document.body.appendChild(divOverlay);    
    
    sURL = sURL.replace(/&amp;/g,'&');
    YSAJAX.sendRequest(sURL, null, false, YSAJAX.updateElementResponse, window,
      {element: eElement, script: sJScript, overlay: divOverlay});
  };
  
  
  
  YSAJAX.updateElementResponse = function(xmlhttp, oParam) {
    var eElement = YSDOM.getObj(oParam.element);  
    var newNode = document.createElement('span');
    newNode.innerHTML = xmlhttp.responseText;
    if ( bIE )       eElement.outerHTML = xmlhttp.responseText;    
    else YSDOM.replaceElement(eElement, newNode);

    eElement = YSDOM.getObj(eElement.id);     
        if (bIE) var aJScripts = newNode.getElementsByTagName('script');
    else var aJScripts = eElement.getElementsByTagName('script');
    
    for ( var i=0; i<aJScripts.length; i++ ) {
      var oJScript = aJScripts[i];
      YSLog.write('eval('+oJScript.innerHTML+');');
      eval(oJScript.innerHTML);
      if ( !bIE ) oJScript.innerHTML = '';
    }
      
    if ( isDefined('MES', true) ) MES.recalculateAcceptPositions();
    if ( isDefined(oParam.script) && oParam.script ) eval(oParam.script);
    YSDOM.removeElement(oParam.overlay);
  };

  YSConfirm.YES_NO = 1;
  YSConfirm.OK = 2;

  
  function YSConfirm(sID, sQuestion, sYes, sNo, fnCallback, objCallback,
                     eCenterElement, iType, oCallbackParam) {
    this.sID         = sID;
    this.sQuestion   = YSString.trim(sQuestion);
    this.sYes        = sYes;
    this.sNo         = sNo;
    this.fnCallback  = isDefined(fnCallback) ? fnCallback : null;
    this.objCallback = isDefined(objCallback) ? objCallback : window;
    this.eCenterElement = isDefined(eCenterElement) ? eCenterElement : null;
    this.iType = isDefined(iType) ? iType : YSConfirm.YES_NO;
    this.oCallbackParam = isDefined(oCallbackParam) ? oCallbackParam : null;
    this.createConfirm();
  }
  
  
  
  YSConfirm.createAlert = function(sMsg, sOK, eCenterElement) {
    if ( !isDefined(sOK) ) sOK = "OK";
    new YSConfirm("alert", sMsg, sOK, "", null, null, eCenterElement, 
                  YSConfirm.OK);  
  };
  
  
  
  YSConfirm.createLinkConfirm = function(sQuestion, sLink, sYes, sNo, 
                                          eCenterElement) {
    new YSConfirm("linkconfirm", sQuestion, sYes, sNo, YSConfirm.onLinkConfirm, 
                  window, eCenterElement, YSConfirm.YES_NO, sLink);
  };
  
  
  
  YSConfirm.onLinkConfirm = function(sID, bAgree, sLink) {
    if ( bAgree ) document.location.href = sLink;
  }; 
  
  
  
  YSConfirm.prototype.destruct = function() {
    this.fnYes = this.fnNo = this.objYes = this.objNo = null;
  };
  
  
  
  YSConfirm.prototype.clickYes = function() {
    this.close(true);
  }; 
  
  
  
  YSConfirm.prototype.clickNo = function() {
    this.close(false);
  };
  
  
  
  YSConfirm.prototype.close = function(bAgree) {
    YSDOM.removeElement('Confirm_popup');
    YSDOM.removeElement('Confirm_overall');
    if ( this.fnCallback )
      this.fnCallback.call(this.objCallback, this.sID, bAgree, 
                           this.oCallbackParam);
    this.destruct();
  };
  
  
  
  YSConfirm.prototype.createConfirm = function() {
        var oWindowSize = YSDOM.getWindowSize();
    var oBodySize   = YSDOM.getElementSize(document.body);
    var divOverall  = document.createElement('div');
    divOverall.id   = 'Confirm_overall'; 
    YSCSS.setTransparency(divOverall, 60);
    YSCSS.setMultiStyle(divOverall, 
      ['width', 'height', 'position', 'top', 'left', 'backgroundColor', 
       'zIndex', 'display'],
      [Math.max(oWindowSize.width, oBodySize.width) + 'px',
       Math.max(oWindowSize.height, oBodySize.height) + 'px',
       'absolute', '0px', '0px', 'white', '1001', 'none']);
    document.body.appendChild(divOverall);    
    YSCSS.setStyle(divOverall, 'display', 'block');
    
        var divPopup       = document.createElement('div');
    divPopup.className = 'fw_confirmpopup';
    divPopup.id        = 'Confirm_popup';
    YSCSS.setMultiStyle(divPopup, ['visibility', 'position', 'zIndex'], 
                                ['hidden', 'absolute', '1002']);
    
    var divTopBar       = document.createElement('div');
    divTopBar.className = 'fw_confirmtopbar';
    divPopup.appendChild(divTopBar);
    
    var divQuestion       = document.createElement('div');
    divQuestion.className = 'fw_confirmquestion';
    divPopup.appendChild(divQuestion);
    
    var pQuestion = document.createElement('p');
    pQuestion.innerHTML = this.sQuestion;
    divQuestion.appendChild(pQuestion);
    
    var divButtons = document.createElement('div');
    YSCSS.setStyle(divButtons, 'textAlign', 'center');
    divQuestion.appendChild(divButtons);
    
    var btnYes = document.createElement('button');
    btnYes.className = 'fw_confirmyes';
    btnYes.innerHTML = this.sYes;
    YSEventHandler.Instance().addHandler(btnYes, 'onclick', 
      YSConfirm.prototype.clickYes, this);
    divButtons.appendChild(btnYes);
    
    if ( this.iType == YSConfirm.YES_NO ) {
      var btnNo = document.createElement('button');
      btnNo.className = 'fw_confirmno';
      btnNo.innerHTML = this.sNo;
      YSEventHandler.Instance().addHandler(btnNo, 'onclick', 
        YSConfirm.prototype.clickNo, this);
      divButtons.appendChild(btnNo);
    }
    
    document.body.appendChild(divPopup);
    YSMoveElement.setDraggable(divPopup, divTopBar);
    
    YSDOM.setToCenter(divPopup, null, this.eCenterElement);
    YSCSS.setStyle(divPopup, 'visibility', 'visible');
  };
  var YSCookie = {};   
    
  YSCookie.create = function(sName,sValue,iDays, bUnixTime) {
    if ( !isDefined(iDays) ) iDays = 0;
    if ( !isDefined(bUnixTime) ) bUnixTime = false;
    
    var sExpires = "";
    if ( !iDays ) {
      iDays = 2147483647;
      bUnixTime = true;
    }
    var dtDate = new Date();
    if ( bUnixTime ) dtDate.setTime(iDays*1000);
    else dtDate.setTime(dtDate.getTime()+(iDays*24*60*60*1000));
    sExpires = "; expires="+dtDate.toGMTString();
    document.cookie = escape(sName)+"="+escape(sValue)+sExpires+"; path=/";
  };
  
  
  
  YSCookie.read = function(sName) {
    var sNameEQ = sName + "=";
    var aCookies = getAllCookies();
    if ( isDefined(aCookies[sName]) ) return aCookies[sName];
    else return null;
  };
  
  
  
  YSCookie.getAll = function() {
    var aCookies = document.cookie.split(';');
    var aValues = {};
    for (var i=0; i < aCookies.length; i++) {
      var aCookieValue = aCookies[i].split('=');
      aValues[String(unescape(aCookieValue[0])).trim()] = unescape(aCookieValue[1]);
    }
    return aValues;
  };
  
  
  
  YSCookie.erase = function(sName) {
    YSCookie.create(sName, "", -1);
  };
  var YSCSS = {};   
  
  YSCSS.addClassName = function(obj, sClassName) {
    obj = YSDOM.getObj(obj);
    if ( obj == null ) return;
    if ( !YSCSS.hasClassName(obj, sClassName) ) {
      if ( obj.className ) obj.className = obj.className + ' ' + sClassName;
      else obj.className = sClassName;
    }
  };
  
  
  
  YSCSS.getBorderBottom = function(eElement) {
    return YSCSS.getStyle(eElement, 'borderBottomWidth', true);
  };
  
  
  
  YSCSS.getBorderLeft = function(eElement) {
    return YSCSS.getStyle(eElement, 'borderLeftWidth', true);
  };
  
  
  
  YSCSS.getBorderRight = function(eElement) {
    return YSCSS.getStyle(eElement, 'borderRightWidth', true);
  };
  
  
  
  YSCSS.getBorderTop = function(eElement) {
    return YSCSS.getStyle(eElement, 'borderTopWidth', true);
  };  
  
  
  
  YSCSS.getStyle = function(obj, sStyleName, bReturnInt) {
    obj = YSDOM.getObj(obj);
    if ( !obj ) return null;
    if ( !isDefined(bReturnInt) ) bReturnInt = false;
    
    var value = 0;
    if ( bReturnInt ) {      
      if ( sStyleName == 'width' ) value = obj.offsetWidth;
      if ( sStyleName == 'height' ) value = obj.offsetHeight;
      if ( value ) return value;
    }
    
    value = obj.style[sStyleName];
    if( !value || value == 'auto' )       if ( document.defaultView ) {
        var css = document.defaultView.getComputedStyle(obj, null);
        value = css.getPropertyValue(sStyleName) || css[sStyleName];
      }
      if( !value && obj.currentStyle )
        value = obj.currentStyle[sStyleName];
    if ( (typeof value).toLowerCase() == 'string' )
      value = value.toLowerCase();
    if ( bReturnInt ) {
      var bPercent = false;
      if ( value && value.substr(value.length-1, 1) == '%' ) 
        bPercent = true;        
      value = parseInt(value);
      if ( isNaN(value) ) {
        value = 0;
        if ( sStyleName == 'width' ) value = obj.offsetWidth;
        if ( sStyleName == 'height' ) value = obj.offsetHeight;
      }
      else if ( bPercent && obj.parentNode ) {
        value = value / 100 * YSCSS.getStyle(obj.parentNode, sStyleName, true);
      }
    }
    
    return !isDefined(value)?null:value;
  };
  
  
    
  YSCSS.hasClassName = function(obj, sClassName) {
    obj = YSDOM.getObj(obj);
    if ( obj == null ) return false;
    else {
      var sCurName = String(obj.className);
      return sCurName.indexOf(sClassName) != -1;
    }
  };
  
  
  
  YSCSS.isVisible = function(obj) {
    obj = YSDOM.getObj(obj);
    if ( !obj ) return false;
    
    while (obj.tagName.toLowerCase() != 'body' && 
           YSCSS.getStyle(obj, 'display') != 'none' && 
           YSCSS.getStyle(obj, 'visibility') != 'hidden') {
      obj = obj.parentNode;
    }

    if (obj.tagName.toLowerCase() == 'body') return true;
    else return false;
  };
  
  
  
  YSCSS.loadCSS = function(sCSSLocation) {
    var head = document.getElementsByTagName("head")[0];
    var cssLink = document.createElement('link');
    cssLink.setAttribute('href', sCSSLocation);
    cssLink.setAttribute('rel', 'stylesheet');
    cssLink.setAttribute('type', 'text/css');
    head.appendChild(cssLink);
  };
  
  
  
  YSCSS.removeClassName = function(obj, sClassName) {
    obj = YSDOM.getObj(obj);
    if ( obj == null ) return;
    if ( YSCSS.hasClassName(obj, sClassName+' ') ) sClassName += ' ';
    else if ( YSCSS.hasClassName(obj, ' '+sClassName) ) sClassName = ' ' + sClassName;
    YSCSS.replaceClassName(obj, sClassName, '');
  };
  
  
  
  YSCSS.replaceClassName = function(obj, sSearch, sReplace ) {
    obj = YSDOM.getObj(obj);
    if (!obj || !obj.className) return;
    var sClassName = String(obj.className);
    sClassName = sClassName.replace(new RegExp(sSearch, "g"), sReplace);
    obj.className = sClassName;
  };
  
  
  
  YSCSS.replaceClassNameRecursive = function(obj, sSearch, sReplace) {
    obj = YSDOM.getObj(obj);
    YSCSS.replaceClassName(obj, sSearch, sReplace);
    for ( var i=0; i<obj.childNodes.length; i++ )
      YSCSS.replaceClassNameRecursive(obj.childNodes[i], sSearch, sReplace);
  }; 
    
  
  
  YSCSS.setMultiStyle = function(obj, aStyleNames, aValues) {
    if ( !YSList.isArray(obj) ) obj = [obj];
    for ( var iIndex in obj ) {
      var eElement = YSDOM.getObj(obj[iIndex]);
      for (var i=0; i<aStyleNames.length; i++)
        if ( isDefined(aStyleNames[i]) && isDefined(aValues[i]) )
          YSCSS.setStyle(eElement, aStyleNames[i], aValues[i]);    
    }
  };
  
  
  
  YSCSS.setStyle = function(obj, sStyleName, sValue) {
    obj = YSDOM.getObj(obj);
    if ( obj != null && isDefined(obj.style) ) {
      if ( sStyleName.toLowerCase() == 'float' ) {
        if ( bIE ) sStyleName = 'styleFloat';
        else sStyleName = 'cssFloat';
      }
      try { obj.style[sStyleName] = sValue; }
      catch (e) { 
        YSLog.write(obj.id+': '+sStyleName+'='+sValue); 
        YSDebug.print_r(e); 
      }
    }
  };
  
  
  
  YSCSS.setStyleRecursive = function(obj, sStyleName, sValue) {
    obj = YSDOM.getObj(obj);
    YSCSS.setStyle(obj, sStyleName, sValue);
    for ( var i=0; i<obj.childNodes.length; i++ )
      YSCSS.setStyleRecursive(obj.childNodes[i], sStyleName, sValue);
  };
  
  
  
  YSCSS.setTransparency = function(obj, iPercent) {
    iPercent = 100 - iPercent;
    if ( bIE ) 
      YSCSS.setStyle(obj, 'filter', 'alpha(opacity='+iPercent+')');
    else {
      YSCSS.setStyle(obj, 'MozOpacity', iPercent/100);
      YSCSS.setStyle(obj, 'opacity', iPercent/100);
    }
  };
  
  
  
  YSCSS.swapClassName = function(obj, sClass1, sClass2) {
    if ( obj == null ) return;
    if ( YSCSS.hasClassName(obj, sClass1) ) 
      YSCSS.replaceClassName(obj, sClass1, sClass2);
    else YSCSS.replaceClassName(obj, sClass2, sClass1);
  };
  var YSDateTime = {};   
  
  YSDateTime.getCurTime = function() {
    return (new Date()).getTime();
  };
  
  
  
  YSDateTime.getTimeString = function(iSeconds) {
    return padDigits(Math.floor(iSeconds/3600),2)+':'+
           padDigits(Math.floor(iSeconds%3600/60),2)+':'+
           padDigits(Math.floor(iSeconds%3600%60),2);
  };
  
  function Pixel(iLeft, iTop) {
    if ( !isDefined(iLeft) ) iLeft = 0;
    if ( !isDefined(iTop) ) iTop = 0;
    this.left = iLeft;
    this.top  = iTop;
  }
  
  
  function Size(iWidth, iHeight) {
    if ( !isDefined(iWidth) ) iWidth = 0;
    if ( !isDefined(iHeight) ) iHeight = 0;
    this.width  = iWidth;
    this.height = iHeight;
  }
  
  
  Size.prototype.swap = function() {
    var iTemp = this.width;
    this.width = this.height;
    this.height = iTemp;
  };
  
  
  
  
  var YSDOM = {};   
  
  
  YSDOM.addOnFocusBlur = function() {
    var aLinks = document.body.getElementsByTagName('a');
    for( var i in aLinks )
      YSEventHandler.Instance().addHandler(aLinks[i], 'onfocus', YSDOM.blurLink);
  };
  
  
  
  YSDOM.addRecursiveToID = function(eElement, sAddition) {
    if (eElement.id) eElement.id += sAddition;
    for ( var i=0; i<eElement.childNodes.length; i++ )
      YSDOM.addRecursiveToID(eElement.childNodes.item(i), sAddition);
    return eElement;
  };
  
  
  
  YSDOM.blurLink = function(e, obj) {
    obj.blur();
  };
  
  
  
  YSDOM.cutOffElementText = function(eElement, iMaxLength, sTitleText) {
    eElement = YSDOM.getObj(eElement);
    if ( eElement.innerHTML.length > iMaxLength ) {
      eElement.title = sTitleText || eElement.innerHTML;
      eElement.innerHTML = eElement.innerHTML.substr(0, iMaxLength-3) + '...';
      return true;       
    } 
    else return false;
  };
  
  
    YSDOM.drawLine = function(x1, y1, x2, y2, iWidth, sColor, iBorderWidth, sBorderColor) {
    if ( !isDefined(iBorderWidth) ) iBorderWidth = 0;
    if ( !isDefined(sBorderColor) ) sBorderColor = null;
    var dX = Math.abs(x2-x1);
    var dY = Math.abs(y2-y1);
    if ( dY == 0 || dX == 0 ) {       if ( dX == 0 && dY == 0 ) return null;
      var divLine = document.createElement('div');
      YSCSS.setMultiStyle(divLine,
        ['position', 'top', 'left', 'width', 'height', 'backgroundColor', 'fontSize'],
        ['absolute', Math.min(y1,y2)+'px', Math.min(x1,x2)+'px', 
         (dX==0?iWidth:dX)+'px', (dY==0?iWidth:dY)+'px', sColor, '1px']);
      if ( iBorderWidth )
        YSCSS.setStyle(divLine, 'border', 'solid '+iBorderWidth+'px '+sBorderColor);
      if ( bPageLoaded ) document.body.appendChild(divLine);
      return divLine;
    }
    else {
      var aDivs = new Array();
      var fIncr;
      if ( dX > dY ) fIncr = dX / (dY+1);
      else fIncr = dY / (dX+1);

      var fRest = 0.0;
      var iTo   = Math.min(dX,dY)+1;
      var iYMultiply = y2-y1>0 ? 1 : -1;
      var iXMultiply = x2-x1>0 ? 1 : -1;
      var oTo = new Pixel(x2, y2);
      x2 = x1; y2 = y1;
      for (var i=0; i<iTo; i++) {
        if ( i > 0 ) {
          if ( dX > dY ) {
            y1 += iYMultiply; y2 = y1;
          }
          else {
            x1 += iXMultiply; x2 = x1;
          }
        }
        
        var fPlus = fIncr + fRest;
        fRest = fPlus - Math.floor(fPlus);
        var iPlus = Math.floor(fPlus);
        
        if ( i == iTo-1) {
          x2 = oTo.left;
          y2 = oTo.top;
        }
        else {
          if ( dX > dY ) x2 = x1 + iPlus*iXMultiply;
          else y2 = y1 + iPlus*iYMultiply;
        }
        
        aDivs.push(YSDOM.drawLine(x1,y1,x2,y2,iWidth,sColor,iBorderWidth,sBorderColor));
        
        if ( dX > dY ) x1 = x2;
        else y1 = y2;
      }
      
      return aDivs;
    }    
  };
  
  
  
   YSDOM.hasParent = function(eElement, eParent) {
    while ( eElement.parentNode && eElement != document.body ) {
      if ( eElement.parentNode == eParent ) return true;
      eElement = eElement.parentNode;
    }
    return false;
  };
  
  
  
   YSDOM.findParent = function(objElement, sParentTag) {
    while ( objElement.parentNode && objElement != document.body ) {
      if ( objElement.parentNode.tagName.toLowerCase() == sParentTag.toLowerCase() )
        return objElement.parentNode;
      objElement = objElement.parentNode;
    }
    return null;
  };
  
  
  
  YSDOM.getDocumentScroll = function() {
    var oScroll = new Pixel();
    oScroll.x = document.documentElement.scrollLeft?
                  document.documentElement.scrollLeft:
                  document.body.scrollLeft;
    oScroll.y = document.documentElement.scrollTop?
                  document.documentElement.scrollTop:
                  document.body.scrollTop;
    return oScroll;
  }; 
  
  
  
  YSDOM.getElementAttribute = function(eElement, sAttribute) {
    eElement = YSDOM.getObj(eElement);
    return YSXML.getAttribute(eElement, sAttribute);    
  };
  
  
  
  YSDOM.getElementPosition = function(eElement) {
    eElement = YSDOM.getObj(eElement);
    if ( !eElement ) return new Pixel();
    var iLeftPos = eElement.offsetLeft;          
    var iTopPos = eElement.offsetTop;            
    var eParElement = eElement.offsetParent;       while (eParElement != null ) {                   iLeftPos += eParElement.offsetLeft;      
      iTopPos  += eParElement.offsetTop;
      if ( YSCSS.getStyle(eParElement, 'position') == 'relative' ) {
        iLeftPos += YSCSS.getStyle(eParElement, 'borderLeftWidth', true);
        iTopPos += YSCSS.getStyle(eParElement, 'borderTopWidth', true);
      }
      eParElement = eParElement.offsetParent;      }
    return new Pixel(iLeftPos, iTopPos);
  };
  
  
  
  YSDOM.getElementSize = function(eElement) {
    var oSize = new Size(YSCSS.getStyle(eElement, 'width', true),
                         YSCSS.getStyle(eElement, 'height', true));
    return oSize;
  };
  
  
  
  YSDOM.getIFrame = function(sFrameID) {
    var frFrame = document.frames ? document.frames[sFrameID] : 
                                    YSDOM.getObj(sFrameID);
    if ( frFrame ) return frFrame.window || frFrame.contentWindow;
    else return null;
  };
  
  
  
  YSDOM.getMouseEventDiv = function(eElement, bAddToBody) {
    eElement = YSDOM.getObj(eElement);
    if ( !eElement ) return;
    if ( !isDefined(bAddToBody) ) bAddToBody = false;
    
    if ( !bAddToBody ) {
            var sCurPositionStyle = YSCSS.getStyle(eElement, 'position');
      if ( sCurPositionStyle != 'relative' && sCurPositionStyle != 'absolute' )
        YSCSS.setStyle(eElement, 'position', 'relative');
    }
    
        var oSize = YSDOM.getElementSize(eElement);
    
    var divCatch = document.createElement("div");
    YSCSS.setStyle(divCatch, 'position', 'absolute'); 
    var oPos = new Pixel();
        if ( bAddToBody ) oPos = YSDOM.getElementPosition(eElement);
    
        YSCSS.setMultiStyle(divCatch, 
      ['left', 'top', 'width', 'height', 'zIndex', 'backgroundColor'], 
      [oPos.left+'px', oPos.top+'px', oSize.width+'px', oSize.height+'px', 
       '101', 'white']); 
    YSCSS.setTransparency(divCatch, 100);
    
    if ( bAddToBody ) document.body.appendChild(divCatch);
    else eElement.appendChild(divCatch);
    return divCatch;
  };
  
  
  
  YSDOM.getObj = function(sID) {
    if ( YSString.isString(sID) ) return document.getElementById(sID);
    else return sID;
  };
  
  
  
  YSDOM.getRadioValue = function(sName) {
    var objRadio = document.getElementsByName(sName);
    if (YSDOM.Radio) objRadio = YSDOM.getObj(sName);
    if (!objRadio) return null;
    
    if (!isDefined(objRadio.length))
      if (objRadio.checked) return objRadio.value;
      else return null;
      
    for (var i=0; i<objRadio.length; i++)
      if(objRadio[i].checked) return objRadio[i].value;       
    return null;
  };
  
  
  
  YSDOM.getValidCopy = function(eElement) {
    var eNewElement = eElement.cloneNode(true);
    if ( eElement.id )
      return YSDOM.addRecursiveToID(eNewElement, '_copy');
    else return eNewElement;
  };
  
  
  
  YSDOM.getValue = function(eElement, bEncodeHTML) {
    if ( !isDefined(bEncodeHTML) ) bEncodeHTML = false;
    eElement = YSDOM.getObj(eElement);
    if ( !eElement ) return "";
    return bEncodeHTML?YSString.encodeHtml(eElement.value):eElement.value;
  };
  
  
  
  YSDOM.getWindowSize = function() {
    if ( isDefined(window.innerWidth) && isDefined(window.innerHeight) )
      return new Size(window.innerWidth, window.innerHeight);
    else {
      return new Size(document.documentElement.clientWidth ||
                        document.body.clientWidth ||
                        document.body.scrollWidth,
                      document.documentElement.clientHeight ||
                        document.body.clientHeight ||
                        document.body.scrollHeight);
    }
  };
  
  
  
  YSDOM.posAboveElement = function(oPos, eElement) {
    var oElPos = YSDOM.getElementPosition(eElement);
    var oElSize = YSDOM.getElementSize(eElement);
    return YSDOM.posWithinBounds(oPos, oElPos.left, oElPos.top, 
                                      oElSize.width, oElSize.height);
  };
  
  
  
  YSDOM.posWithinBounds = function(oPos, iLeft, iTop, iWidth, iHeight) {
    return !(oPos.left < iLeft || oPos.left > iLeft + iWidth ||
             oPos.top  < iTop  || oPos.top  > iTop + iHeight);
  };
  
  
  
  YSDOM.refreshPage = function() {
        var sCurLoc = window.location.href;
    
    if ( sCurLoc.indexOf('?') != -1 ) {
      var iRefreshPos = sCurLoc.indexOf('refresh=');
      if ( iRefreshPos != -1 ) {
        var sRefreshString = sCurLoc.substr(iRefreshPos);
        var iEndPos = sRefreshString.indexOf('&');
        var sStartString = sCurLoc.substr(0,iRefreshPos);
        var iEqualPos = sRefreshString.indexOf('=')+1;
        if ( iEndPos != -1 ) {
          var iNumber = parseInt(sRefreshString.substring(iEqualPos, iEndPos));
          sCurLoc = sStartString + 'refresh='+ (++iNumber) + sRefreshString.substr(iEndPos);
        }
        else {
          var iNumber = parseInt(sRefreshString.substr(iEqualPos));
          sCurLoc = sStartString + 'refresh='+(++iNumber);
        }
      }
      else sCurLoc += '&refresh=1';
    }
    else sCurLoc += '?refresh=1';
    window.location.href = sCurLoc;
  };
  
  
  
  YSDOM.removeElement = function(eElement) {
    eElement = YSDOM.getObj(eElement);
    if ( !eElement ) return false;
    if ( !eElement.parentNode ) return false;
    try {
      eElement.parentNode.removeChild(eElement);    
      return true;
    } catch (e) { return false; }
  };
  
  
  
  YSDOM.removeElementChilds = function(eElement) {
    eElement = YSDOM.getObj(eElement);
    if ( !eElement || !eElement.childNodes ) {
      if ( eElement && eElement.innerHTML ) eElement.innerHTML = '';
      return;
    }
    while (eElement.childNodes.length > 0)
      eElement.removeChild(eElement.childNodes[0]);
    eElement.innerHTML = '';
  };
  
  
  
  YSDOM.removeHiddenElements = function(eElement) {
    eElement = YSDOM.getObj(eElement);
    for (var i=0; i<eElement.childNodes.length; i++ ) {
      if ( !isDefined(eElement.childNodes[i].tagName) ) continue;
      if (!YSCSS.isVisible(eElement.childNodes[i]) &&
          !YSCSS.hasClassName(eElement.childNodes[i], 'tinyMCETextarea') &&
          eElement.childNodes[i].getAttribute('type') != 'hidden')
        if ( YSDOM.removeElement(eElement.childNodes[i]) ) i--; 
      else YSDOM.removeHiddenElements(eElement.childNodes[i]);         
    }
  };
  
  
  
  YSDOM.replaceElement = function(objElement, objReplace) {
    objElement.parentNode.insertBefore(objReplace, objElement);
    YSDOM.removeElement(objElement);
  };
  
  
  
  YSDOM.setElementAttribute = function(eElement, sAttribute, sValue) {
    eElement = YSDOM.getObj(eElement);
    YSXML.setAttribute(eElement, sAttribute, sValue);
  };
  
  
  
  YSDOM.setFocus = function(objFocus) {
    objFocus = YSDOM.getObj(objFocus);
    if ( !objFocus ) return;
    try { objFocus.focus(); }
    catch (e) { YSDebug.print_r(e); }
    if (objFocus.createTextRange) {
      try {
        var trRange = objFocus.createTextRange();
        trRange.moveStart('character', objFocus.value.length);
        trRange.collapse();
        trRange.select();
      } catch (e) { }
    }
  };
  
  
  
  
  YSDOM.setPosition = function(obj, oPos) {
    YSCSS.setMultiStyle(obj, ['left', 'top'], [oPos.left+'px', oPos.top+'px'])
  };
  
  
  
  YSDOM.setSize = function(obj, oSize) {
    if ( oSize.width != null ) {
      var iWidth = oSize.width - 
                   YSCSS.getStyle(obj, 'paddingLeft', true) -
                   YSCSS.getStyle(obj, 'paddingRight', true) -
                   YSCSS.getStyle(obj, 'borderLeftWidth', true) -
                   YSCSS.getStyle(obj, 'borderRightWidth', true);
      YSCSS.setStyle(obj, 'width', iWidth+'px');
    }
    if ( oSize.height != null ) {
      var iHeight = oSize.height - 
                    YSCSS.getStyle(obj, 'paddingTop', true) -
                    YSCSS.getStyle(obj, 'paddingBottom', true) -
                    YSCSS.getStyle(obj, 'borderTopWidth', true) -
                    YSCSS.getStyle(obj, 'borderBottomWidth', true);
      YSCSS.setStyle(obj, 'height', iHeight+'px');
    }
  };
  
  
  
  YSDOM.setToCenter = function(eElement, oSize, eCenterOnElement) {
    var pxCenter;
    if ( eCenterOnElement && eCenterOnElement != window ) {
      var oCenterSize = YSDOM.getElementSize(eCenterOnElement);
      var oCenterPos  = YSDOM.getElementPosition(eCenterOnElement);
      pxCenter = new Pixel(oCenterSize.width * 0.5 + oCenterPos.left,
                           oCenterSize.height * 0.5 + oCenterPos.top);
    }
    else {
      var oWindowSize  = YSDOM.getWindowSize();
      pxCenter = new Pixel(oWindowSize.width * 0.5,
                           oWindowSize.height * 0.5 + YSDOM.getDocumentScroll().y);
    }
    var oElementSize = oSize || YSDOM.getElementSize(eElement);
    YSCSS.setMultiStyle(eElement, ['left', 'top'], 
      [(pxCenter.left - oElementSize.width * 0.5) + 'px', 
       (pxCenter.top - oElementSize.height * 0.5) + 'px']);
  };
  
  
  
  YSDOM.setValue = function(eElement, sValue) {
    eElement = YSDOM.getObj(eElement);
    if ( eElement ) eElement.value = sValue;
  };
  var YSEvent = {};   
  
  YSEvent.cancelEvent = function(e, bCancelBubbling) {
    if ( !isDefined(bCancelBubbling) ) bCancelBubbling = false;
    e = YSEvent.getEvent(e);
    e.returnValue = false; 
    e.cancelBubble = bCancelBubbling; 
    if ( e.preventDefault && e.stopPropagation ){ 
            e.preventDefault() ; 
      e.stopPropagation() ; 
    }      
  };
  
  
  
  YSEvent.getEvent = function(e) {
    if (!e) e = window.event;
    if (!e) e = null;
    return e;
  };
  
  
  
  YSEvent.getEventTarget = function(e) {
    e = YSEvent.getEvent(e);
    if (!e) return null;
    var oTarget = null;
    if (e.target) oTarget = e.target;
    else if (e.srcElement) oTarget = e.srcElement;
    if (oTarget && oTarget.nodeType == 3)       oTarget = oTarget.parentNode;
    return oTarget;
  };
  
  
  
  YSEvent.getGlobalMousePosition = function(e) {
    var iX = 0;
    var iY = 0;
    var e = YSEvent.getEvent(e);
    if (!e) return new Pixel();
    
    if (e.pageX || e.pageY) {
      iX = e.pageX;
      iY = e.pageY;
    } 
    else if (e.clientX || e.clientY){
      var oScroll = YSDOM.getDocumentScroll();
      iX = e.clientX + oScroll.x;
      iY = e.clientY + oScroll.y;
    } 
    return new Pixel(iX, iY);  
  };
  
  
  
  YSEvent.getKeyCode = function(e) {
    e = YSEvent.getEvent(e);
    if (!e) return null;
    return e.keyCode;
  };
  
  
  
  YSEvent.getMouseButton = function(e) {
    e = YSEvent.getEvent(e);
    if (!e) return null;
    var iClickType = 1;
    if ( parseInt(navigator.appVersion) > 3 ) {
      if ( navigator.appName == "Netscape")
        iClickType = e.which;
      else iClickType = e.button;
    }
    return iClickType;
  };
  
  
  
  YSEvent.getObjMousePosition = function(e, eElement, iElementBorder) {
    if ( !isDefined(iElementBorder) ) iElementBorder = 0;
    if ( bIE ) iElementBorder = iElementBorder * 2 + 1;    
        var oMousePos = null;
    if ( isDefined(e) && e != null && isDefined(e.top) && isDefined(e.left) )
      oMousePos = e;
    else oMousePos = YSEvent.getGlobalMousePosition(e);
        var oElPos = YSDOM.getElementPosition(eElement);
    oElPos.top  += iElementBorder;
    oElPos.left += iElementBorder;
    return new Pixel(oMousePos.left - oElPos.left, 
                     oMousePos.top  - oElPos.top);
  };
  
  
  
  YSEvent.getScrollWheelDirection = function(e) {
    e = YSEvent.getEvent(e);
    var iDelta = 0;
    if (e.wheelDelta) {
      iDelta = e.wheelDelta/120; 
      if (window.opera) iDelta = -iDelta;
    } 
    else if (e.detail) {
      iDelta = -e.detail/3;
    }
    return iDelta;
  };
  
  
  
  YSEvent.isMouseAboveElement = function(e, eElement) {
    var oPos = YSEvent.getGlobalMousePosition(e);
    return YSDOM.posAboveElement(oPos, eElement);
  };
  
    
  
  YSEvent.performClick = function(sID) {
    if ( !bPageLoaded ) {
      setTimeout("Event.performClick('"+sID+"');", 200);
      return;
    }
    var objElement = YSDOM.getObj(sID);
    if ( objElement && objElement.onclick ) objElement.onclick();
  };

  
	function YSEventHandler() {
		this.aoCallbacks = {}; 		this.iLastGivenID = 0;
	}
	
		YSEventHandler.Me = null;
	
	
	
	YSEventHandler.Instance = function() {
		if ( YSEventHandler.Me == null ) YSEventHandler.Me = new YSEventHandler();
		return YSEventHandler.Me;
	};
	
	
	
	YSEventHandler.prototype.addHandler = function (obj, sEvent, fnCallback, objScope, 
	                                              oReturnValue) {
		if ( !obj ) return;
		if ( !isDefined(objScope) ) objScope = window;
		if ( !isDefined(oReturnValue) ) oReturnValue = null;
		
		var sAttribute = sEvent+'_EventHandlerID';
		var iID = YSNumbers.checkInt(YSDOM.getElementAttribute(obj, sAttribute));
		if ( iID == 0 ) {
			iID = ++this.iLastGivenID;
			this.aoCallbacks[iID] = {};
			this.aoCallbacks[iID].jseval = YSString.getFunctionString(obj, sEvent);
			this.aoCallbacks[iID].returnvalue = null;
			this.aoCallbacks[iID].callbackfunctions = [];
			eval("obj."+sEvent+" = function(e) { "+
					   "return YSEventHandler.prototype.handleEvent.call(this, e, '"+sEvent+"');"+
				   "};");
			YSDOM.setElementAttribute(obj, sAttribute, iID);
		}
		
		if ( oReturnValue != null || this.aoCallbacks[iID].returnvalue == null )
			this.aoCallbacks[iID].returnvalue = oReturnValue;
		var oNewCallback = {};
		oNewCallback.fnCallback = fnCallback; 
		oNewCallback.objScope = objScope;
		if ( this.callbackExists(oNewCallback, iID) == -1 )
  		this.aoCallbacks[iID].callbackfunctions.push(oNewCallback);
	};
	
	
	
	YSEventHandler.prototype.removeHandler = function (obj, sEvent, fnCallback, objScope) {
	  var iID = YSNumbers.checkInt(YSDOM.getElementAttribute(obj, sEvent+'_EventHandlerID'));
	  	  var objCallbacks = this.getCallbackInfo(iID);
	  if ( objCallbacks != null ) {
	    for ( var i=0; i<objCallbacks.callbackfunctions.length; i++ ) {
	      if ( objCallbacks.callbackfunctions[i].objScope == objScope &&
	           objCallbacks.callbackfunctions[i].fnCallback == fnCallback ) {
	        	        objCallbacks.callbackfunctions.splice(i,1);
	      }
	    }
	    if ( objCallbacks.callbackfunctions.length == 0 && 
	         objCallbacks.jseval == '' )
	      this.removeEvent(obj, sEvent);
	  }
	};
	
	
	
	YSEventHandler.prototype.removeEvent = function (obj, sEvent) {
	  var iID = YSDOM.getElementAttribute(obj, sEvent+'_EventHandlerID');
	  if ( this.getCallbackInfo(iID) != null )
  	  delete this.aoCallbacks[iID];
	  eval('obj.'+sEvent+' = null;');
	  YSDOM.setElementAttribute(obj, sEvent+'_EventHandlerID', '');
	};
	
	
	
	YSEventHandler.prototype.callbackExists = function (oCallback, iEventHandlerID) {
	  var aFunctions = this.aoCallbacks[iEventHandlerID].callbackfunctions;
	  for ( var i=0; i<aFunctions.length; i++ ) {
	    if ( aFunctions[i].fnCallback == oCallback.fnCallback &&
	         aFunctions[i].objScope   == oCallback.objScope )
	      return i;
	  }
	  return -1;
	};
	
	
	
	YSEventHandler.prototype.getCallbackInfo = function (iEventHandlerID) {
		return this.aoCallbacks[iEventHandlerID] || null;
	};
	
	
	
	YSEventHandler.prototype.handleEvent = function(e, sEvent) {
				var iID = YSNumbers.checkInt(YSDOM.getElementAttribute(this, sEvent+'_EventHandlerID'));
		var oCallbackInfo = YSEventHandler.Instance().getCallbackInfo(iID);
		if ( oCallbackInfo != null ) {
						if ( oCallbackInfo.jseval ) eval(oCallbackInfo.jseval);
			var oReturn = oCallbackInfo.returnvalue;
						var aFunctions = oCallbackInfo.callbackfunctions;
			for ( var i=0; i<aFunctions.length; i++ ) {
				var oFuncReturn = aFunctions[i].fnCallback.call(
				  aFunctions[i].objScope, YSEvent.getEvent(e), this);
								if ( oFuncReturn != undefined )
					if ( oReturn == null ) oReturn = oFuncReturn;
					else if ( oCallbackInfo.returnvalue == null ) 
					 oReturn = oReturn && oFuncReturn;
			}
						if ( oReturn != null ) return oReturn;
		}
	};
  
   
  var bIE = document.all ? true : false;
  
  var bPageLoaded = false;
  
  var bSubmitting = false;
  
  var DEBUG_MODE = false;
  
  var BASE_PATH = '';
  
  
  
  window.onerror = function(sMsg, sURL, iLineNr) {
    YSLog.writeText('JS Error: '+sMsg+' in '+sURL+' on line '+iLineNr);
    return !DEBUG_MODE;
  };
  
  
  
  function getClassName(obj) {
    if (typeof obj != "object" || obj == null) 
      return typeof obj;
    return /(\w+)\(/.exec(obj.constructor.toString())[1];
  }
  
  
  
  function instanceOf(object, constructor) {    
    while (object != null) {       
      if (object == constructor.prototype)          
        return true;       
      object = object.__proto__;    
    }    
    return false; 
  }
  
  
  
  function isDefined(variable, bGlobal) {
    if ( String(typeof bGlobal) == 'undefined' ) bGlobal = false;
    if (typeof variable == 'string' && bGlobal) variable = window[variable];
    return (String(typeof variable) != 'undefined');
  }

  
  function YSJS() {
    this.aLoaded = {};
  }
  
  
  
  YSJS.prototype.isLoaded = function(sID) {
    return this.aLoaded[sID] == 1;
  };
  
  
  
  YSJS.prototype.load = function(sID, sSrcLocation, oReturnFunction, oParam) {
    if ( !isDefined(oParam) ) oParam = null;
    if ( !isDefined(oReturnFunction) ) oReturnFunction = null;
    this.aLoaded[sID] = 0;
    YSLog.write('loadJS: '+sSrcLocation);
    
    var oJS = document.createElement('script');
    oJS.setAttribute('type', 'text/javascript');
    oJS.setAttribute('src', sSrcLocation);
    oJS.onreadystatechange = function() {
      if ( this.readyState.toLowerCase() == 'loaded' ||
           this.readyState.toLowerCase() == 'complete' ) {
        YSJS.aLoaded[sID] = 1;
        if ( oReturnFunction != null )
          oReturnFunction.fn.call(oReturnFunction.obj, sID, oParam);
      }
    };
    oJS.onload = function() { 
      YSJS.aLoaded[sID] = 1;
      if ( oReturnFunction != null )
        oReturnFunction.fn.call(oReturnFunction.obj, sID, oParam);      
    };
    document.body.appendChild(oJS);
  };
  
  
  
  var YSJS = new YSJS();
  var YSList = {}; 
  
  YSList.clear = function(aArray) {
    for (var sIndex in aArray)
      aArray[sIndex] = null;
  };
  
  
  
  YSList.count = function(aArray) {
    var iCount = aArray.length;
    var bAssoc = false;
    for ( var sIndex in aArray ) {
      if ( iCount == 0 ) bAssoc = true;
      break;
    }
    if ( bAssoc ) for ( var sIndex in aArray ) iCount++;
    
    return iCount;
  };
  
  
  
  YSList.exists = function(aArray, value) {
    for (var iIndex in aArray) 
      if ( aArray[iIndex] == value ) return true;
    return false;
  };
  
  
  
  YSList.getLast = function(aArray) {
    if ( YSList.isArray(aArray) ) {
      if ( aArray.length > 0 )
        return aArray[aArray.length-1];
    }
    return null;
  };
  
  
  
  YSList.isArray = function(obj) {
    if ( !obj ) return false;
    if ( String(obj.constructor).toLowerCase().indexOf("array") != -1 ||
         (typeof obj).toLowerCase() == 'array' )
      return true;
    return false;
  };
  
  
  
  YSList.toParamString = function(aArray, sParamName) {
    if ( !isDefined(sParamName) ) sParamName = '';
    var sParamString = '';
    for (var sIndex in aArray)
      sParamString += '&' + sParamName+sIndex + '=' + YSString.encodeHtml(aArray[sIndex]);
    return sParamString.substring(1);
  };
  
  
  
  YSList.toSource = function(aArray) {
    var sArray = '';
    var bAssoc = true;
    if ( isDefined(aArray[0]) ) bAssoc = false;
    
    for (var iIndex in aArray) {
      if ( bAssoc ) {
        sArray += ','+iIndex+':'+YSString.valueToString(aArray[iIndex]);
      }
      else {
        sArray += ','+YSString.valueToString(aArray[iIndex]);
      }
    }
    
    if ( sArray.length == 0 ) return '[]';
    else {
      if ( bAssoc ) sArray = '{'+sArray.substring(1)+'}';
      else sArray = '['+sArray.substring(1)+']';
      return sArray;
    }
  };
  
  
  
  YSList.toString = function(aArray) {
    if ( !((typeof aArray).toLowerCase() == 'array' || 
           (typeof aArray).toLowerCase() == 'object') )
      return aArray;  
    var sArray = '';
    for (var sIndex in aArray)
      sArray += ',<br /> ' + sIndex + ' => ' + YSList.toString(aArray[sIndex]);
    sArray = '['+sArray.substring(8)+']';
    return sArray;
  };
  
  
  var YSNumbers = {}; 
  
  YSNumbers.checkInt = function(i) {
    var iReturn = parseInt(i);
    if ( isNaN(iReturn) ) iReturn = 0;
    return iReturn;
  };
  
  
  
  YSNumbers.checkFloat = function(f) {
    var fReturn = parseFloat(f);
    if ( isNaN(fReturn) ) fReturn = 0.0;
    return fReturn;
  };
  
  
  
  YSNumbers.dec2hex = function(iNumber) {
    return YSNumbers.checkInt(iNumber).toString(16);
  };
  
  
  
  YSNumbers.degToRad = function(fDeg) {
    return fDeg * Math.PI / 180;
  };
  
  
  
  YSNumbers.hex2dec = function(sNumber) {
    var iNumber = parseInt(sNumber,16);
    if ( isNaN(iNumber) ) return 0;
    else return iNumber;
  };
  
  
  
  YSNumbers.isNumeric = function(sNumber) {
    return YSNumbers.checkFloat(sNumber) == sNumber && sNumber != '';
  };
  
  
  
  YSNumbers.padDigits = function(iNumber, iTotalDigits) { 
    var sNumber = iNumber.toString(); 
    while (sNumber.length < iTotalDigits) 
      sNumber = '0' + sNumber;
    return sNumber;
  };
  
  
  
  YSNumbers.radToDeg = function(fRad) {
    return fRad * 180 / Math.PI;
  };
  
  
  
  YSNumbers.roundNumber = function(fNumber, iPrecision, bAsFloat) {
    if ( !isDefined(iPrecision) )  iPrecision = -1;
    if ( !isDefined(bAsFloat) ) bAsFloat = true;
    
    if ( iPrecision >= 0 ) {
      var sNumber = YSNumbers.checkFloat(fNumber).toFixed(iPrecision);      
      return bAsFloat ? YSNumbers.checkFloat(sNumber) : sNumber;
    }
    else return bAsFloat ? YSNumbers.checkFloat(fNumber) : String(fNumber);
  };
  var YSString = {}; 
  
  YSString.addSlashes = function(sString, aSlashStrings) {
    for (var iIndex in aSlashStrings) {
      sReplace = '/\\'+aSlashStrings[iIndex]+'/g';
      sReplacement = '\\\\'+aSlashStrings[iIndex];
      sString = eval("sString.replace(/"+sReplace+"/g, '"+sReplacement+"');");
    }
    return sString;
  };
    
  
  
  YSString.encodeHtml = function(sHTML) {
    if ( YSUTF8.bUseUTF8) return encodeURIComponent(sHTML);
    else {
      sHTML = escape(sHTML);
      sHTML = sYSDOM.replace(/%u20AC/g, "%80");
      sHTML = sYSDOM.replace(/\//g, "%2F");
      sHTML = sYSDOM.replace(/\+/g, '%2B');
      sHTML = sYSDOM.replace(/@/g, "%40");      
      return sHTML;
    }
  };
  
  
  
  YSString.getFunctionString = function(obj, sFunction) {
    if ( (typeof obj).toLowerCase() == 'function' ) fnFunction = obj;
    else if ( !obj ) fnFunction = window[sFunction];
    else fnFunction = obj[sFunction];
    
    if ( !isDefined(fnFunction) ) return '';
    var sFunction = String(fnFunction);
    if (isDefined(sFunction))
      sFunction = sFunction.substring(sFunction.indexOf('{')+1,
                                      sFunction.lastIndexOf('}')-1);
    else sFunction = '';
    return sFunction.trim();
  };
  
  
  
  YSString.getJSCall = function(sFunctionName, aParams) {
    var sJSCall = sFunctionName+'(';
    for (var i=0; i<aParams.length; i++) {
      sJSCall += YSString.valueToString(aParams[i]);
      if ( i != aParams.length-1 ) sJSCall += ',';
    }
    sJSCall += ');';
    return sJSCall;
  };
  
  
  
  YSString.htmlEntities = function(sString) {
    var aChars = new Array (38,224,225,226,227,228,229,230,231,232,233,234,235,236,
                            237,238,239,240,241,242,243,244,245,246,248,249,250,251,
                            252,253,254,255,192,193,194,195,196,197,198,199,200,201,
                            202,203,204,205,206,207,208,209,210,211,212,213,214,216,
                            217,218,219,220,221,222,8364,34,223,60,62,162,163,164,165,
                            166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,
                            181,182,183,184,185,186,187,188,189,190);
  
    var aEntities = new Array ('amp','agrave','aacute','acirc','atilde','auml','aring',
                              'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',
                              'iacute','icirc','iuml','eth','ntilde','ograve','oacute',
                              'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',
                              'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',
                              'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',
                              'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',
                              'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',
                              'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',
                              'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',
                              'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',
                              'sup2','sup3','acute','micro','para','middot','cedil','sup1',
                              'ordm','raquo','frac14','frac12','frac34');
    for (var i=0; i<aChars.length; i++) {
      var iStart = 0;
      var iPos = -1;
      while ((iPos = sString.indexOf(String.fromCharCode(aChars[i]), iStart)) != -1) {
        sString = sString.substr(0,iPos) + '&' + aEntities[i] + ';' + sString.substr(iPos+1);
        iStart = iPos + aEntities[i].length +2;
      }
    }
    return sString;
  };
  
  
  
  YSString.isString = function(s) {
    return (typeof s).toLowerCase() == 'string';
  };
  
  
  
  YSString.trim = function(s) {
    var sString = s.replace(/^\s+/g, "");    return sString.replace(/\s+$/g, "");  };
  
  
  
  String.prototype.trim = function() {
    return YSString.trim(this);    
  };

  
  
  YSString.ucfirst = function(sString) {
    var sFirstChar = sString.substr(0,1);
    return sFirstChar.toUpperCase() + sString.substring(1);
  };
  
  
  
  YSString.valueToString = function(oValue) {
    var sParam = '';
    if ( !isDefined(oValue) ) sParam = 'undefined';
    else if ( oValue == null ) sParam = 'null'; 
    else if ( YSList.isArray(oValue) || (typeof oValue).toLowerCase() == 'object' ) 
      sParam = YSList.toSource(oValue);
    else if ( YSNumbers.isNumeric(oValue) || oValue == 'this' || oValue == 'event' ) 
      sParam = oValue;
    else if ( oValue == true || oValue == false )
      sParam = String(oValue);
    else {
      sParam = "'"+oValue.replace(/'/g,'\\\'')+"'";
    }
    return String(sParam);
  };

  YSTimeout.iLastID = 1;
  YSTimeout.aTimeouts = {};

  
  function YSTimeout(iMS, fnCaller, objCaller, oParam, bInterval) {
    if ( !isDefined(objCaller) ) objCaller = window;
    if ( !isDefined(oParam) ) oParam = null;
    if ( !isDefined(bInterval) ) bInterval = false;
    
    this.iID = YSTimeout.iLastID++;
    YSTimeout.aTimeouts['TO_'+this.iID] = {objCaller: objCaller,
                                           fnCaller: fnCaller,
                                           oParam: oParam,
                                           bInterval: bInterval,
                                           iStartTime: YSDateTime.getCurTime()};
    var sCall = "YSTimeout.prototype.timeoutPassed.call(window, "+this.iID+");";
    if ( bInterval )
      YSTimeout.aTimeouts['TO_'+this.iID].iTimeoutID = setInterval(sCall, iMS);
    else
      YSTimeout.aTimeouts['TO_'+this.iID].iTimeoutID = setTimeout(sCall, iMS);
  }
  
  
  
  YSTimeout.prototype.cancelTimeout = function() {
    var oTimeout = YSTimeout.aTimeouts['TO_'+this.iID];
    if ( oTimeout.bInterval ) clearInterval(oTimeout.iTimeoutID);
    else clearTimeout(oTimeout.iTimeoutID);
    delete YSTimeout.aTimeouts['TO_'+this.iID];
  };
  
  
  
  YSTimeout.prototype.timeoutPassed = function(iID) {
    var oCaller = YSTimeout.aTimeouts['TO_'+iID];
    oCaller.fnCaller.call(oCaller.objCaller, oCaller.oParam, 
      YSDateTime.getCurTime()-oCaller.iStartTime);
    if ( !oCaller.bInterval ) delete YSTimeout.aTimeouts['TO_'+iID];
  };

  var YSTinyMCE = {};   
  YSTinyMCE.bInitialized = false;
  YSTinyMCE.ROOT_PATH = '../../../../images/';
  YSTinyMCE.TINYMCE_PATH = 'TinyMCE/';
  
  
  YSTinyMCE.addControl = function(sID) {
    tinyMCE.execCommand('mceAddControl', true, sID);
  };
  
  
  
  YSTinyMCE.initTinyMCE = function(oSettings) {
    if ( !YSTinyMCE.bInitialized ) {
      YSTinyMCE.bInitialized = true;
      if ( !isDefined(oSettings) ) oSettings = {};
      var oDefaultSettings = {
        mode : "none",
        theme : "advanced",
        theme_advanced_buttons1 : "bold,italic,underline,"+
                                  "separator,bullist,numlist,"+
                                  "separator,undo,redo,"+
                                  "separator,link,unlink,"+
                                  "separator,paste",
        theme_advanced_buttons2 : "",
        theme_advanced_buttons3 : "",
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        language : "nl",
        content_css : BASE_PATH+"styles/layout.css",
        body_class : "mceContentBody",
        paste_auto_cleanup_on_paste : true,
        extended_valid_elements: "hr[class|width|size|noshade],"+
                                 "font[face|size|color|style],"+
                                 "span[class|align|style],"+
                                 "li[class,style],ul[class,style],"+
                                 "script[charset|defer|language|src|type],"+
                                 "object[width|height],"+
                                 "param[name|value],"+
                                 "embed[src|type|wmode|width|height]," +
                                 "iframe[width|height|frameborder|scrolling|"+
                                        "marginheight|marginwidth|src]",
        paste_use_dialog : false,
        paste_strip_class_attributes : "all",
        force_p_newlines : true,
        entity_encoding: "raw",
        custom_undo_redo_levels : 10
      };
      for (sIndex in oSettings)
        oDefaultSettings[sIndex] = oSettings[sIndex];
      tinyMCE.init(oDefaultSettings);
    }  
  };
  
  
  
  YSTinyMCE.isIMLoaded = function() {
    return YSJS.isLoaded('tinymceIM');
  };  
  
  
  
  YSTinyMCE.isLoaded = function() {
    return YSJS.isLoaded('tinymce');
  };
  
  
  
  YSTinyMCE.load = function(fn, obj, oParam) {
    if ( !YSTinyMCE.isLoaded() ) {
      YSJS.load('tinymce', BASE_PATH+'scripts/'+YSTinyMCE.TINYMCE_PATH+
                           'tiny_mce.js', 
        {fn: fn, obj: obj}, oParam);
    }
    else fn.call(obj, 'tinymce', oParam);
  };
    
  
  
  YSTinyMCE.loadIM = function(fn, obj, oParam) {
    if ( !YSTinyMCE.isIMLoaded() ) {
      YSJS.load('tinymceIM', BASE_PATH+'scripts/'+YSTinyMCE.TINYMCE_PATH+
                             'plugins/imagemanager/js/mcimagemanager.js', 
        {fn: fn, obj: obj}, oParam);
    }
    else fn.call(obj, 'tinymceIM', oParam);
  };
  
  
  
  var YSUTF8 = {};   
  
  YSUTF8.bUseUTF8 = true;
  
	
	
	YSUTF8.encode = function(sString) {
	  sString = sString.toString();
 	  sString = sString.replace(/\r\n/g,"\n");
		var sUTF8 = "";

		for (var i=0; i<sString.length; i++) {
			var c = sString.charCodeAt(i);
			if (c < 128) {
				sUTF8 += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				sUTF8 += String.fromCharCode((c >> 6) | 192);
				sUTF8 += String.fromCharCode((c & 63) | 128);
			}
			else {
				sUTF8 += String.fromCharCode((c >> 12) | 224);
				sUTF8 += String.fromCharCode(((c >> 6) & 63) | 128);
				sUTF8 += String.fromCharCode((c & 63) | 128);
			}
		}

		return sUTF8;
	};

	
	
	YSUTF8.decode = function(sUTF8) {
		var sReturn = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while (i<sYSUTF8.length) {
			c = sYSUTF8.charCodeAt(i);
			if (c < 128) {
				sReturn += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = sYSUTF8.charCodeAt(i+1);
				sReturn += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = sYSUTF8.charCodeAt(i+1);
				c3 = sYSUTF8.charCodeAt(i+2);
				sReturn += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}

		return sReturn;
	};
  var YSXML = {}; 
  
  YSXML.getAttribute = function(xmlNode, sAttribute) {
    if ( !xmlNode ) return null;
            if ( typeof xmlNode.getAttribute != 'undefined' ) 
      return xmlNode.getAttribute(sAttribute);
    else return xmlNode[sAttribute];
  };
  

  
  YSXML.getChildAttribute = function(xmlParent, sChildNodeName, sAttribute) {
    var sText = '';
    var xmlChilds = xmlParent.getElementsByTagName(sChildNodeName);
    if ( xmlChilds && xmlChilds.length > 0 ) {
      sText = YSXML.getAttribute(xmlChilds[0], sAttribute);
    }
    return YSString.trim(sText);
  };
  
  
  
  YSXML.getChildData = function(xmlParent, sChildNodeName) {
    var sData = '';  
    var xmlChilds = xmlParent.getElementsByTagName(sChildNodeName);
    if ( xmlChilds && xmlChilds.length > 0 ) {
      sData = YSXML.getData(xmlChilds[0]);        
    }
    return YSString.trim(sData);
  };
  
  
  
  YSXML.getChildText = function(xmlParent, sChildNodeName) {
    var sText = '';
    var xmlChilds = xmlParent.getElementsByTagName(sChildNodeName);
    if ( xmlChilds && xmlChilds.length > 0 )
      sText = YSXML.getText(xmlChilds[0]);
    return YSString.trim(sText);
  };
  
  
  
  YSXML.getData = function(xmlNode) {
    var sData = '';
    try {
      if ( xmlNode.text ) 
        sData = xmlNode.text;
      else if ( xmlNode.textContent )
        sData = xmlNode.textContent;
      else if ( xmlNode.childNodes && 
                xmlNode.childNodes.length > 0 && 
                xmlNode.childNodes[0].nodeValue )
        sData = xmlNode.childNodes[0].nodeValue;
    } catch(e) {}
    return YSString.trim(sData);
  };
  
  
  
  YSXML.getText = function(xmlNode) {
    if ( xmlNode.firstChild ) return YSString.trim(xmlNode.firstChild.data);
    else return '';
  };
  
  
  
  YSXML.setAttribute = function(xmlNode, sAttribute, sValue) {
    if ( !xmlNode ) return;
    if ( xmlNode.setAttribute ) xmlNode.setAttribute(sAttribute, sValue);
    else xmlNode[sAttribute] = sValue;
  };

  
  function YSMouseMoveEvent() {
                    this.aElementRegister = {};    
        this.iLastKeyGiven = 1;
  }
  
    YSMouseMoveEvent.Me = null;
  
  
  
  YSMouseMoveEvent.Instance = function() {
    if ( YSMouseMoveEvent.Me == null ) 
      YSMouseMoveEvent.Me = new YSMouseMoveEvent();
    return YSMouseMoveEvent.Me;
  };
  
  
  
  YSMouseMoveEvent.prototype.registerElement = 
    function (eElement, iMaxFreq, fnCallback, objCallback) {
      if ( eElement == null || fnCallback == null ) return;
            if ( !isDefined(objCallback) || objCallback == null ) 
        objCallback = window;
        
      var sID = YSDOM.getElementAttribute(eElement, 'MouseMoveID');
      if ( !sID || !isDefined(this.aElementRegister[sID]) ) {   
                sID = 'genMoveID_'+this.iLastKeyGiven++;
        YSDOM.setElementAttribute(eElement, 'MouseMoveID', sID);
      }
      else {         var oReg = this.aElementRegister[sID];
        YSEventHandler.Instance().removeHandler(oReg.element, 'onmousemove', 
          YSMouseMoveEvent.prototype.mouseMoved, this);
        this.aElementRegister[sID] = null;
      }
      
            this.aElementRegister[sID] = {obj: objCallback, fn: fnCallback, 
                                    maxfreq: iMaxFreq, lastmovetime: 0, 
                                    timeout: null, element: eElement};
      YSEventHandler.Instance().addHandler(eElement, 'onmousemove', 
        YSMouseMoveEvent.prototype.mouseMoved, this);
    };
    
  
  
  YSMouseMoveEvent.prototype.removeElement = function (eElement) {
    var sID = YSDOM.getElementAttribute(eElement, 'MouseMoveID');
    if ( sID ) {
      var oReg = this.aElementRegister[sID];
      if ( oReg ) {
        if ( oReg.timeout != null )
          clearTimeout(oReg.timeout);
        YSEventHandler.Instance().removeHandler(oReg.element, 'onmousemove',
          YSMouseMoveEvent.prototype.mouseMoved, this);
        oReg = null;
        delete this.aElementRegister[sID];
      }
    }
  };
   
   
   
  YSMouseMoveEvent.prototype.isInTimeout = function (eElement) {
    var sID = YSDOM.getElementAttribute(eElement, 'MouseMoveID');
    if ( sID && isDefined(this.aElementRegister[sID]) ) {
      return this.aElementRegister[sID].timeout != null;
    }
    return false;
  };
  
  
  
  YSMouseMoveEvent.prototype.mouseMoved = function(e, obj, oPos, sID) {
        if ( !isDefined(sID) ) {
      sID = YSDOM.getElementAttribute(obj, 'MouseMoveID');
    }
    var oReg = this.aElementRegister[sID];
    if ( isDefined(oReg) ) {
            if ( !isDefined(oPos) ) {
                if ( oReg.timeout != null ) clearTimeout(oReg.timeout);
        
        oPos = YSEvent.getGlobalMousePosition(e);
                if ( YSDateTime.getCurTime() - oReg.lastmovetime < oReg.maxfreq ) {
          oReg.timeout = setTimeout(
            YSString.getJSCall('YSMouseMoveEvent.Instance().mouseMoved', [null, null, oPos, sID]), 
            oReg.maxfreq);
          return true;
        }
      }

            oReg.timeout = null;
      oReg.lastmovetime = YSDateTime.getCurTime();
            
            oReg.fn.call(oReg.obj, oReg.element, oPos);      
    }
  };

  
  function YSMoveElement() {
    this.iLastID = 1;
    this.aCheckCodes = new Array();
    this.aCouples = new Array();
    this.bMoving = false;
    this.sMovingID = null;
    this.oMoveStartPos = {top:0, left:0};
  }
  
  
  
  YSMoveElement.prototype.setDraggable = function(objMove, objEvent, sCheckCode) {
        objMove = YSDOM.getObj(objMove);
    objEvent = YSDOM.getObj(objEvent);
    if ( !objMove || !objEvent ) return;
    
        if ( YSCSS.getStyle(objMove, 'position') != 'absolute' ) {  
      var oCurPos = YSDOM.getElementPosition(objMove);
      var iWidth  = YSCSS.getStyle(objMove, 'width', true);
      var iHeight = YSCSS.getStyle(objMove, 'height', true);
      var objReplace = document.createElement('div');
      YSCSS.setMultiStyle(objReplace, ['width', 'height'], 
        [iWidth+'px', iHeight+'px']);
      YSCSS.setMultiStyle(objMove, ['position', 'top', 'left', 'width', 'height'], 
        ['absolute', oCurPos.top+'px', oCurPos.left+'px', iWidth+'px', iHeight+'px']); 
      YSDOM.replaceElement(objMove, objReplace);
      document.body.appendChild(objMove);
    }
    
    
        if (!objEvent.id) objEvent.id = 'MovingElement_'+this.iLastID++;
    this.aCheckCodes[objEvent.id] = isDefined(sCheckCode) ? sCheckCode : null;
    this.aCouples[objEvent.id] = objMove;
    if ( objEvent.tagName.toLowerCase() == 'form' ) {
      var aFieldsets = objEvent.getElementsByTagName('fieldset');
      for (var i=0; i<aFieldsets.length; i++)
        YSCSS.setStyle(aFieldsets[i], 'cursor', 'move');
    }
    YSCSS.setStyle(objEvent, 'cursor', 'move'); 
    
        YSEventHandler.Instance().addHandler(objEvent, 'onmousedown', 
      YSMoveElement.elementMouseDown, this); 
    YSMouseMoveEvent.Instance().registerElement(document.documentElement, 20,
      YSMoveElement.documentMouseMove, this);
    YSEventHandler.Instance().addHandler(document.documentElement, 'onmouseup', 
      YSMoveElement.documentMouseUp, this);    
  };
  
  
  
  YSMoveElement.prototype.elementMouseDown = function(e, objEvent) {
        if ( this.aCheckCodes[objEvent.id] && 
         !eval(this.aCheckCodes[objEvent.id]))
      return true;
       
    var oMousePos = YSEvent.getGlobalMousePosition(e);
    var oElementPos = YSDOM.getElementPosition(this.aCouples[objEvent.id]);
    if (oElementPos.top != 0 && oElementPos.left != 0) {
      this.oMoveStartPos.top  = oMousePos.top  - oElementPos.top;
      this.oMoveStartPos.left = oMousePos.left - oElementPos.left;
    }
    else this.oMoveStartPos = {top:0,left:0};
    this.bMoving = true;
    this.sMovingID = objEvent.id;
    if (bIE) document.onselectstart = new Function("return false"); 
    else return false;
  };
  
  
  
  YSMoveElement.prototype.documentMouseMove = function(eElement, oPos) {
    if ( this.bMoving ) {
      YSCSS.setMultiStyle(this.aCouples[this.sMovingID], 
        ['top', 'left'],
        [(oPos.top - this.oMoveStartPos.top) + 'px', 
         (oPos.left - this.oMoveStartPos.left) + 'px']);
    }
  };
    
  
  
  YSMoveElement.prototype.documentMouseUp = function(e, objEvent) {
    this.bMoving = false;
    this.sMovingID = null;
    if ( bIE ) document.onselectstart = new Function("return true"); 
    else return true;
  };
  
  
  var YSMoveElement = new YSMoveElement();
  var YSDebug = {};   
  
  YSDebug.print_r = function(obj, bReturn) {
    if ( bReturn ) return "";
  };

  var YSLog = {write: function() {}, writeText: function() {}};

