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;
	},
	
	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) {
		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;
	},
	
	round : function(numb, precision) {
		var mult;
		var val = numb;
		
		precision = parseInt(precision) || 0;
	
		mult = Math.pow(10, precision);
		
		val *= mult;
		val = Math.round(val);
		val /= mult;
		
		return val;
	},
	
	/*
	* @Effects
	*/
	show : function(el, delay, callback, args) {
		var interval = setInterval( function() {
				var opacity, maxOpacity;
				
				if(document.all && !self.opera) {
					//var opacity = parseInt(/(\d+)/.exec(el.style.filter.toString())[1]);
					opacity = el.filters.item("DXImageTransform.Microsoft.Alpha").Opacity;
					maxOpacity = 100;				
				} else {
					opacity = parseFloat(el.style.opacity);
					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)+")";
						el.filters.item("DXImageTransform.Microsoft.Alpha").Opacity = opacity + 10;
					} else {
						el.style.opacity = ABC.round(opacity + 0.1, 1);
					}
				}
			}
		, delay);	
	},
	
	hide : function(el, delay, callback, args) {
		var interval = setInterval( function() {
				var opacity;
				
				if(document.all && !self.opera) {
					//var opacity = parseInt(/(\d+)/.exec(el.style.filter.toString())[1]);
					opacity = el.filters.item("DXImageTransform.Microsoft.Alpha").Opacity;
				} else {
					opacity = parseFloat(el.style.opacity);
				}
				if(opacity < 0.09) {
					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)+")";
						el.filters.item("DXImageTransform.Microsoft.Alpha").Opacity = opacity - 10;
					} else {
						el.style.opacity = ABC.round(opacity - 0.1, 1);
					}
				}
			}
		, delay);	
	},
	
	resize : function(el, newWidth, newHeight, duration, callback) {
		//var oneIerval = 100;
		var loops = Math.ceil(duration / 80);
		var height = el.offsetHeight;
		var width = el.offsetWidth;
		
		//alert(newWidth);
		
		el.style.width	= width+'px';
		el.style.height	= height+'px';
		
		var dH = Math.abs(newHeight - height) / loops;
		var dW = Math.abs(newWidth - width) / loops;
		var hSign = (newHeight - height) / Math.abs(height - newHeight);
		var wSign = (newWidth - width) / Math.abs(width - newWidth);
		
		if(isNaN(hSign)) {
			hSign = 0;	
		}
		if(isNaN(wSign)) {
			wSign = 0;	
		}
		// Предусмотреть: может изменяться только одна сторона.
		
		var interval = setInterval(			
			function() {
				var h, w;
				if( (h = parseInt(el.style.height)) != newHeight) {
					el.style.height = ABC.getNewSize(h, newHeight, dH, hSign)+'px';
				} else {
					el.style.width = newWidth+'px';
					clearInterval(interval);
					callback();
					return true;
				}
				
				if( (w = parseInt(el.style.width)) != newWidth) {
					el.style.width = ABC.getNewSize(w, newWidth, dW, wSign)+'px';
				} else {
					el.style.height = newHeight+'px';
					clearInterval(interval);
					callback();
					return true;
				}
			}
		, 100);
	},
	
	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;
    }
}
*/
