/**
 * @link http://graf-x.ru/
 * @version 0.0.1
 * @copyright Copyright: 2007 Graf-X
 * @author RVV <master@graf-x.ru>
 */

if ( typeof( gfx ) == 'undefined' ) gfx = {};

var XML_ELEMENT_NODE = 				1;		//Node is an element 
var XML_ATTRIBUTE_NODE = 				2;		//Node is an attribute 
var XML_TEXT_NODE = 						3;		//Node is a piece of text 
var XML_CDATA_SECTION_NODE = 	4;
var XML_ENTITY_REF_NODE = 			5;
var XML_ENTITY_NODE = 					6;		//Node is an entity like &nbsp; 
var XML_PI_NODE = 							7;		//Node is a processing instruction 
var XML_COMMENT_NODE = 				8;		//Node is a comment 
var XML_DOCUMENT_NODE = 			9;		//Node is a document 
var XML_DOCUMENT_TYPE_NODE = 	10;
var XML_DOCUMENT_FRAG_NODE = 	11;
var XML_NOTATION_NODE = 				12;

/**
 * 
 * mozhet proveryat tolko svoystva ob'ektov, no ne sami ob'ekti
 * 
 */
gfx.exist = function( objectProperty ) {

	return ( typeof( objectProperty ) != 'undefined' );
};

/**
 * 
 */
function selectOption( select, value ) {
	
	//alert( "value = " + value );
	
	var options = select.options;
	
	for ( var i = 0; i < options.length; i++ ) {
		
		//alert( "options[" + i + "] = " + options[i].value );
		
		if ( options[i].value == value ) {
			
			options[i].selected = true;
			
			break;
		}
	}
}

/**
 * дамп массива для просмотра
 * «38. Маленькие хитрости JavaScript» Д.Котеров
 */
function dump( d, l ) {
	
	if ( l == null ) l = 1;

    var s = '';

    if ( typeof( d ) == "object" ) {
		
		s += typeof(d) + " {\n";
        
		for (var k in d) {
            
			for ( var i=0; i<l; i++ ) s += "  ";
            
			s += k+": " + dump( d[k], l+1 );
        }
		for ( var i=0; i<l-1; i++ ) s += "  ";
        
		s += "}\n"
    
	} else {
        
		s += "" + d + "\n";
    }
	return s;
}


/**
 * не юникодный аналог escape()
 * IE 5.5+
 * http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii?26#EscapeSovmestimyiySRusskimiBuk
 */

// Инициализируем таблицу перевода
var trans = [];
for (var i = 0x410; i <= 0x44F; i++) trans[i] = i - 0x350; // А-Яа-я
trans[0x401] = 0xA8;    // Ё
trans[0x451] = 0xB8;    // ё

window.rightEscape = function rightEscape(str) {
	
	var ret = [];
	// Составляем массив кодов символов, попутно переводим кириллицу
	for ( var i = 0; i < str.length; i++ ) {
		
		var n = str.charCodeAt(i);
		
		if (typeof trans[n] != 'undefined') n = trans[n];
		if (n <= 0xFF) ret.push(n);
	}
	return escape( String.fromCharCode.apply(null, ret) );
}

/**
 * 
 * PHP: array_key_exists
 *
 */
function arrayKeyExists( key, arr ) {

	res = false;
	
	for ( var i in arr ) {
		
		if ( i == key ) {
		
			res = true;
			
			break;
		}
	}
	
	return res;
}

/**
 * 
 * PHP: in_array
 *
 */
function inArray( value, arr  ) {

	res = false;
	
	for ( var i in arr ) {
		
		if ( arr[i] == value ) {
		
			res = true;
			
			break;
		}
	}
	
	return res;
}


/**
 * 
 * число в строку длиной больше 2-х символов
 *
 */
function intToStr2Char( intNum ) {

	var str = '';
	
	if ( intNum <= 9 ) {

		str += '0';
	}

	str += intNum;
	
	return str;
}

/**
 * 
 * аналог Math.min, но на вход принимает массив и функцию сортировки
 *
 */
function min( arr, sortFunction ) {
	
	arr.sort( sortFunction );
	
	return arr[0];
}

/**
 * 
 * 
 *
 */
