//size {width: height:}
//pos {top: left:}
//dim {top: left: bottom: right:}  //es nem top left width height

//fuggosegek: 
if (typeof BROWSERDETECT == "undefined") {
  alert("(USEFUL) BROWSERDETECT include missing");
}
//tobbszoros include:
if (typeof USEFUL != "undefined") {
//  alert("USEFUL multiple insert!");
}
USEFUL=true;

////////////clip fuggvenyek
var cssCompat=false;
if (document.compatMode == 'CSS1Compat') {
  cssCompat=true;
}
//alert(cssCompat);
//clip torlese
function resetClip(layer) {
  clip = {top: 0, left: 0, right: 0, bottom: 0};
  clip.right = getWidth(layer);
  clip.bottom = getHeight(layer);
  clipTo(layer,clip);
}
//aktualis clip
function getClip(layer) {
  clip = {top: 0, left: 0, right: 0, bottom: 0};
  //  alert(this.layerNode.style.clip);
  clipv = layer.style.clip.split("rect(")[1].split(")")[0].split("px");
  if (nsDOM) {
    clipv[1] = clipv[1].substring(1,clipv[1].length);
    clipv[2] = clipv[2].substring(1,clipv[2].length);
    clipv[3] = clipv[3].substring(1,clipv[3].length);
  }
  clip.top = parseInt(clipv[0]);
  clip.right = parseInt(clipv[1]);
  clip.bottom = parseInt(clipv[2]);
  clip.left = parseInt(clipv[3]);
  return clip;
}
//clip
function clipTo(layer,clip) {
  layer.style.clip = "rect("+clip.top+"px "+clip.right+"px "+clip.bottom+"px "+clip.left+"px)";
}

//clip
function clipBy(layer,clip) {
  oldClip = getClip(layer);
  layer.style.clip = "rect("+(oldClip.top+clip.top)+"px "
    +(oldClip.right+clip.right)+"px "
    +(oldClip.bottom+clip.bottom)+"px "
    +(oldClip.left+clip.left)+"px)";
}

///////////////////////////////////////////meret fuggvenyek
// M B P [content] P B M
function getContentWidth(node) {
//  var value="";
  //Opera miatt, getStyle width-re is padding as border ertekkel novelt erteket ad vissza :(
  return getContentPaddingWidth(node)-getStyle(node,"padding-left",true)-getStyle(node,"padding-right",true);
//  value=getStyle(node,"width",true);
//mindnel padding es border is benne van az offset-ben
//  value=node.offsetWidth;
//  return value;
}
function getContentHeight(node) {
//  var value="";
  
  return getContentPaddingHeight(node)-getStyle(node,"padding-top",true)-getStyle(node,"padding-bottom",true);
//  if (nsDOM) {
//    value=getStyle(node,"height",true);
//  } else {
//    value=node.offsetHeight;
//  }
//  return value;
}
// M B [P content P] B M
function getContentPaddingWidth(node) {
  return getContentBorderWidth(node)-getStyle(node,"border-left-width",true)-getStyle(node,"border-right-width",true);
//  return getContentWidth(node)+getStyle(node,"padding-left",true)+getStyle(node,"padding-right",true);
}
function getContentPaddingHeight(node) {
  return getContentBorderHeight(node)-getStyle(node,"border-top-width",true)-getStyle(node,"border-bottom-width",true);
//  return getContentHeight(node)+getStyle(node,"padding-top",true)+getStyle(node,"padding-bottom",true);
}
// M [B P content P B] M
function getContentBorderWidth(node) {
//  return getContentPaddingWidth(node)+getStyle(node,"border-left-width",true)+getStyle(node,"border-right-width",true);
  if (operaDOM) {
    //nem mindig jo az offsetWidth: absolute eseten jo
    var width=0;
    var position=node.style.position;
    node.style.position="absolute";
    width=node.offsetWidth;
    node.style.position=position;
    return width;
//    return getStyle(node,"width",true);
  } else {
    return node.offsetWidth;
  }
}
function getContentBorderHeight(node) {
//  return getContentPaddingHeight(node)+getStyle(node,"border-top-width",true)+getStyle(node,"border-bottom-width",true);
  if (operaDOM) {
    //nem mindig jo az offsetHeight: absolute eseten jo
    var height=0;
    var position=node.style.position;
    node.style.position="absolute";
    height=node.offsetHeight;
    node.style.position=position;
    return height;
//    return getStyle(node,"height",true);
  } else {
    return node.offsetHeight;  
  }
}
// [M B P content P B M]
function getContentMarginWidth(node) {
  return getContentBorderWidth(node)+getStyle(node,"margin-left",true)+getStyle(node,"margin-right",true);
}
function getContentMarginHeight(node) {
  return getContentBorderHeight(node)+getStyle(node,"margin-top",true)+getStyle(node,"margin-bottom",true);
}

function getWidth(node) {
  //6278D008
  return getContentWidth(node);
}
function getHeight(node) {
  return getContentHeight(node);
}

//marginos meret
function getSizeMargin(node) {
  return {width: getContentMarginWidth(node), height: getContentMarginHeight(node)};
}

//borderes meret
function getSizeBorder(node) {
  return {width: getContentBorderWidth(node), height: getContentBorderHeight(node)};
}

//paddingos meret
function getSizePadding(node) {
  return {width: getContentPaddingWidth(node), height: getContentPaddingHeight(node)};
}

//contentes meret
function getSizeContent(node) {
  return {width: getContentWidth(node), height: getContentHeight(node)};
}



//ez magadja a negy sarok koordinatait
//border szerinti merettel es pozicioval dolgozik
function getDim(node) {
  var dim={top: 0, left: 0, right: 0, bottom: 0};
  var pos=getPosBorder(node);
  dim.top=pos.top;
  dim.left=pos.left;
  dim.right=dim.left+getContentBorderWidth(node);
  dim.bottom=dim.top+getContentBorderHeight(node);
  return dim;
}

//ez eleg furcsa, mert pos a box-ra vonatkozik, size meg content-re
//dimenzio beallitas
function setDim(node,dim) {
  node.style.top=dim.top+"px";
  node.style.left=dim.left+"px";
  node.style.width=dim.right - dim.left+"px";
  node.style.height=dim.bottom - dim.top+"px";
}

//size a margin meretet adja meg
function setSizeMargin(node,size) {
  size.width-=getStyle(node,"margin-left",true)+getStyle(node,"margin-right",true);
  size.height-=getStyle(node,"margin-top",true)+getStyle(node,"margin-bottom",true);
  setSizeBorder(node,size);
}

//size a border meretet adja meg
function setSizeBorder(node,size) {
  size.width-=getStyle(node,"border-left-width",true)+getStyle(node,"border-right-width",true);
  size.height-=getStyle(node,"border-top-width",true)+getStyle(node,"border-bottom-width",true);
  setSizePadding(node,size);
}

