// Library
// Copyright (c) Alexander Shpack, 2007-now().

var $ = function ( id ) {
	try {
		return ( typeof id == "string" )? document.getElementById( id ) : id;
	} catch ( e ) { };
}
var $$ = function ( nodeName, node ) {
	try {
		var stripNSPrefix = !( document.getElementsByTagNameNS );
		if ( stripNSPrefix ) {
			nodeName = nodeName.split( ":" );
			nodeName = ( nodeName[1] )? nodeName[1] : nodeName[0];
			nodeName = nodeName.toUpperCase();
		};

		if ( node ) return $( node ).getElementsByTagName( nodeName )
		return document.getElementsByTagName( nodeName );
	} catch ( e ) { };
}

var $matchClassName = function ( node, className ) {
	try {
		var node = $( node );
		var classArr = node.className.split(/\s+/i);
		for ( var i=classArr.length; i-- >0; ){
			if ( classArr[i] == className) return true;
		}
		return false; 
	} catch ( e ) { return }
}

var $applyClassName = function ( node, className, state ) {
	try {
		node = $( node );

		var classArr = node.className.split(/\s+/i);

		for ( var i=classArr.length; i-- >0; ){
			if ( classArr[i] == className ){
				if ( state ) {
					return;
				};
				if ( !state ) {
					classArr.splice(i,1);
					node.className = classArr.join( " " );
					return;
				}
			}
		};

		if ( state ) { 
			classArr.push( className );
			node.className = classArr.join( " " );
		}
	} catch ( e ) {}
}

var $dispatchEventForElement = function( node, eventType ) {

	node = $( node );

	try {

		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
		node.dispatchEvent(evt)

	} catch ( e ) {

		node.fireEvent( "on"+eventType );

	}
}

var $addEventListener = function ( node, eventType, eventListener ) {
	try {
		node = $( node );

		if( node.attachEvent ) {
			node.attachEvent( "on" + eventType, eventListener );
		}
		else
		{
			node.addEventListener( eventType, eventListener, false);
		}
	} catch ( e ) {}
}
var $removeEventListener = function ( node, eventType, eventListener ) {
	try {

		node = $( node );
		if( node.detachEvent ) {
			node.detachEvent( "on" + eventType, eventListener);
		}
		else
		{
			node.removeEventListener( eventType, eventListener, false);
		}
	} catch ( e ) {}
}

var $ptn = function ( node, nodeName ) {
	try {

 		var node = $( node );

 		while ( node.parentNode && node.parentNode.nodeName != nodeName ) {
 			node = node.parentNode;
 		};
 		if ( !node.parentNode ) return;
 		return node.parentNode;

 	} catch ( e ) { return }
}

var $pcn = function ( node, className ) {
	try {

		var node = $( node );

		while ( node.parentNode && !$matchClassName( node.parentNode, className ) ) {
			node = node.parentNode;
		};
		if ( !node.parentNode ) return;
		return node.parentNode;

	} catch ( e ) { return }
}

var $clearNodeContent = function ( node ) {
	try {

		node = $( node );

		if ( !document.createRange ) {
			node.innerHTML = "";
		}
		else
		{
			var tmpRange = document.createRange();
   	
			tmpRange.selectNodeContents(node);
			tmpRange.deleteContents();
   	
			tmpRange.detach();
		}
	} catch ( e ) {}
}

var $moveNodeContent = function ( fromNode, toNode, options ) {
	try {

		fromNode = $( fromNode );
		toNode = $( toNode );

		if ( !document.createRange || document.documentMode || window.opera ) { // IE7, IE8, IE9, Opera
			if ( options && options.pos ) {
				if ( options.pos == "begin" ) {
					toNode.innerHTML = fromNode.innerHTML + toNode.innerHTML;
				}
				else
				{
					toNode.innerHTML += fromNode.innerHTML;
				}
			}
			else
			{
				toNode.innerHTML = fromNode.innerHTML;
			}

			fromNode.innerHTML = "";
		}
		else
		{

			if ( !( options && options.pos ) ) $clearNodeContent( toNode );

			var tmpRange = document.createRange();

			tmpRange.selectNodeContents( fromNode );

			var tmpContext = tmpRange.extractContents(); 

			if ( options && options.pos ) { 

				if ( options.pos == "begin" ) {
    				toNode.insertBefore ( tmpContext, toNode.firstChild ); 
				}
				else
				{
					toNode.appendChild( tmpContext );
				}
			} 
			else
			{
				toNode.appendChild( tmpContext );
			}
   	
			tmpRange.detach();
		}

	} catch ( e ) { }
}

var $moveNode = function ( srcNode, targetNode, options ) {
	try {
		
		srcNode = $( srcNode );
		targetNode = $( targetNode );

		var pos = ( options && options.pos )? options.pos : "end";
		
		switch ( pos ) {
			case "begin": $insertBefore ( srcNode, targetNode ); break;
			case "end"	: targetNode.appendChild( srcNode ); break;
		}

	} catch ( e ) { } 
}

