function cr( innerHTML ) {
  var res; 

  if ( innerHTML.indexOf( '<' ) == -1 ) {
    res =  document.createElement( innerHTML );
  } else { 
    res = document.createElement( 'DIV' );
    res.innerHTML = innerHTML;
    res = res.firstChild;
  } // if
  
 return res;
} // cr

function crIframe() {
  var iframe = cr( 'IFRAME' );

  return iframe;
} // crIframe

function crLink() {
  var link = cr( 'A' );
  
  return link;
} // crLink

function crTable() {
  var tableObj = cr( 'TABLE' );
  
  tableObj.setAttribute( 'cellspacing', '0' );
  tableObj.setAttribute( 'cellpadding', '0' );
  tableObj.setAttribute( 'border', '0' );
  
  return tableObj;
} // crTable


function cloneObject( obj, exceptList ) {
  var result;
  var type = typeof( obj );
	function except( name ) {
	  if ( !exceptList ) return false;
		
    for ( var i = 0; i < exceptList.length; i++ ) {
			if ( name === exceptList[i] ) return true;	
		} // if
	
  	return false;
	}; // except
  switch ( type.toLowerCase() ) {
    case 'string'   :
    case 'number'   :
    case 'boolean'  :
    case 'function' :
      result = obj;
      break;
    default:
		  if ( !obj ) {
			  result = obj;
				break;
			} // if	

  		if ( obj.constructor == Array ) {
        result = [];
        for ( var i = 0; i < obj.length; i++ ) {
          result[i] = cloneObject( obj[i], exceptList );
        } // for
        
        break;
      } else {
        result = {};
        var key;
        
        for ( key in obj ) {
          //result[key] = except( key ) ? null : ( obj[key] && obj[key].clone ? obj[key].clone() : cloneObject( obj[key], exceptList ) );
          result[key] = except( key ) ? null : (
            obj[key] && obj[key].clone && obj[key].constructor != Array ? 
              obj[key].clone( exceptList ) : 
              cloneObject( obj[key], exceptList )
          );
        } // for

        break;
      }	// if
    } // case
  
  return result;
} // cloneObject


function rmObj( objOrID ) {
	var type = typeof( objOrID );
	var typeStr = type.toLowerCase();
	var objekt;
	
  if ( typeStr == 'string' || typeStr == 'number' ) {
		objekt = document.getElementById( objOrID );
	} else {
  	objekt = objOrID;
	} // if

	if ( objekt && objekt.parentNode ) objekt.parentNode.removeChild( objekt );
} // rmObj

function removeChildren( objOrID ) {
	var type = typeof( objOrID );
	var typeStr = type.toLowerCase();
	var objekt;
	
  if ( typeStr == 'string' || typeStr == 'number' ) {
		objekt = document.getElementById( objOrID );
	} else {
  	objekt = objOrID;
	} // if
  
	if ( objekt && objekt.childNodes ) {
    var child = objekt.firstChild;
		while( child ) {
			var currChild = child;
			child         = child.nextSibling;
			objekt.removeChild( currChild );
		} // while
  } // if
} // removeChildren

function letters2px( letters ) {
  var input = cr( 'INPUT' );
  input.type = 'text';
  input.size = letters;
  input.style.visibility = 'hidden';
  
  document.body.appendChild( input );
  var pxLen = input.offsetWidth;
  rmObj( input );
  
  return pxLen;
} // letters2px

function textNode( text ) {
  return document.createTextNode( text );
} // textNode


function smartSubmit( element ) {
  var parent, parentTag;

  do {
    parent = element.parentNode;
    if ( parent ) parentTag = parent.tagName.toUpperCase();
    element = parent;
  } while ( parent && parentTag != 'FORM' && parentTag != 'BODY' );
  
  if ( parentTag == 'FORM' ) {
    element.submit();
  } else {
    jsLog( 'Smart Submit has not found form element');
  } // if
} // smartSubmit


function getParentByTagName( element, tagName ) {
  if ( element ) {
    var parent, parentTag;
    tagName = tagName.toUpperCase();
  
    do {
      parent = element.parentNode;
      if ( parent ) parentTag = parent.tagName.toUpperCase();
      element = parent;
    } while ( parent && parentTag != tagName && parentTag != 'BODY' );
  } // if
  
  if ( parentTag == tagName ) return element;
  
  return null;
} // getParentByTagName

function clearElementID( elementID ) {
  var element = $( elementID );
  
  element.id = undefined;
  element.removeAttribute( 'id' );
} // clearElementID