//size a padding meretet adja meg
function setSizePadding(node,size) {
  size.width-=getStyle(node,"padding-left",true)+getStyle(node,"padding-right",true);
  size.height-=getStyle(node,"padding-top",true)+getStyle(node,"padding-bottom",true);
  setSizeContent(node,size);
}

//size a content meretet adja meg
function setSizeContent(node,size) {
  setSize(node,size);
}


//meret beallitas content-re
//ez a content meretet allitja be
function setSize(node,size) {
  setWidth(node,size.width);
  setHeight(node,size.height);
}


//width a margin meretet adja meg
function setWidthMargin(node,width) {
  width-=getStyle(node,"margin-left",true)+getStyle(node,"margin-right",true);
  setWidthBorder(node,width);
}

//width a border meretet adja meg
function setWidthBorder(node,width) {
  width-=getStyle(node,"border-left-width",true)+getStyle(node,"border-right-width",true);
  setWidthPadding(node,width);
}

//width a padding meretet adja meg
function setWidthPadding(node,width) {
  width-=getStyle(node,"padding-left",true)+getStyle(node,"padding-right",true);
  setWidthContent(node,width);
}

//size a content meretet adja meg
function setWidthContent(node,width) {
  setWidth(node,width);
}

//content meret box model szerint
function setWidth(node,width) {
  //ha textarea es cssCompat false es nsDOM, akkor nem jol csinalja (border+padding is benne van), DIV-re viszont jo!!!????
  //talan display beallitastol fugg????
  if (cssCompat || nsDOM) {    
    //textarea-ra ns nem megy cssCompat false-al csinalja
    node.style.width=width+"px";
  } else {
    //ilyenkor content, padding es border is beleszamit a meretbe!!!
    node.style.width=width+getStyle(node,'padding-left',true)+getStyle(node,'padding-right',true)
      +getStyle(node,'border-left-width',true)+getStyle(node,'border-right-width',true)+"px";
  }
}



//height a margin meretet adja meg
function setHeightMargin(node,height) {
  height-=getStyle(node,"margin-top",true)+getStyle(node,"margin-bottom",true);
  setHeightBorder(node,height);
}

//height a border meretet adja meg
function setHeightBorder(node,height) {
  height-=getStyle(node,"border-top-width",true)+getStyle(node,"border-bottom-width",true);
  setHeightPadding(node,height);
}

//height a padding meretet adja meg
function setHeightPadding(node,height) {
  height-=getStyle(node,"padding-top",true)+getStyle(node,"padding-bottom",true);
  setHeightContent(node,height);
}

//height a content meretet adja meg
function setHeightContent(node,height) {
  setHeight(node,height);
}


//content meret box model szerint
function setHeight(node,height) {
  if (cssCompat || nsDOM) {    
    node.style.height=height+"px";
  } else {
    //ilyenkor content, padding es border is beleszamit a meretbe!!!
    node.style.height=height+getStyle(node,'padding-top',true)+getStyle(node,'padding-bottom',true)
      +getStyle(node,'border-top-width',true)+getStyle(node,'border-bottom-width',true)+"px";
  }
}


//body teljes merete, ablakmerettol fuggetlenul
function getBodySize() {
  var size={width: 0, height: 0};
  /*
  if (nsDOM) {   
    size.width=document.body.offsetWidth;
    size.height=document.body.offsetHeight;
  } else {
    size.width=document.body.scrollWidth;
    size.height=document.body.scrollHeight;
  }
  */
  
//ppk szerint: http://www.quirksmode.org/viewport/compatibility.html   
  if (document.documentElement && document.documentElement.scrollWidth) {
    //strict
    size.width=document.documentElement.scrollWidth;
    size.height=document.documentElement.scrollHeight;
  } 
  if (size.width < document.body.scrollWidth) {
    size.width=document.body.scrollWidth;
  }
  if (size.width < document.body.offsetWidth) {
    size.width=document.body.offsetWidth;
  }
  if (size.height < document.body.scrollHeight) {
    size.height=document.body.scrollHeight;
  }
  if (size.height < document.body.offsetHeight) {
    size.height=document.body.offsetHeight;
  }
      
  return size;
}

//scrollbarok nelkul
//ablak belso merete
function getViewportSize(win) {
  var size={width: 0, height: 0};
  if (win == null) {
    win=window;
  }
  
  if (win.innerHeight) {
    //all except IE
    size.width=win.innerWidth;
    size.height=win.innerHeight;
  } else if (win.document.documentElement && win.document.documentElement.clientHeight) {
    // Explorer 6 Strict Mode 
    size.width=win.document.documentElement.clientWidth;
    size.height=win.document.documentElement.clientHeight;
  } else if (win.document.body) { // other Explorers
    size.width=win.document.body.clientWidth;
    size.height=win.document.body.clientHeight;
  }
  
//  size.width=win.document.body.clientWidth;
//  size.height=win.document.body.clientHeight;
  
  return size;
}
//adott ablak belso dimnenzioi
//tehat az akutalis scrollal modositva
function getViewportDim() {
  var winSize=getViewportSize();
  var winScroll=getScrollPos();

  return {top: winScroll.top, left: winScroll.left, bottom: winScroll.top+winSize.height, right: winScroll.left+winSize.width};
}

//meret lekerdezes
function getSize(node) {
  var size={width: 0, height: 0};
  if (node == document.body) {
    size=getBodySize();
  } else {
    //contentWidth alapjan
    size.width=getContentWidth(node);
    size.height=getContentHeight(node);
  }    
  return size;
}



//ez megadja a bal felso sarok helyet
function getPos_old(node){
  var pos={top: 0, left:0};
  var node=node;
  while(node != null) {
    pos.left+=node.offsetLeft;
    pos.top+=node.offsetTop;
    node=node.offsetParent;
  }
  return pos;
}

function getPosContent(node) {
  var pos=getPosPadding(node);
  pos.top+=getStyle(node,"padding-top",true);
  pos.left+=getStyle(node,"padding-left",true);
  return pos;
}


function getPosPadding(node) {
  var pos=getPosBorder(node);
  pos.top+=getStyle(node,"border-top-width",true);
  pos.left+=getStyle(node,"border-left-width",true);
  return pos;
}