var $getElementsByClassName = function ( container, className ) {

	var tmpArr = [];

	try {
		var nodeList = $$( "*", container );

		for ( var i = nodeList.length; i-- >0; ) {
			if ( $matchClassName( nodeList.item( i ), className ) ) tmpArr.push( nodeList.item( i ) );
		}

	} catch ( e ) {};

	return tmpArr;	
}
	
var $getFullOffsetTop = function( node ) {
	try {

		var nodeTop = node.offsetTop;
		var nodeParentOffset = node.offsetParent;

		while ( nodeParentOffset ) {
			nodeTop += nodeParentOffset.offsetTop; 
			nodeParentOffset = nodeParentOffset.offsetParent;
		}	

		return nodeTop;

	} catch ( e ) { return 0; }
}

var $getFullOffsetLeft = function( node ) {
	try {

		var nodeLeft = node.offsetLeft;
		var nodeParentOffset = node.offsetParent;

		while ( nodeParentOffset ) {

			if ( nodeParentOffset.currentStyle ) {
				if ( nodeParentOffset.currentStyle.position != "relative" ) nodeLeft += nodeParentOffset.offsetLeft;
			}
			else
			{
				nodeLeft += nodeParentOffset.offsetLeft;
			}

			nodeParentOffset = nodeParentOffset.offsetParent;
		}	

		return nodeLeft;

	} catch ( e ) { return 0; }
}


var $stopPropagation = function ( e ) {
	try {
		if ( window.IE ) {
			event.cancelBubble = true;
		}
		else
		{
			e.stopPropagation();
		}
	} catch ( e ) {}
}
var $preventDefault = function ( e ) {
	try {
		if ( e.preventDefault ) { e.preventDefault() } else { e.returnValue = false };
	} catch ( e ) {}
}

var $setAttributes = function ( node, attrList ) {
	try {
		for ( var i in attrList ) {
			node [ i ] = attrList[ i ];
		}
	} catch ( e ) {}
}

var $getInnerText = function ( node ) {
	try {
		var node = $( node );
		return node.innerText || node.textContent;

	} catch ( e ) { }	
} 

var $delNode = function ( node ) {
	try {
		node = $ ( node );
		node.parentNode.removeChild( node ); 
	} catch ( e ) {};
}

var $toSource = function ( obj, name ) {
	try {

 		var c = obj.constructor.toString();
 		var tmpArr = [];
 		var tmpName = ( name )? '"'+name+'"'+':' : "";

 		if ( c.match( /Object/g ) ) {
 			var tmpOArr = []
 			for ( var i in obj ) {
 				tmpOArr.push( $toSource( obj[i], i ) );
 			}
 			tmpArr.push( tmpName+ "{" + tmpOArr.join() + "}" );
 		}
 		if ( c.match( /Array/g ) ) {
 			var tmpAArr = []
 			for ( var i=0, l=obj.length; i<l; i++) {
 				tmpAArr.push( $toSource( obj[i] ) );
 			}
 			tmpArr.push( tmpName + "[" + tmpAArr.join() + "]" );
 		}
 		else if ( c.match( /String/g ) ) {
 			var tmpStr = obj.replace(/(\\)/g, '\\');
 			tmpStr = tmpStr.replace(/(")/g, '\\"');
 			tmpArr.push( tmpName + '"' + tmpStr + '"' );
 		}
 		else if ( c.match( /Number/g ) ) {
 			tmpArr.push( tmpName + obj );
 		}
 		return tmpArr.join();
	
	} catch ( e ) { };
};

var $swapClassName = function( node, className ) {
	try {
		$applyClassName( node, className, !( $matchClassName( node, className ) ) );
	} catch ( e ) { };
};

var $explodeUrlParams = function (){
	try {
		var tmpArr = document.location.href.split("#!");
		if ( tmpArr.length <= 1 ) {
			return false;
		}
		else 
		{
			var tmpArr = tmpArr[1].split("?");
			var res = { page: tmpArr[0], params: ( tmpArr[ 1 ] )? tmpArr[ 1 ] : "" };
			return res;
		}
	} catch ( e ) { return false };
};

var obj2url = function ( obj ) {
	try {
		var res = [];
		for ( var i in obj ) {
			if ( obj.hasOwnProperty( i ) ) {
				res.push( i + "=" + escape( obj[ i ] ) );
			};
		};
		return res.join("&");
	} catch ( e ) { return "" };
};

var $applyAttr = function ( node, attrName, state ) {
	try {
		node = $( node );

		if ( state ) {
			node.setAttribute( attrName, attrName );
		}
		else
		{
			node.removeAttribute( attrName );
		}
	} catch ( e ) {}
};

var $splitGET = function ( str ) {
	try {
		var tmpObj = {};

		var paramList = str.split( "&" );

		for ( var i = paramList.length; i--; ) {
			var keyVal = paramList[i].split("=");
			tmpObj[ keyVal[0] ] = keyVal[1];
		};

		return tmpObj;
	} catch ( e ) {}
};

var $cl = function ( node ){
	try {
		if ( node.href ) document.location.href = node.href;
	} catch ( e ) { }
};
