// Source by Andris Zach 09.06.2006

DOM = {  
};
function el( id ){
  return document.getElementById( id );
}

DOM.findPosX = function( obj ){
 var curleft = 0;
 if (obj.offsetParent) {
  while (obj.offsetParent)  {
   curleft += obj.offsetLeft
   obj = obj.offsetParent;
  }
 }
 else if (obj.x)
  curleft += obj.x;
 return curleft;
}

DOM.findPosY = function( obj ){
 var curtop = 0;
 if (obj.offsetParent) {
  while (obj.offsetParent)  {
   curtop += obj.offsetTop
   obj = obj.offsetParent;
  }
 }
 else if (obj.y)
  curtop += obj.y;
 return curtop;
}


DOM.make = function( par ){  
 if( ! par.tag && ! par.text ) return false;
 if( par.tag ){ 
  var elm = document.createElement( par.tag );    
  // set attribute
  if( par.attr ){
    for( key in par.attr ){
      elm.setAttribute( key, par.attr[ key ] );
    }
  }
  // append childs
  if( par.els && par.els.push ){
    for( ii = 0; ii < par.els.length; ii++ ){
     if( par.els[ ii ].Append ) par.els[ ii ].Append( elm ); else elm.appendChild( par.els[ ii ] );
    }
  }
  if( par.els && ! par.els.push ){
    if( par.els.Append ) par.els.Append( elm ); else elm.appendChild( par.els );
  }
  // set properties
  if( par.prop && ! par.prop.push ){
    obj_to_obj( { 'obj1':elm, 'obj2':par.prop } );
  }
  if( par.prop && par.prop.push ){
    for( var ii = 0; ii < par.prop.length; ii++ ){
      obj_to_obj( { 'obj1':elm, 'obj2':par.prop[ ii ] } );
    }
  }
  if( par.className ){
    elm.className = par.className;
  }
  if( par.style ){
    obj_to_obj( { obj1:elm.style, obj2:par.style } ); 
  } 
  if( par.text ) elm.appendChild( document.createTextNode( par.text ) );
  elm.Append = window.DOM.elm_append_;
  elm.Remove = window.DOM.elm_remove_;
  elm.Clear = window.DOM.elm_clear_;  
  elm.Prop = function ( par ){
    obj_to_obj( { 'obj1':this, 'obj2':par } );
    return this;
  }
  elm.addClass = function( par ){
    var ca = this.className.split( ' ' );
    ca.push( par );
    this.className = ca.join( ' ' );
  };
  elm.removeClass = function( par ){
    var ca = this.className.split( ' ' );
    var pos = ca.indexOf( par );
    if( pos != -1 ) ca.splice( pos, 1 );
    this.className  = ca.join( ' ' );
  };
  elm.mkE = true;   
  return elm;
 }
 if( par.text ){
  elm = document.createTextNode( par.text );
  elm.Append = window.DOM.elm_append_;
  elm.Remove = window.DOM.elm_remove_;
  elm.Clear = window.DOM.elm_clear_;
  return elm;
 }   
}
/*
PAR
  tag  - new element tag
  text - creat text node
  els - append child in to tag
  attr - set attribute for return node
  prop - set propertirs for return node                 
*/

DOM.elm_append_ = function( e ){
  if( ! e ){
    document.body.appendChild( this );
    if( this.onAppend ) this.onAppend();
    if( this.onAppend2 ) this.onAppend2();
    return this;
  } else {
    e.appendChild( this );
    if( this.onAppend ) this.onAppend();
    if( this.onAppend2 ) this.onAppend2();
    return this;
  }
}

DOM.elm_remove_ = function(){
  window.DOM.rm( { 'node':this } );
}

DOM.elm_clear_ = function(){
  window.DOM.cn( { 'node':this } );
  return this;
}

DOM.cn = function ( par ){  
  if( ! par.node ) return false;
  var ch;
  while( ch = par.node.firstChild ){
    par.node.removeChild( ch );
  }
}
/*
  node
                    <andris 09.06.2006>  
*/
DOM.rm = function ( par ){
  if( ! par.node ) return false;  
  if( par.node.parentNode ){
    par.node.parentNode.removeChild( par.node );
  } else {
    if( par.error ) alert( 'This element don\'t exist parent node!' );
  } 
}
/*
  node
                    <andris 09.06.2006>  
*/

DOM.init_moving = function(){	
	if( DOM.init_moving.ok ) return false;
	DOM.mouse = {};
  document.body.moving_obj = false;
  document.body.onmouseup = function(){        
    var mo = this.moving_obj;
    this.moving_obj = false;
    if( mo && typeof mo.moveStop == 'function' ) mo.moveStop();
  }
  document.body.onmousemove = function( e ){
    if ( document.all ) { 
      var X = event.clientX + document.body.scrollLeft;
      var Y = event.clientY + document.body.scrollTop;
    } else {  
      var X = e.pageX;
      var Y = e.pageY;
    }
    DOM.mouse.x = X;
    DOM.mouse.y = Y;
    if( this.moving_obj ){
    	document.body.onmousedown = DOM.returnfalse;
			document.body.onselectstart = DOM.returnfalse;
			//document.body.unselectable = "on";
    	//document.body.style.MozUserSelect = "none";        
      if( this.moving_obj.x_start === false ) this.moving_obj.x_start = X;
      if( this.moving_obj.y_start === false ) this.moving_obj.y_start = Y;
      if( this.moving_obj.moveTo( X, Y ) );
    } else {
    	document.body.onmousedown = DOM.returnnothing;
			document.body.onselectstart = DOM.returnnothing;
    }
  }
  return ( DOM.init_moving.ok = true );
}
DOM.returnfalse = function(){
	return false;
};
DOM.returnnothing = function(){};
//------------------------------------------------------------------------------
      function obj_to_obj( par ){
        if( ! par.obj1 ) return false;
        if( ! par.obj2 ) return false;       
        for( var key in par.obj2 ){                                                  
          if( typeof( par.obj2[ key ] ) != 'object' || ( par.obj2[ key ] && par.obj2[ key ].mkE ) ){
            par.obj1[ key ] = par.obj2[ key ];
          } else {
            if( ! par.obj1[ key ] ) par.obj1[ key ] = Object();                                    
            obj_to_obj( { 'obj1':par.obj1[ key ], 'obj2':par.obj2[ key ] } );
          }
        }
        return true;  
      }
/*
  obj1 - objekts, kuram tiks pievienots 2 objekts.
  obj2 - objekts, kuru pievieno.
  
                    <andris 03.07.2006>  
*/
DOM.selection = function( element ){
	var re = {};
	if( document.selection ){
		// The current selection
		var range = document.selection.createRange();		
		// We'll use this as a 'dummy'
		var stored_range = range.duplicate();
		// Select all text
		//stored_range.moveToElementText( element );				
		// Now move 'dummy' end point to end point of original range
		//stored_range.setEndPoint( 'EndToEnd', range );		
		// Now we can calculate start and end points
		re.start = element.selectionStart = stored_range.text.length - range.text.length;
		re.end = element.selectionEnd = element.selectionStart + range.text.length;		
	} else {
		re.start = element.selectionStart;
		re.end = element.selectionEnd;
	}
	return re;
}
/*
												<andris 26.08.2008>
*/