function getPosBorder(oriNode){
  var pos={top: 0, left:0};
  var node=oriNode;
  var absolute=false;
  var i=0;
  var borderTopWidthSum=0;
  var borderLeftWidthSum=0;

  if (node) {
    while(node != null) {
      ++i;
      if (i != 1) {
        //nem az eredeti node-nal vagyunk mar
        borderTopWidthSum+=getStyle(node,"border-top-width",true);
        borderLeftWidthSum+=getStyle(node,"border-left-width",true);
      }
      pos.top+=node.offsetTop;
      pos.left+=node.offsetLeft;
    
//      alert(node.tagName+" "+node.offsetTop+" "+node.offsetLeft);

      //ha div-ben van absolute, akkor a div pozicioja lesz neki az origo, tehat nem kene absolute-nal megallni
      if (getStyle(node,"position") == "abslute") {
        //itt lehetne offset ertekek helyett top es left getStyle is, de akkor meg a margint is hozza kellene adni
        //szoval ez igy gyorsabb es jobb szerintem
        absolute=true;
        node=null;
      } else {
        node=node.offsetParent;
      }
    }
    if (ieDOM || absolute) {
//      pos.left=pos.left-getStyle(oriNode,"margin-left",true)+borderLeftWidthSum;      
//      pos.top=pos.top-getStyle(oriNode,"margin-top",true)+borderTopWidthSum;
      pos.left=pos.left+borderLeftWidthSum;      
      pos.top=pos.top+borderTopWidthSum;
      //IE a max(parent.padding-top,node.margin-top) tavolsagot renderel fuggolegesen (vizszintesnel osszeadodnak)      
      //ezzel nem torodunk, ugy vesszuk, hogy megkapta a node.margin-top tavolsagot
    } else if (nsDOM) {
      //negativ, ha van border, egyszer lejott ezert ketszer hozza kell adni
//      pos.left=pos.left-2*document.body.offsetLeft-getStyle(oriNode,"margin-left",true);
//      pos.top=pos.top-2*document.body.offsetTop-getStyle(oriNode,"margin-top",true);                
      pos.left=pos.left-2*document.body.offsetLeft;
      pos.top=pos.top-2*document.body.offsetTop;                
    } else if (operaDOM) {        
//      alert(pos.top+" "+pos.left);
//      pos.left=pos.left+getStyle(document.body,"border-left-width",true)-getStyle(oriNode,"margin-left",true);
//      pos.top=pos.top+getStyle(document.body,"border-top-width",true)-getStyle(oriNode,"margin-top",true);
      pos.left=pos.left+getStyle(document.body,"border-left-width",true);
      pos.top=pos.top+getStyle(document.body,"border-top-width",true);
      if (oriNode.tagName == "TEXTAREA" && getStyle(oriNode,"position") != "absolute") {
//        alert(getStyle(oriNode,"position"));
        pos.left+=3;
        pos.top+=3;
        //2 table-ben levo textarea-ra meg mindig nem franko teljesen
      }
    }
  }
  return pos;
}

function getPosMargin(node) {
  var pos=getPosBorder(node);
  pos.top-=getStyle(node,"margin-top",true);
  pos.left-=getStyle(node,"margin-left",true);
  return pos;
}

//ez margin poziciojat adja meg, box model szerint
function getPos(node){
  return getPosMargin(node);
}


/*
function getPos2(obj) {
  var pos={top:0 , left:0};
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      pos.left += obj.offsetLeft;
      pos.top += obj.offsetTop;
      obj = obj.offsetParent;
    }
  } else if (obj.x) {
    pos.left += obj.x;
    pos.top += obj.y;
  }
  return pos;
}
*/
//alert(document.compatMode);

//ez megadja a bal felso sarok helyet
/*
function getPos(oriNode){
  var pos={top: 0, left:0};
  var node=oriNode;
  var absolute=false;
  var i=0;
  var borderTopWidthSum=0;
  var borderLeftWidthSum=0;

  if (node) {
    while(node != null) {
      ++i;
      if (i != 1) {
        //nem az eredeti node-nal vagyunk mar
        borderTopWidthSum+=getStyle(node,"border-top-width",true);
        borderLeftWidthSum+=getStyle(node,"border-left-width",true);
      }
      if (getStyle(node,"position") == "absolute") {
        absolute=true;
//        pos.top+=getStyle(node,"top",true);
//        pos.left+=getStyle(node,"left",true);
        pos.top+=node.offsetTop;
        pos.left+=node.offsetLeft;
        alert(node.id+"-"+node.tagName+" abs "+node.offsetLeft+" "+node.offsetTop);
        node=null;
      } else {
        pos.left+=node.offsetLeft;
        pos.top+=node.offsetTop;
        alert(node.id+"-"+node.tagName+" "+node.offsetLeft+" "+node.offsetTop);

        node=node.offsetParent;
      }
    }
    if (ieDOM) {
      //margin collapsing??? http://www.w3.org/TR/CSS21/box.html#collapsing-margins

      pos.left=pos.left-getStyle(oriNode,"margin-left",true)+borderLeftWidthSum;      
      pos.top=pos.top-getStyle(oriNode,"margin-top",true)+borderTopWidthSum;
      //IE a max(parent.padding-top,node.margin-top) tavolsagot renderel fuggolegesen (vizszintesnel osszeadodnak)      
      //ezzel nem torodunk, ugy vesszuk, hogy megkapta a node.margin-top tavolsagot
    } else if (nsDOM) {
      if (absolute == true) {
//        if (i != 1) {
          pos.left=pos.left-getStyle(oriNode,"margin-left",true)+borderLeftWidthSum;
          pos.top=pos.top-getStyle(oriNode,"margin-top",true)+borderTopWidthSum;
//        }
      } else {
        //negativ, ha van border, egyszer lejott ezert ketszer hozza kell adni
        pos.left=pos.left-2*document.body.offsetLeft-getStyle(oriNode,"margin-left",true);
        pos.top=pos.top-2*document.body.offsetTop-getStyle(oriNode,"margin-top",true);                
      }
    } else if (operaDOM) {        
      //ezzel magkapjuk a pontos meretet
      if (absolute == false) {
        pos.left=pos.left+getStyle(document.body,"border-left-width",true)-getStyle(oriNode,"margin-left",true);
        pos.top=pos.top+getStyle(document.body,"border-top-width",true)-getStyle(oriNode,"margin-top",true);
      } else {
        pos.left=pos.left-getStyle(oriNode,"margin-left",true)+borderLeftWidthSum;
        pos.top=pos.top-getStyle(oriNode,"margin-top",true)+borderTopWidthSum;
      }
    }
  }
  return pos;
}
*/

//content poziciojat adja meg pos
function setPosContent(node,pos,check,relative) {
  pos.top-=getStyle(node,"padding-top",true);
  pos.left-=getStyle(node,"padding-left",true);
  return setPosBorder(node,pos,check,relative);
}


//padding poziciojat adja meg pos
function setPosPadding(node,pos,check,relative) {
  pos.top-=getStyle(node,"border-top-width",true);
  pos.left-=getStyle(node,"border-left-width",true);
  return setPosBorder(node,pos,check,relative);
}

//border poziciojat adja meg pos
function setPosBorder(node,pos,check,relative) {
  pos.top-=getStyle(node,"margin-top",true);
  pos.left-=getStyle(node,"margin-left",true);
  return setPosMargin(node,pos,check,relative);
}

//box poziciojat adja meg pos
function setPosMargin(node,pos,check,relative) {
  return setPos(node,pos,check,relative);
}

