/* ---------------------------------------------------------------------- */
/* --------------------------- HTML Glif -------------------------------- */
/* ---------------------------------------------------------------------- */
/* Абстрактный класс */
/* nodeName( String ) Имя DOM элемента. Например: 'div', 'p', 'span' */
/* props( Object ) Аттрибуты элемента. */
/* target( DOM element ) Элемент в который вставить. */
/* content( String/DOM element ) Содержимое. Либо HTML в виде строки, либо DOM element */
/* style( Object ) Стили. */

HTMLGlif = function( nodeName, props, target, content, style ) {
	HTMLGlif.superClass.apply( this, new Array() );
	
	this.Id = 'HTMLGlif';
	this.createHTML( nodeName, props, target, content );
}
HTMLGlif.inheritsFrom( IL );

/* -------------------------- Create HTML ------------------------------- */

HTMLGlif.prototype.createHTML = function( nodeName, props, target, content, style ) {
	this.element = this.createNode( nodeName, props, target, content, style );
	return this.element;
}

/* -------------------------- Create Node ------------------------------- */
/* Создание ноды */
/* nodeName( String ) Имя DOM элемента. Например: 'div', 'p', 'span' */
/* props( Object ) Аттрибуты элемента. */
/* target( DOM element ) Элемент в который вставить. */
/* content( String/DOM element ) Содержимое. Либо HTML в виде строки, либо DOM element */
/* style( Object ) Стили. */

HTMLGlif.prototype.createNode = function( nodeName, props, target, content, style ) {
	if( !nodeName || typeof( nodeName ) != 'string' ) return false;
	var node = document.createElement( nodeName );
	if( !node ) return false;

	if( props ) this.setProperty( props, node );
	if( target ) this.append( target, node );
	if( content ) this.setContent( content, node );
	if( style ) this.setStyle( style, node );
	return node;
}

/* ------------------------ Set Properties ------------------------------ */
/* Установить аттрибуты */
/* props( Object ) Аттрибуты элемента. */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setProperty = function( props, el ) {
	el = el || this.element;
	if( !el ) return false;
	for( var cProp in props ) {
		if( cProp != 'class' ) {
			el.setAttribute( cProp, props[ cProp ] );
		}
	}

	if( props['class'] ) this.setClassName( props['class'], true, el );
}

/* -------------------------- Set Style --------------------------------- */
/* Установить стили */
/* props( Object ) Стили элемента */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setStyle = function( props, el ) {
	el = el || this.element;
	if( !el ) return false;
	for( var cProp in props ) {
		el.style[ cProp ] = props[ cProp ];
	}
}

/* ------------------------- Set Content -------------------------------- */
/* Установить контент */
/* content( String ) Содержимое */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setContent = function( content, el ) {
	el = el || this.element;
	if( !el ) return false;
	content = content || '';
	if( typeof( content ) == 'string' ) {
		el.innerHTML = content;
	} else if( content.element && content.element.nodeType ) {
		this.append( el, content.element );
	} else {
		return false;
	}
}

/* ------------------------ Set Class Name ------------------------------ */
/* Установить класс */
/* className( String ) Имя класса */
/* flag( Boolean ) Добавить/Удалить */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setClassName = function( className, flag, el ) {
	el = el || this.element;
	if( !el ) return false;
	
	if( className === false ) {
		el.className = '';
		return;
	}
	
	if( typeof( className ) != 'string' ) return false;
	var pattern = new RegExp( className, 'gi' );
	if( flag ) {
		if( !pattern.test( el.className ) ) el.className += ' ' + className;
	} else {
		el.className = el.className.replace( pattern, '' );
	}
	el.className = el.className.replace( '  ', ' ' );
}

/* ----------------------------- Append --------------------------------- */
/* Прикрепить к */
/* target( Dom Element ) Родительский элемент */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.append = function( target, el ) {
	var el = el || this.element;
	if( !el || !target || !target.appendChild ) return false;
	return target.appendChild( el );
}

/* ----------------------------- Remove --------------------------------- */
/* Удалить */

HTMLGlif.prototype.remove = function() {
	if( !this.element || !this.element.parentNode ) return false;
	this.element.parentNode.removeChild( this.element );
	this.notify( 'Removed' );
	IL.prototype.remove.call( this );
}

/* ----------------------------- Offset --------------------------------- */
/* Размеры и положение */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */
/* возвращает объект 
{
	top: int,
	left: int,
	width: int,
	height: int
}
*/

HTMLGlif.prototype.offset = function ( el ) {
	var el = el || this.element;
	if( !el ) return false;
	var result = { top: 0, left: 0, width: el.offsetWidth, height: el.offsetHeight };
	var withFixed = false;

	while( el ) {
		result.top += el.offsetTop;
		result.left += el.offsetLeft;
		el = el.offsetParent;
	}

	if(
		new RegExp( 'crop', 'gi' ).test( document.body.parentNode.className ) &&
		typeof document.documentElement.style.maxHeight != 'undefined'
	) {
		result.top += ( window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0 );
	}
	return result;
}

/* ------------------------- Set Position ------------------------------- */
/* Позиционирование */
/* x, y ( Int ) координаты в пикселях */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setPosition = function( x, y, el ) {
	el = el || this.element;
	if( !el ) return false;
	if( y || y === 0 ) this.setStyle({ top: y + 'px' }, el );
	if( x || x === 0 ) this.setStyle({ left: x + 'px' }, el );
}

/* --------------------------- Set Size --------------------------------- */
/* Установка размеров */
/* w, h ( Int ) размеры в пикселях */
/* el( DOM element ) Если указан, то применть к нему, если нет то к полю this.element */

HTMLGlif.prototype.setSize = function( w, h, el ) {
	el = el || this.element;
	if( !el ) return false;
	if( w || w === 0 ) this.setStyle({ width: w + 'px' }, el );
	if( h || h === 0 ) this.setStyle({ height: h + 'px' }, el );
}