function innerText( nParent, str ) {
	
	if ( typeof( str ) != 'undefined' ) {
	
		if ( typeof( nParent.innerText ) != 'undefined' ) {
	
			nParent.innerText = str;
	
		} else {
	
			removeChilds( nParent );
	
			nParent.appendChild( document.createTextNode( str ) );
		}
	
	} else {
		
		str = '';
		
		if ( typeof( nParent.innerText ) != 'undefined' ) {
	
			str = nParent.innerText;
	
		} else {
		
			if ( nParent.hasChildNodes() ) {
			
				var childNodes = nParent.childNodes;
				
				var textNodesValues = new Array();
				
				for ( var i=0; i < childNodes.length; i++ ) {
					
					if ( childNodes[i].nodeType == XML_TEXT_NODE ) {
						
						textNodesValues[ textNodesValues.length ] = childNodes[i].nodeValue;
					
					} else if ( childNodes[i].nodeType == XML_ELEMENT_NODE ) {
						
						textNodesValues[ textNodesValues.length ] = innerText( childNodes[i] );
					}
					
					str = textNodesValues.join('');
				}
			}
		}
	}
	
	return str;
}

/**
 * 
 * 
 *
 */
function insertAdjacentHTMLAfterBegin( nParent, str ) {
	
	if ( typeof( nParent.insertAdjacentHTML ) != 'undefined' ) {
		
		nParent.insertAdjacentHTML( 'AfterBegin', str );
		
	} else {
	
		innerHTML( nParent, str + innerHTML( nParent ) );
	}
}

/**
 * 
 * 
 *
 */
function insertAdjacentHTMLBeforeEnd( nParent, str ) {
	
	if ( typeof( nParent.insertAdjacentHTML ) != 'undefined' ) {
		
		nParent.insertAdjacentHTML( 'BeforeEnd', str );
		
	} else {
	
		innerHTML( nParent, innerHTML( nParent ) + str );
	}
}

/**
 * 
 * 
 *
 */
function remove( nNode ) {

	if ( 1
		&& ( typeof( nNode.parentNode ) != 'undefined' )
		&& nNode.parentNode
	) nNode.parentNode.removeChild( nNode ); //nNode = null; not work !!!
}

/**
 * 
 * 
 *
 */
function removeChilds( nParent, deep ) {
	
	if ( nParent.nodeType == XML_ELEMENT_NODE ) {
	
		deep = ( deep ) ? true : false;
	
		var childNodes = nParent.childNodes;
		var lastIndexChildNodes = childNodes.length - 1;
		
		for ( var i=lastIndexChildNodes; i >= 0; i-- ) {
				
			if ( deep ) removeChilds( childNodes[i], deep );
			
			nParent.removeChild( childNodes[i] );
		}
	}
}

/**
 * 
 * 
 *
 */
function innerHTML( nParent, str ) {
	
	if ( typeof( str ) != 'undefined' ) { // 
	
		if ( typeof( nParent.innerHTML ) != 'undefined' ) { // Mozilla and WinMSIE6
	
			 nParent.innerHTML = str;
	
		} else {
			
			// TODO
		}
	
	} else {
		
		str = '';
		
		if ( typeof( nParent.innerHTML ) != 'undefined' ) { // Mozilla and WinMSIE6
	
			str = nParent.innerHTML;
	
		} else { 
			
			// TODO
		}
	}
	
	return str;
}

/**
 * 
 * jQuery
 *
 */
function jDownElement( jElement ) {
	
	jElement.insertAfter( jElement.next() );
}

/**
 * 
 * jQuery
 *
 */
function jUpElement( jElement ) {
	
	jElement.insertBefore( jElement.prev() );
}

/**
 * 
 * jQuery
 *
 */
function jShowInline( jInlineElement ) {
	
	jInlineElement.css( 'display', 'inline' );
}

/**
 * 
 * 
 *
 */
function getKeyCode( event ) {
		
	var ev = event || window.event;
	
	return ev.keyCode || ev.which || null;
}

/**
 * 
 * 
 *
 */
gfx.getClientWidth = function() {
	return ( ( document.compatMode=='CSS1Compat' && ! window.opera ) ? 
		document.documentElement.clientWidth : document.body.clientWidth
	);
};

/**
 * 
 * 
 *
 */
gfx.getClientHeight = function() {
	return ( ( document.compatMode=='CSS1Compat' && ! window.opera ) ? 
		document.documentElement.clientHeight : document.body.clientHeight
	);
};

/**
 * 
 * IE4+, NN4+, Opera5+
 *
 */
function trim( str ) {
	
	return rtrim( ltrim( str ) );
}

function ltrim( str ) {
	
	return str.replace( /^\s+/, '' ); 
}

function rtrim( str ) {
	
	return str.replace( /\s+$/, '' ); 
}