//ez a box-modelt mozgatja
//mozgatas
//ha relative=true, akkor szimplan egyenlove teszi a pozicioval
//ha relative=false, akkor ugy veszi, hogy document 0,0-hoz szamit a pozicio (csak absolute esetén van ertelme)
function setPos(node,pos,check,relative) {
  check=(check == null ) ? false : check; 
  relative=(relative == null ) ? false : relative;  //nem body-hoz adom meg a pos-t, hanem absolute parent-hez
                                                    //position:relative eseten is hasznos
  var moved=true;
  if (check) {
    var dim = {top: pos.top, left: pos.left, bottom: pos.top+getHeight(node), right: pos.left+getWidth(node)};    
    if (viewportContainsDim(dim)) { //ha az uj pozicio teljesen benne van a viewportban
      node.style.left=pos.left+"px";
      node.style.top=pos.top+"px";
    } else {
      moved=false;
    }
  } else {
    if (relative == false && getStyle(node,"position") == "absolute") {
      var parent=node.offsetParent;
      //elso absolute szulo poziciojat le kell vonni, mert absolute szulo bal felso sarka lesz az origo
      while(parent) {
        if (getStyle(parent,"position") == "absolute") {
          var parentPos=getPos(parent); 
          pos.left-=parentPos.left;
          pos.top-=parentPos.top;
          parent=null;
        } else {
          parent=parent.offsetParent;
        }
      }
    }
    node.style.left=pos.left+"px";
    node.style.top=pos.top+"px";
  }
  return moved;
}
/*
function moveTo(node,p,check) {
  return setPos(node,p,check);
}
//mozgatas
function moveBy(node,p) {
  var topleft = getPos(node);
  p.left += topleft.left;
  p.top += topleft.top;
  moveTo(node,p);
}
*/

//az ablakot body mereture allitja
function setWindowSizeToContent(win) {
  if (win == null) {
    win = window;
  }
  if (win.sizeToContent) {
    //    win.resizeTo(win.document.body.scrollWidth,win.document.body.scrollHeight+10);
    win.resizeTo(win.document.body.scrollWidth+3,win.document.body.scrollHeight+10);
    win.sizeToContent();
    //    win.sizeToContent();
  } else {
    //    win.resizeTo(20,50);
    win.resizeTo(win.document.body.scrollWidth,win.document.body.scrollHeight+50);
    win.resizeTo(win.document.body.scrollWidth,win.document.body.scrollHeight+50);
  }  
}

//aktualis scroll pozicio
function getScrollPos() {
  var pos={top: 0, left: 0};  
 
  if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) { 
    // Explorer 6 Strict and mozilla strict
    pos.left=document.documentElement.scrollLeft;
    pos.top=document.documentElement.scrollTop;
  } else if (self.pageYOffset) {// all except Explorer
    pos.left=self.pageXOffset;
    pos.top=self.pageYOffset;
  } else if (document.body) { // all other Explorers
    pos.left=document.body.scrollLeft;
    pos.top=document.body.scrollTop;
  }
  
//  pos.top=document.body.scrollTop;
//  pos.left=document.body.scrollLeft;

  return pos;
}

//adott dim-ben benne-e van-e a pont
//mit miben
function dimContainsPos(pos,dim) {
  var contains=true;
  
  if (pos.top < dim.top || pos.top > dim.bottom || pos.left < dim.left || pos.left > dim.right) {
    contains=false;
  }
  return contains;
}

//megnezi dim1 es dim2 metszet dim-jet
//egy tombot ad vissza, 
//elso parametere a metszes modjat mondja meg, dim2 merre van dim1-tol (dim1-hez milyen vektorokat kell adni, hogy dim2-ot kapjuk)
//masodik a metszet merete 
//harmadik a metszet pozicioja es merete (dim)
//mit miben
function dimIntersectsDim(dim1,dim2) {
  //megfelelo oldalak viszonyai
  var a=dim1.left - dim2.left;
  var b=dim1.top - dim2.top;
  var c=dim1.right - dim2.right;
  var d=dim1.bottom - dim2.bottom;
  //ellentetes oldalak viszonyai
  var aa=dim1.left - dim2.right;
  var bb=dim1.top - dim2.bottom;
  var cc=dim1.right - dim2.left;
  var dd=dim1.bottom - dim2.top;

  var ret=new Array();


  //(d1)top a (d2)toptol, left a lefttol, bottom a bottomtol, right a righttol
  //ha top -, akkor felfele log ki
  //ha left -, akkor balra log ki
  //ha right +, akkor jobbra log ki
  //ha bottom +, akkor alul log ki
  ret[0]={top: b, left: a, bottom: d, right: c};    

//  van metszes:
//  a1*c1 <= 0 && b1*d1 <= 0   //teljes tartalmazas
//  a1*c1 <= 0 && b2*d2 < 0    //x szerint benne van, y szerint reszlegesen
//  b1*d1 <= 0 && a2*c2 < 0    //y szerint benne van, x szerint reszlegesen
//  a2*c2 < 0  && b2*d2 < 0    //x es y szerint reszlegesen
//eleg a2*c2 < 0 && b2*d2 < 0  is  
  if (aa*cc >= 0 || bb*dd >= 0) {
    ret[1]=null;
    ret[2]=null;
  } else {
    //van metszes
    var width=(dim1.right - dim1.left + dim2.right - dim2.left - (Math.abs(a) + Math.abs(c))) / 2;
    var height=(dim1.bottom - dim1.top + dim2.bottom - dim2.top - (Math.abs(b) + Math.abs(d))) / 2;

    ret[1]={width: width, height: height};  //metszet meretei
    ret[2]={top: dim2.top, left: dim2.left, bottom: 0, right: 0};   //metszet dim
    if (a > 0) {
      //belul kezdodik x
      ret[2].left+=a;
    }
    if (b > 0) {
      //belul kezdodik y
      ret[2].top+=b;
    }
    ret[2].right=ret[2].left+width;
    ret[2].bottom=ret[2].top+height; 
  }
   
  return ret;
}

//viewport-ban benne van-e teljesen az adott dim?
function viewportContainsDim(dim) {
  var ret=dimIntersectsDim(dim,getViewportDim());
  if (ret[1] == null) {
    return false;
  } else if (ret[2].top != dim.top || ret[2].left != dim.left || ret[2].right != dim.right || ret[2].bottom != dim.bottom) {
    return false;      
  }
  return true;
}


