ABC = {
	/*	
	* @Position
	*/	
	position: function(el) {
		var p = { x: el.offsetLeft, y: el.offsetTop };
		while (el.offsetParent)	{
			el = el.offsetParent;
			p.x += el.offsetLeft;
			p.y += el.offsetTop;
			if (el != document.body && el != document.documentElement) {
				p.x -= el.scrollLeft;
				p.y -= el.scrollTop;
			}
		}
		return p;
	},
	
	screenSize: function() {
	    var w, h;
	    w = (window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth));
	    h = (window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight));
	    
	    return {w:w, h:h};
	},
	
	getBrowserWindowSize: function() {
		var w, h;
	
		if(window.outerHeight) {
			h = window.outerHeight;
			w = window.outerWidth;
		} else if (screen.availHeight) {
			h = screen.availHeight;
			w = screen.availWidth;
		}
		
		return {w:w, h:h};
	},
	
	getBodyScrollTop: function() {
	  return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
	},
	
	getBodyScrollLeft: function() {
	  return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
	},
	
	getCursorPosition: function(oEvent) {
		var mouseX = (oEvent || window.event).clientX;
		var mouseY = (oEvent || window.event).clientY;
		
		if (ABC.getBodyScrollTop() > 0) {
			mouseY = mouseY + ABC.getBodyScrollTop();
		}
		
		return {x: mouseX, y: mouseY};
	},	
	
	
	/*	
	* @Event processing 
	*/
	addEvent: function(elm, evType, fn, useCapture) {
	    if (elm.addEventListener) {
	        elm.addEventListener(evType, fn, useCapture);
	        return true;
	    }
	    else if (elm.attachEvent) {
	        var r = elm.attachEvent('on' + evType, fn);
	        return r;
	    }
	    else {
	        elm['on' + evType] = fn;
	    }
	},
	
	cancelDefaultEvent: function(oEvent) {
		oEvent = (oEvent) ? oEvent : window.event;
		
		if(oEvent.preventDefault) {
			oEvent.preventDefault();	
		} else {
			oEvent.returnValue = false;	
		}
	},
	
	/*
	* @Selectors
	*/
	getElementsByClass: function(searchClass, node, tag) {
	    var classElements = new Array();
	    if ( node == null )
	        node = document;
	    if ( tag == null )
	        tag = '*';
	    var els = node.getElementsByTagName(tag);
	    var elsLen = els.length;
	    var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
	    for (i = 0, j = 0; i < elsLen; i++) {
	        if ( pattern.test(els[i].className) ) {
	            classElements[j] = els[i];
	            j++;
	        }
	    }
	    return classElements;
	},
	
	isLeapYear: function(year) {
		// год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400
    return !(year % 4) && (year % 100) || !(year % 400) ? true : false;
  	},
  	
  	/*
	* @Misc
	*/	
	$: function() {
	    var elements = new Array();
	    for (var i = 0; i < arguments.length; i++) {
	        var element = arguments[i];
	        if (typeof element == 'string')
	            element = document.getElementById(element);
	        if (arguments.length == 1)
	            return element;
	        elements.push(element);
	    }
	    return elements;
	},
	
	create: function(el, attributes, content) {
		var newEl = null;
		
		// if IE
		if(document.all && !self.opera) {
			var attrList = '';
			if(attributes) {
				for(attr in attributes) {					
					attrList += ' '+attr+'="'+attributes[attr]+'"'
				}
			}
			
			newEl = document.createElement('<'+el+attrList+'>');
			
		} else {
		
			newEl = document.createElement(el);
			if(attributes) {
				for(attr in attributes) {					
					newEl.setAttribute(attr, attributes[attr]);
				}
			}
			
		}
		
		if(content) {			
			if(typeof content == 'string') {											
				newEl.appendChild( document.createTextNode(content) );
			} else if(typeof content == 'object') {				
				newEl.appendChild(content);
			} else {
				newEl.appendChild( document.createTextNode(content.toString()) );
			}
		}
		
		return newEl;
	},
	
	toggleClass: function(el, class1, class2) {
		el = (typeof el == 'string') ?
			ABC.$(el) : (typeof el == 'object') ?
				el : null;
		if(!el || !el.className) {
			return null;	
		}
		
		if( el.className.indexOf(class1) >= 0) {
			el.className = el.className.replace(class1, class2);
			return class1;
		} else if( el.className.indexOf(class2) >= 0) {
			el.className = el.className.replace(class2, class1);
			return;
		}
	},
	
	inArray : function(arr, el) {
		for(var i = 0; i < arr.length; i++) {
			if(arr[i] == el) {
				return true;	
			}
		}
		return false;
	}
}

/*
function findClass(str, node) {
    if(document.getElementsByClassName) return (node || document).getElementsByClassName(str);
    else {
        var node = node || document, list = node.getElementsByTagName('*'), length = list.length, Class = str.split(/\s+/), classes = Class.length, array = [], i, j, key;
        for(i = 0; i < length; i++) {
            key = true;
            for(j = 0; j < classes; j++) if(list[i].className.search('\\b' + Class[j] + '\\b') == -1) key = false;
            if(key) array.push(list[i]);
        }
        return array;
    }
}
*/