ABC = {
	/*	
	* @Position, coords
	*/	
	getPosition: 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;
	},
	
	getCursorCoords: function(ev) {
		var posx = 0;
		var posy = 0;
		ev = (ev) || window.event;
		
		if (ev.pageX || ev.pageY) 	{
			posx = ev.pageX;
			posy = ev.pageY;
		}	else if (ev.clientX || ev.clientY) {
			posx = ev.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			posy = ev.clientY + document.body.scrollTop	+ document.documentElement.scrollTop;
		}
		
		return {x:posx, y:posy};
	},
	
	getClientAreaSize: 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;
	    }
	},
	
	removeEvent: function(elm, evType, fn, useCapture) {
		if (elm.removeEventListener) {
        elm.removeEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.detachEvent) {
        var r = elm.detachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = function(){};
    }
	},
	
	ready : function(fnc) {
		var fncArgs = [];
		var len = arguments.length;
		
		if(len > 1) {
			for(var i = 1; i < len; i++ ) {
				fncArgs[fncArgs.length] = arguments[i];
			}
			ABC.addEvent(window, 'load', function(){ fnc(fncArgs); }, false);
			return true;
		}
		
		ABC.addEvent(window, 'load', fnc, false);
	},
	
	getEventSrc: function(ev) {
		ev = (ev) || window.event;
		return ev.srcElement || ev.target;
	},
	
	cancelDefaultEvent: function(oEvent) {
		oEvent = (oEvent) ? oEvent : window.event;		
		
		if(oEvent.preventDefault) {
			oEvent.preventDefault();	
		} else if(oEvent.stopPropagation) {
			oEvent.stopPropagation();
		} else {
			oEvent.returnValue = false;	
		}
		
		oEvent.cancelBubble = true;
		/*
		event.cancelBubble = true;
		// и другие ивенты на клик правой кнопкой
		if (event.stopPropagation) event.stopPropagation(); 
		if (event.preventDefault) event.preventDefault();
		*/
	},
	
	/*
	* @Selectors, DOMfncs
	*/
	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;
	},
	
	insertAfter: function(referenceNode, newNode) {
	    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
	},
	
	getNextSibling: function(el, types) {
		if(typeof types == 'string' || typeof types == 'number') {
			types = [types];
		} else if(typeof types == 'undefined') {
			types = [1];
		}
		//var next = el;
		while(el = el.nextSibling) {
			if(ABC.inArray(types, el.nodeType)) {
				return el;	
			}
		}
		return null;
	},
	
	getPreviousSibling: function(el, types) {
		if(typeof types == 'string' || typeof types == 'number') {
			types = [types];
		} else if(typeof types == 'undefined') {
			types = [1];
		}
		while(el = el.previousSibling) {
			if(ABC.inArray(types, el.nodeType)) {
				return el;	
			}
		}
		return null;
	},
	
	isBelong: function(el, inEl) {
		while(el.tagName && el.tagName.toLowerCase() != 'body') {
			el = el.parentNode || null;
			if(el == inEl) {
				return true;
			}
		}
		return false;
	},	  	
  
	$: 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;
	},
	
	/*
	* @Misc
	*/
	
	isLeapYear: function(year) {
		// год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400
    return !(year % 4) && (year % 100) || !(year % 400) ? true : false;
  },	
	
	css: function(el, attributes) {
		if(typeof el.style == 'undefined') {
			el.style = {};	
		}
		
		for(var attr in attributes) {
			el.style[attr] = attributes[attr];
		}
	},
	
	attr: function(el, attributes) {		
		for(var attr in attributes) {
			el[attr] = attributes[attr];
		}
	},
	
	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) {
		// Under construction
	},
	
	inArray : function(arr, el) {
		for(var i = 0; i < arr.length; i++) {
			if(arr[i] == el) {
				return true;	
			}
		}
		return false;
	},
	
	/*
	* @Effects
	*/
	show : function(el, delay, callback, args) {
		var interval = setInterval( function() {
				if(document.all && !self.opera) {
					var opacity = parseInt(/(\d+)/.exec(el.style.filter.toString())[1]);
					var maxOpacity = 100;				
				} else {
					var opacity = parseFloat(el.style.opacity);
					var maxOpacity = 1;
				}
				if(opacity >= maxOpacity) {
					el.style.display = 'block';
					clearInterval(interval);
					if(callback) {
						if(args) {
							callback(args);
						} else {
							callback(el);
						}
					}
					return true;
				} else {
					if(document.all && !self.opera) {
						el.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity="+(opacity + 10)+")";
					} else {
						el.style.opacity = opacity + 0.1;
					}
				}
			}
		, delay);	
	},
	
	hide : function(el, delay, callback, args) {
		var interval = setInterval( function() {
				if(document.all && !self.opera) {
					var opacity = parseInt(/(\d+)/.exec(el.style.filter.toString())[1]);							
				} else {
					var opacity = parseFloat(el.style.opacity);
				}
				if(opacity <= 0) {
					el.style.display = 'none';
					clearInterval(interval);
					if(callback) {
						if(args) {
							callback(args);
						} else {
							callback(el);
						}
					}
					return true;
				} else {
					if(document.all && !self.opera) {
						el.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity="+(opacity - 10)+")";
					} else {
						el.style.opacity = opacity - 0.1;
					}
				}
			}
		, delay);	
	},
	
	resize : function(el, newWidth, newHeight, duration, callback, eachStepCall) {
		var oneIerval	= 10;
		var loops		= Math.ceil(duration / oneIerval);
		var height		= (el.style.height)	? parseInt(el.style.height)	: el.offsetHeight;
		var width		= (el.style.width)	? parseInt(el.style.width)	: el.offsetWidth;
		
		el.style.width	= width+'px';
		el.style.height	= height+'px';
		/*if(eachStepCall) {
			eachStepCall(el);
		}*/
				
		var hSub = newHeight - height;
		var wSub = newWidth - width;
		
		var dH = Math.abs(hSub) / loops;
		var dW = Math.abs(wSub) / loops;
		var hSign = (hSub) / Math.abs(hSub);
		var wSign = (wSub) / Math.abs(wSub);
		
		if(isNaN(hSign)) {
			hSign = 0;	
		}
		if(isNaN(wSign)) {
			wSign = 0;	
		}		
		
		var currentWidth = width;
		var currentHeight = height;
		var interval = setInterval(			
			function() {
				var h, w;
				if( currentHeight != newHeight ) {
					currentHeight = ABC.getNewSize(currentHeight, newHeight, dH, hSign);
					el.style.height = currentHeight+'px';					
				}
				
				if( currentWidth != newWidth ) {
					currentWidth = ABC.getNewSize(currentWidth, newWidth, dW, wSign)
					el.style.width = currentWidth+'px';					
				}
				
				if(currentHeight == newHeight && currentWidth == newWidth) {
					clearInterval(interval);
					callback();
				}
				
				if(eachStepCall) {
					eachStepCall(el);
				}
			}
		, oneIerval);
	},
	
	getNewSize : function(size, newSize, step, sign) {		
		if(Math.abs(newSize - size) <= step) {
			return newSize;
		} else {
			return size + sign * step;
		}		
	},
	
	
	getNewValue : function(value, newValue, step) {		
		if(Math.abs(newValue - value) <= step) {
			return newValue;
		} else {
			var sign = (newValue - value) / Math.abs(newValue - value);
			var newVal = parseFloat(value + sign * step);
			return (Math.abs(newVal) < 0.1) ? 0 : newVal;
		}		
	},
	
	smoothChangeValue : function(fnc, value, newValue, duration, callback) {
		//var oneIerval = 100;		
		var loops	= Math.ceil(duration / 80);
		var step	= (Math.abs(newValue - value) / loops).toFixed(1);
		
		var interval = setInterval(
			function() {
				if( value != newValue) {
					value = ABC.getNewValue(value, newValue, step);					
					fnc(value);
				} else {
					clearInterval(interval);
					callback();
					return true;
				}
			}
		, 80);
	}
}

/*
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;
    }
}
*/