//egy adott pont belul van-e a browserer belul vagy nem
//ezt nem a body-ra kell nezni, hanem viewportdim-re!!!!
function inBodyPoint(p) {
  var scrolltopleft = getScrollPos();
  var widthheight = getBodySize();
  var isin = true;
  
  if (p.top < scrolltopleft.top || p.top > scrolltopleft.top + widthheight.height 
      || p.left < scrolltopleft.left || p.left > scrolltopleft.top + widthheight.width) {
    isin = false;
  }
  return isin;
}
//egy adott terulet belul van-e a browserer belul vagy nem
function inBodyDim(dim) {
  var scrolltopleft = getScrollPos();
  var widthheight = getBodyWidthHeight();
  var isin = true;
  
  if (dim.top < scrolltopleft.top || dim.bottom > scrolltopleft.top + widthheight.height 
      || dim.left < scrolltopleft.left || dim.right > scrolltopleft.top + widthheight.width) {
    isin = false;
  }
  return isin;
}



/////////////////////////////////////////////////////////////////////Event fuggvenyek

//elementhez esemenykezelo csatolasa
function addEvent(el, evname, func) {
  if (el.attachEvent) {
    el.attachEvent("on" + evname, func);
  } else if (el.addEventListener){
    el.addEventListener(evname, func, false);   //bubbling
  }
}

//elementtol esemenykezelo torlese
function removeEvent(el, evname, func) {
  if (el.detachEvent) {
    el.detachEvent("on" + evname, func);
  } else if (el.removeEventListener) {
    if (nsDOM && evname.toLowerCase() == 'submit') {
      el.onsubmit = function () {};
    } else {
      el.removeEventListener(evname, func, false); //ha false volt az attach-ban, akkor itt is az kell
    }
  }
}

//event propagation stop, ez csak azt intezi el, hogy a dom faban felfele haladva a tobbi node ne kapja meg az esemenyt
//ettol meg a bongeszo elkapja pl.: egy linkre klikkelest, ehhez return false, vagy returnValue kell!!!
//vagy event.preventDefault() ????
function stopProp(e) {
  if (!e) var e = window.event;
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  return e;
}

function preventDef(e) {  
  if (!e) var e = window.event;
  e.returnValue=false;
  if (e.preventDefault) {
    e.preventDefault();
  }
  return e;
}

//adott esemeny koordinatait adja vissza
function getEventPos(e) {
  var posx = 0;
  var posy = 0;
  if (!e) var e = window.event;
  if (e.pageX || e.pageY)  {
    posx = e.pageX;
    posy = e.pageY;
  } else if (e.clientX || e.clientY)  {
    var scrollPos=getScrollPos();
    posx = e.clientX + scrollPos.left;
    posy = e.clientY + scrollPos.top;
  }
  return {top: posy, left: posx};
}

function getEventAbsolutePos(e) {
  return getEventPos(e);
}

//ez border pos-t rakja 0,0-ba ehhez kepest hol generalodott az esemeny
function getEventRelativePos(e) {
  var posx = 0;
  var posy = 0;
  if (!e) var e = window.event;
  if (ieDOM) {
    var target=getTarget(e);
    posx=e.offsetX+getStyle(target,"border-left-width",true);  //content bal felso a 0,0, de margin nem kell neki
    posy=e.offsetY+getStyle(target,"border-top-width",true);
  } else if (operaDOM) {    
    var target=getTarget(e);
    //content bal felso a 0,0, margin is kell
    posx=e.offsetX+getStyle(target,"border-left-width",true)+getStyle(target,"padding-left",true);      
    posy=e.offsetY+getStyle(target,"border-top-width",true)+getStyle(target,"padding-top",true);
  } else if (nsDOM) {
    posx=e.layerX;  //border is benne van 0,0-ban
    posy=e.layerY;
  }   
  return {top: posy, left: posx};
}


//mouseevent gombjat adja meg
function getEventButton(e) {
  var button = '';
  if (!e) {
    var e = window.event;
  }
  if (nsDOM) {
     switch (e.button) {
       case 0: button = 'left';
               break;
       case 1: button = 'middle';
               break;
       case 2: button = 'right';
               break;
     }
  } else if (ieDOM) {
     switch (e.button) {
       case 1: button = 'left';
               break;
       case 3: button = 'middle';
               break;
       case 2: button = 'right';
               break;
     }
  } else if (operaDOM) {
     switch (e.button) {
       case 0: button = 'left';
               break;
       case 1: button = 'middle';
               break;
       case 2: button = 'right';
               break;
     }
  }
  return button;
}

//mouseover, mouseout event-ek esetere
//target: az az element, amelyiknel az esemeny letrejott (ha onmouseover van, akkor ennek az onmouseover esemenykezeloje hivodna meg legeloszor)   outer -> inner (mouseover) from -> to 
//currentTarget: az az element, amire propagal az esemeny, tehat ahogy megy felfele (kontenerek fele) ez mindig az adott kontenert jeloli, a target viszont tartalmazza az eredeti esemeny elemet

function getFromTo(e) {
  var fromto = {from: null, to: null};
  if (!e) {
    var e = window.event;
  }
  if (e.fromElement) {
    fromto.from = e.fromElement;
  }
  if (e.toElement) {
    fromto.to = e.toElement;
  }
  if (e.relatedTarget) {
    if (e.type == 'mouseover') {
      fromto.from = e.relatedTarget;
      fromto.to = e.target;
    } else if (e.type == 'mouseout') {
      fromto.to = e.relatedTarget;
      fromto.from = e.target; 
    }
  } else {
  }

  return fromto;
}

//ez azt az elemet adja vissza, amin letrejott az eredeti esemeny
function getTarget(e) {
  if (!e) {
    var e=window.event;
  }
  if (e.target) {
    return e.target;
  } else if (e.srcElement) {
    return e.srcElement;
  }

  return null;
}


//////////////////////////////////////////////////////fas fuggvenyek
function getDomTree(node,level) {
  var text="";
  if (level == null) {
    level=0;
  }
  
  switch (node.nodeType) {
    case 9: //document
      text+="#document\n";
      for (var i=0; i < node.childNodes.length; i++) {        
        text+=getDomTree(node.childNodes[i],level+1); 
      }      
      break;
    case 1: // Node.ELEMENT_NODE
    case 11: // Node.DOCUMENT_FRAGMENT_NODE
      var tagName=node.tagName.toLowerCase();
      for (var i=0; i<level; i++) {
        text+=" ";
      }
      text+=tagName+"\n";
      for (var i=0; i < node.childNodes.length; i++) {        
        text+=getDomTree(node.childNodes[i],level+1); 
      }
      break;
    case 3: // Node.TEXT_NODE
      for (var i=0; i<level; i++) {
//        text+=" ";
      }
      text+="("+node.nodeValue.substr(0,10)+")\n";
		break;
    case 8: // Node.COMMENT_NODE
		break;		// skip comments, for now.
  }
  return text;
}; 

function intoChild(obj,obj2) {
  var e = null;
  var t;
  var i = 0;
  var go = true;
  while(go == true) {
    if (i < obj.childNodes.length) {
      t = obj.childNodes[i];
      if (t == obj2) {   //megvan
        e = t;
        go = false;
      } else if (t.nodeType == 1) {  //element
        e = intoChild(t,obj2);
        if (e != null) {             //megvan
          go = false;
        }
      }
      i++;
    } else {
      go = false;
    }
  }
  return e;
}


//child benne van-e parent reszfajaban?
function contains(parent,child) {
  var go = true;
  var found = false;
  
  while(go) {
    if (child == parent) {
      go = false;
      found = true;
    } else if (child != null) {
      child = child.parentNode;
    } else {
      go = false;
    }
  }
  return found;
}

//elsoszintu gyerekei kozul az adott indexu(0 az elso) es tipusu elem jon vissza
function getChildByTagName(obj,index,tagname) {
  var childs = obj.childNodes;
  var elem = null;
  var i = 0;
  var j = 0;
  var go = (childs != null) ? true : false;
  
  while(go) {
    if (i < childs.length) {
      e = childs[i];
      if (e.nodeType == 1) {  //element
        if (e.tagName.toLowerCase() == tagname.toLowerCase()) {  //ha olyan, ami kell
          if (j == index) {  //ha megvan
            go = false;
            elem = e;
          } else {
            j++;
          }
        }
      }
      i++;
    } else {
      go = false;
    }
  }
  
  return elem;
}

//elsoszintu gyerekek kozul az adott indexu (0 az elso)
//ha text=false , akkor csak az elementek szamitanak
//ha text=true , akkor text is beleszamit
function getChild(obj,index,text) {
  var childs = obj.childNodes;
  var elem = null;
  var i = 0;
  var j = 0;
  var go = (childs != null) ? true : false;
  
  while(go) {
    if (i < childs.length) {
      e = childs[i];
      if (text == false && e.nodeType == 1 || text == true && (e.nodeType == 3 || e.nodeType == 1)) {  
        //ha nem kell szoveg es htmlelementet talaltunk
        //vagy szoveg is kell es szoveget vagy htmlelementet talaltunk
        if (j == index) {
          go = false;
          elem = e;
        } else {
          j++;
        }
      }
      i++;
    } else {
      go = false;
    }
  }
  return elem;
}

//elem adott tipusu es indexu (0 a legkozelebi szulo) szulojet adja vissza
function getParent(obj,index,tagName) {
  var elem = null;
  var found = false;
  var parent = obj.parentNode;
  var i = 0;
  var go = (parent != null) ? true : false;
  
  while(go) {
    if (parent == null)  {  //nincs ilyen szulo
      go = false;
    } else if (parent.tagName.toLowerCase() == tagName.toLowerCase()) {
      if (i == index) {
        go = false;
        elem = parent;
      } else {
        i++;
      }
    } else {
      parent = parent.parentNode;
    }
  }
  return elem;
}

//ez melysegi keresessel visszadja az elso textnode-t, vagy null-t ha nincs
//igeny szerint index-re es elementre is meg lehet irni, mint ahogyan getchild
function getFirstTextNode(obj) {
  var e = null;
  var t;
  var i = 0;
  var go = true;
  while(go) {
    if (i < obj.childNodes.length) {
      t = obj.childNodes[i];
      if (t.nodeType == 3) {   //megvan
        e = t;
        go = false;
      } else if (t.nodeType == 1) {  //element
        e = getFirstTextNode(t);
        if (e != null) {             //megvan
          go = false;
        }
      }
      i++;
    } else {
      go = false;
    }
  }
  return e;
}

/** ez kitorli az adott node-ot, ha kell, akkor gyerekei feljonnek helyere
  * visszaadja, hogy mennyi gyereket mozgatott fel
  */
function deleteNode(node,contentMove) {      //node torlese, true: tartalom felmozog a helyere, false: az is elveszik
  contentMove = (contentMove == null) ? false : contentMove;  //default: tartalom torlese
  var i=0;
  if (node != null) {
    var parent = node.parentNode;
    if (contentMove) {
      i=node.childNodes.length;
      while(node.hasChildNodes()) {
 //       alert(node.tagName+"-"+node.hasChildNodes()+"-"+node.childNodes[0]+"-"+node.firstChild);
//IE alatt lehet olyan, hogy firstchild null, mig childnodes[0] az jo
//        var child = node.removeChild(node.firstChild);  //gyerekek node ele mozgatasa
        var child = node.removeChild(node.childNodes[0]);  //gyerekek node ele mozgatasa
        parent.insertBefore(child,node);   
      }
    }
    parent.removeChild(node);
  }
  return i;
}



/** ez megmondja, hogy adott node-nak be van-e allitva az adott attributum
  * altalaban link es anchor megkulonboztetesere hasznalatos, (van-e neki href-je)
  */
function nodeHasAttribute(node,attr) {
  if (node.hasAttribute) {
    //mozilla
    return node.hasAttribute(attr);
  } else {
    //IE
    var t=node.getAttributeNode(attr);
    if (t != null) {
      return t.specified;
    }
  }
  return false;
}


/////////////////////////tablas fuggvenyek
function domtabla(htmltable) {
  //tbody-ba rakjuk a sorokat
  childs = htmltable.childNodes;
  var tbody;
  if (childs == null) {   //nincs gyereke
    tbody = document.createElement("tbody");
    htmltable.appendChild(tbody);
  } else {  //van gyereke
    first = getChild(htmltable,0,false);  //elso nem szoveg gyerek kell
    if (first == null || first.tagName.toLowerCase() != 'tbody') {
      tbody = document.createElement("tbody");
      //tbody-ba mozgatas
      for (var i = 0; i < childs.length ; i++) {
        tbody.appendChild(childs[i]);
      }
      for (var i = 0; i < childs.length ; i++) {
        table.removeChild(childs[i]);
      }
      htmltable.appendChild(tbody);
    } else {        //mar tbody-ban van
    }
    for (var i = 0; i < htmltable.rows.length ; i++) {  //ure sorok kinyirasa
      if (htmltable.rows.item(i).cells.length == 0) {  //ures sor: <tr></tr>
        htmltable.deleteRow(i);
        i--;
      }
    }
  }
}

//egy sort szur be a megadott indexre
function insertRow(table,row,index) {
  if (index < table.rows.length) {  //kozbeszuras
    r = table.rows.item(index);
    r.parentNode.insertBefore(row,r);
  } else {  //biztosan van tbody-ja!!!!, ennek vegere szurjuk be
    tbody = getChildByTagName(table,0,'tbody');
    tbody.appendChild(row);
  }
}
////////////////////////////////////location fuggvenyek

//js popup ablakban vagyunk?
function isPopup() {
  if (window.opener) {
    return true;
  } else {
    return false;
  }
}

//frame-ben vagyunk?
//a szigetnel false kell
//mig imindon true kell, kulonben ki kell menni a tartalmazo oldalra
function isFrame() {
  if(window.top.location == document.location) {
    return false;
  } else {
    return true;
  }
  
}


///////////////////////////////////////string es char fuggvenyek

function isSpace(c) {
  var spaces=" \t\n\r";
  return (spaces.indexOf(c) != -1 ? true : false);
}

function trim(str) {        //ketoldali trim
  if (str == null) {
    return "";
  }
  var i = 0,j = str.length - 1;
  var b = false;
  
  while(i < str.length && b == false) {
    if (isSpace(str.charAt(i)) == false) {
      b = true;
    } else {
      i++;
    }
  }
  if (b == true) {    //biztosan van benne nem white space char
    b = false;
    while(j >= 0 && b == false) {
      if (isSpace(str.charAt(j)) == false) {
        b = true;
      } else {
        j--;
      }
    }
    return str.substring(i,j + 1);   //i mutat az elso jo charra
  } else {
    return "";
  }
}

function ltrim(str) {        //baloldali trim
  if (str == null) {
    return "";
  }
  var i = 0;
  var b = false;
  
  while(i < str.length && b == false) {
    if (isSpace(str.charAt(j)) == false) {
      b = true;
    } else {
      i++;
    }
  }
  if (b == true) {    //biztosan van benne nem white space char
    return str.substring(i,str.length);   //i mutat az elso jo charra
  } else {
    return "";
  }
}


function rtrim(str) {        //jobboldali trim
  if (str == null) {
    return "";
  }
  var j = str.length - 1;
  var b = false;
  
  while(j >= 0 && b == false) {
    if (isSpace(str.charAt(j)) == false) {
      b = true;
    } else {
      j--;
    }
  }
  if (b == true) {    //biztosan van benne nem white space char
    return str.substring(0,j + 1);   //j mutat az utolso jo charra
  } else {
    return "";
  }
}

///////////////////////////////class fuggvenyek

function addClass(el, className) {
  removeClass(el, className);
  if (el.className == null || typeof el.className == 'undefined' || el.className == '') {  //opera miatt
    el.className = className;
  } else {
    el.className += ' ' + className;
  }  
}

function removeClass(el, className) {
  if (!(el && el.className)) {
    return;
  }
  var cls = el.className.split(' ');
  var ar = new Array();
  for (var i = cls.length; i > 0;) {
    if (cls[--i] != className) {
      ar[ar.length] = cls[i];
    }
  }
  el.className = ar.join(' ');
}

function removeStyle(node,attr) {
  if (node && node.style) {
    if (ieDOM) {
      node.style.removeAttribute(attr);  //IE
    } else {
      node.style.removeProperty(attr);
    }
  }
}


function getCssRuleBySelectorFromSheet(sheet,selector) {
  if (nsDOM) {
    var ruleList=sheet.cssRules;

    for (var j=0; j<ruleList.length; ++j) {
      //    alert("selector:"+ruleList[j].selectorText);
      if (ruleList[j].type == CSSRule.STYLE_RULE && ruleList[j].selectorText == selector) {
        return ruleList[j];
      } else if (ruleList[j].type == CSSRule.IMPORT_RULE) {
        //         alert("import!!:"+ruleList[j].href);
        var ret=getCssRuleBySelectorFromSheet(ruleList[j].styleSheet,selector);
        if (ret != null) {
          return ret;
        }
      }
    }
  } else if (ieDOM) {
    //elobb az importalt sheet-et keressuk
    for (var j=0; j<sheet.imports.length; ++j) {
      var ret=getCssRuleBySelectorFromSheet(sheet.imports[j],selector);
      if (ret != null) {
        return ret;
      }
    }
    var ruleList=sheet.rules;
    for (var j=0; j<ruleList.length; ++j) {
//    alert(ruleList[j].selectorText);
      if (ruleList[j].selectorText == selector) {
        return ruleList[j];
      }   
    }
  
  }
  return null;
}

//ez a style objektumot adja vissza, 
//lehet, hogy a cssrule-t kellene
function getCssRuleBySelector( selector ) {
  var sheetList=document.styleSheets;
  var ruleList;
  var i, j;


  if (sheetList) {
    /* look through stylesheets in reverse order that
       they appear in the document */
    for (i=sheetList.length-1; i >= 0; --i) {
      var ret=getCssRuleBySelectorFromSheet(sheetList[i],selector);
      if (ret != null) {
        return ret;
      }
    }
  }
  return null;
}




//node.style -ebben az van, ami inline, vagy js-bol lett beallitva
function getStyle(node,attr,num) {
  var value = node.style[toCamelCase(attr)];
  if (value=='') {
    if(document.defaultView) {
      value = document.defaultView.getComputedStyle(node, "").getPropertyValue(attr);
    } else if (node.currentStyle) {
      value = node.currentStyle[toCamelCase(attr)];
    }
  }
  if (num) {
    value=parseInt(value);
    if (isNaN(value)) {
      value=0;
    }
  }
  return value;
}

function toCamelCase( sInput ) {
  var sArray = sInput.split('-');
  if(sArray.length == 1)    
    return sArray[0];
  var ret = sArray[0];
  for(var i = 1; i < sArray.length; i++){
    var s = sArray[i];
    ret += s.charAt(0).toUpperCase() + s.substring(1)
  }
  return ret;
}  

function pt2px(fontsize) {   //esetleg a vegere lehet tenni a px-t
  var newfont = '';
  if (ieDOM) {
    reg = /pt/;
    if (reg.test(fontsize)) {    //ha pt
      newfont = parseInt(fontsize)*1.35;
    } else {                     //ha nem
      newfont = parseInt(fontsize);
    }
  } else {
    newfont = parseInt(fontsize);
  }
  return newfont;
}

function px2pt(fontsize) {  //esetleg a vegere lehet tenni a pt-t
  var newfont = '';
  if (ieDOM) {
    reg = /px/;
    if (reg.test(fontsize)) {    //ha px
      newfont = Math.round(parseInt(fontsize)/1.3);
    } else {                     //ha nem
      newfont = parseInt(fontsize);
    }
  } else {
    newfont = parseInt(fontsize);
  }
  return newfont;
}

/////////////////////////////////objektum fuggvenyek

/*
//klonozni egy objektumot: ez a tartalmazott objektumokat is lemasolja, nem csak a referenciajuk lesz
function cloneObject(what) {
for (i in what) {
if (typeof what[i] == 'object') {
this[i] = new cloneObject(what[i]);
}
else
this[i] = what[i];
}
}
var book2= new cloneObject(book1);

//ez referenciat hagy
function cloneObject(what) {
for (i in what) {
this[i] = what[i];
}
}
var book2 = new cloneObject(book1)
 */
//nekunk eleg konfiguracios objektumot masolni
function copyObject(obj,list) {
  var newObj = new Object();

  if (list == null) {
    for (var i in obj) {   //osszes elem
      if (typeof obj[i] == 'object') {
        newObj[i] = copyObject(obj[i]);
      } else {
        newObj[i] = obj[i];
      }
    }
  } else {
    for (var i in list) { //csak a megadott elemek
      newObj[list[i]] = obj[list[i]];
    }
  }
  return newObj;
}

function mergeObject(dst,src) {
  var newObj=copyObject(dst);
  for (var i in src) {
    newObj[i]=src[i];
  }
  return newObj;
}


function inArray(arr,value) { 
  for (var i in arr) {
    if (arr[i] == value) {
      return true;
    }
  }

  return false;
}

function getIndex(arr,value) {
  for (var i in arr) {
    if (arr[i] == value) {
      return i;
    }
  }
  return null;
}

function varDump(v,functions,functionsBody,level) {
  //undefined    null
  //number       1, 1.1
  //string       "1"
  //boolean      true
  //object       {asdf: 1}
  //object       ["asdf",1]
  //function     function() {}
  if (level == null) {
    level = 0;
  }
  var str="";
  switch (typeof v) {
    case 'undefined':
    case 'number':
    case 'string':
    case 'boolean':      
      str+= "("+typeof v + "): " + v + "\n";
      break;
    case 'function':
      if (functions) {
        str+= "("+typeof v + "): ";
        if (functionsBody) {
          str+=v;
        }
        str+="\n";
      }
      break;
    case 'object':
      str+= "("+typeof v + "): {\n";
      if (level > 0) {
        for (var i in v) {
          str+= i + " " + varDump(v[i],functions,functionsBody,level-1);
        }
      }
      str+= "}\n";
      break;
    default:
      alert("varDump unknown type: "+(typeof v));
      break;
  }
  return str;
}


/** ez visszaadja a get parametereket egy tombben
  * @param empty ha true, akkor ures parametereket is visszaadja, default: true
  * @return egy tomb, melyben nevvel lehet elerni a kulcsokat
  */
function parseLocationSearch(empty) {
  var empty=(empty != null) ? empty : true;
  var ret=new Array();
  var search=location.search;

  if (search != '') {
    search=search.substr(1);  //? levagasa
    search=unescape(search);
    var t=search.split('&');
    for (var i=0; i<t.length; ++i) {
      if (t[i]) {
        var t2=t[i].split('=');
        if (empty || t2[1]) {
          //ha uresek is kellenek, akkor mindenkeppen kell
          //amugy csak akkor, ha nem ures
          ret[t2[0]]=t2[1];
        }
      }
    }
  }
  
  return ret;
}


/** A PHPSESSID erteket adja vissza vagy get-bol, vagy cookie-bol
  * @param sessionName opcialisan megadhato, hogy milyen nevu valtozot keressen, def: PHPSESSID
  * @return a php session id-ja
  */
function getSessionId(sessionName) {
  var sessionName = (sessionName != null) ? sessionName : "PHPSESSID";
 
  var getValues=parseLocationSearch();
  if (getValues[sessionName]) {
    //ha _GET-ben utazik a session
    return getValues[sessionName];
  } else {
    //ha _COOKIE-ban utazik a session
    return getCookie(sessionName);
  }
  return ""; 
}




/** textinput vagy textarea eseten megmondja, hogy mettol meddig tart az aktualis kijeloles (vagy a kurzor eppen hol all)
  * @param node az input node
  * @param firingNode IE eseten focust is allitani kell, ezert kell egy node, amire vissza lehet allitani a focus (pl. gomb)
  * @return a selection intervallum {start,end}
  */
function getSelectionRange(node,firingNode) {
  var selRange={start: 0, end: 0};  //az elejetol szamitva megy az end [start,end[
  if (node.selectionStart != null) {
    selRange.start=node.selectionStart;
    selRange.end=node.selectionEnd;    
  } else if (node.ownerDocument.selection) {
    node.focus();
    var oSelection=node.ownerDocument.selection;
    var oldRange=oSelection.createRange();   //eredeti range

    node.select();
    oSelection=node.ownerDocument.selection;
    var newRange=oSelection.createRange();   //uj range
    //eleg a start-ot nezni!
 
    var newLines=0;
    while(newRange.compareEndPoints('StartToStart',oldRange) < 0)  {
      //amig kisebb a range kezdete
      selRange.start++;
      newRange.moveStart('character',1);
    }

    var index1=0;
    var index2=selRange.start;
    newLines=countChar(node.value,"\r",index1,index2);
    while(newLines > 0) {
      index1=index2;
      index2+=newLines;
      newLines=countChar(node.value,"\r",index1,index2);
    }
    selRange.start=index2;  

    selRange.end=selRange.start+oldRange.text.length;
    
    oldRange.select();  //itt vissza a regit
    if (firingNode) {
      firingNode.focus();
    }
  }
  return selRange;
}



function selectRange(node,startIndex,endIndex) {
  if (node.setSelectionRange) {
    node.focus();
    node.setSelectionRange(startIndex, endIndex);
//    node.selectionStart=startIndex;
//    node.selectionEnd=endIndex;
  } else if (node.createTextRange) {
    node.focus();

    var tr=node.createTextRange();
    //reset 0,0-ba
    tr.moveStart('character',-1*node.value.length);
    tr.moveEnd('character',-1*node.value.length);

    var count=countChar(node.value,"\r",0,startIndex);
    startIndex-=count;
    count=countChar(node.value,"\r",0,endIndex);
    endIndex-=count;

    tr.moveStart('character',startIndex);
    tr.moveEnd('character',endIndex-startIndex);  //hosszat adja meg
    tr.select();

  }
}


function countChar(text,ch,startIndex,endIndex) {
  //ez megszamolja, hanyszor fordul elo egy char egy text-ben
  if (startIndex != null) {
    if (endIndex == null) {       
      endIndex=text.length;
    }
    text=text.substring(startIndex,endIndex);
  }
  var index=0;
  var foundIndex=0;
  var count=0;
  while(index < text.length) {
    foundIndex=text.indexOf(ch,index);
    if (foundIndex == -1) {
      index=text.length;
    } else {
      index=foundIndex+1;
      ++count;
    }
  }

  return count;
}



/*
   name - name of the cookie
   value - value of the cookie
   [expires] - expiration date of the cookie
   (defaults to end of current session)
   [path] - path for which the cookie is valid
   (defaults to path of calling document)
   [domain] - domain for which the cookie is valid
   (defaults to domain of calling document)
   [secure] - Boolean value indicating if the cookie transmission requires
   a secure transmission
 * an argument defaults when it is assigned null as a placeholder
 * a null placeholder is not required for trailing omitted arguments
 */

function setCookie(name, value, expires, path, domain, secure) {
  var curCookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}


/*
   name - name of the desired cookie
   return string containing value of specified cookie or null
   if cookie does not exist
 */

function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}


/*
   name - name of the cookie
   [path] - path of the cookie (must be same as path used to create cookie)
   [domain] - domain of the cookie (must be same as domain used to
   create cookie)
   path and domain default if assigned null or omitted if no explicit
   argument proceeds
 */

function deleteCookie(name, path, domain) {
  if (getCookie(name)) {
    document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}



