var alreadyrunflag=0;
(function(){

var nvjs = window.nvjs = window.$$ = function(selector){
	return new nvjs.core.init(selector);
}


nvjs.core =  nvjs.prototype = {
	Name : "Nikolay Vasilev Java Script Framework",
	Version : "0.2 Alpha",
	selector : "",
	
	init: function(selector){
		var retElm = false;
		
		if(selector.toString().substr(0,1) == "|"){
			retElm = true;
			selector = selector.toString().substr(1);
		}
			
		if(typeof(selector) == "undefined")
			return false;
			
			
		if(typeof(selector) == "object"){
			this.selector = [selector];
			return this;
		}
	
		
		if(selector.toString().substr(0,1) == "#"){
			var arr = [];
			
			if(!document.getElementById(selector.substr(1))){
				//alert("Няма елемент с id: "+selector)
				return;		
			}
			
			
			if(retElm){
				return document.getElementById(selector.substr(1));
			}else{
				arr.push(document.getElementById(selector.substr(1)));
				this.selector = arr;	
				return this;			
			}
		}	

		if(selector.toString().substr(0,1) == "."){
			var node = false; //could be in parameter parentNode > selector
			if(!node) node = document.getElementsByTagName("body")[0];//this.get("body")[0];
			
			
			var re = new RegExp('\\b' + selector.substr(1) + '\\b');
			var els = document.getElementsByTagName("*"); //this.get("*");
			var arr = [];
			
			for(var i=0,j=els.length; i<j; i++){
				if(re.test(els[i].className)){
					arr.push(els[i]);
				}
			}
			
			if(retElm){
				return arr;
			}else{
				this.selector = arr;
				return this;
			}
		}
		
		if(typeof(selector) == "string"){
			this.selector = document.getElementsByTagName(selector);
			return this;
		}
		
		return this;
	},
	
	info : function(){
		alert(this.Name + " version " + this.Version);
		return this;
	}
}


nvjs.core.init.prototype = nvjs.core;

nvjs.ready = function(callback){

if(!alreadyrunflag){
	if (document.addEventListener){
	  document.addEventListener("DOMContentLoaded", function(){alreadyrunflag=1; callback()}, false)
	}else if (document.all && !window.opera){
	  document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>')
		var contentloadtag=document.getElementById("contentloadtag");
	   
	   nvjs.event.add(contentloadtag, "readystatechange", function(e){
			evt = nvjs.event.getTarget(e);
			
			if (evt.readyState=="complete"){
			  alreadyrunflag=1;
			  callback();
			}
		});
	}
}


}


nvjs.extend = nvjs.core.extend = function(){
	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;


	if ( length == i ) {
		target = this;
		--i;
	}
	
	
	for ( ; i < length; i++ )
		if ( (options = arguments[ i ]) != null )
			for ( var name in options ) {
				var src = target[ name ], copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy )
					continue;

				// Recurse if we're merging object values
				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
					target[ name ] = nvjs.extend( deep, 
						src || ( copy.length != null ? []:{})
					, copy );

				// Don't bring in undefined values
				else if ( copy !== undefined )
					target[ name ] = copy;

			}

	// Return the modified object
	return target;
}



var userAgent = navigator.userAgent.toLowerCase();

nvjs.array = {
	search : function(arrayObject, searchString){
		var arr2str = arrayObject.toString();
		
		var ret = (arr2str.search(searchString) != -1)?true:false
		
		return ret;
	}
}


		

nvjs.form = {
	formCheck : function(obj, fields){	
		
		var error = false;
		var i = obj.elements.length-1;
		
		for( ;i>=0;i--){
		

			if(obj.elements[i].name == "email" && !obj.elements[i].value.match(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i)){
				error = obj.elements[i];
			}

	
			if(obj.elements[i].name == "phone"){
				rePhoneNumber = new RegExp(/^[0-9 \+-/]{4,20}$/);
			
				if(!rePhoneNumber.test(obj.elements[i].value)){
					error = obj.elements[i];
				}

		
			}else if(nvjs.array.search(fields, obj.elements[i].name.toString())){
				if(obj.elements[i].value == "")
				{
					error = obj.elements[i];
				}
			}
		}
		
		if(!error){
			obj.submit();
		}else{
			try{
			$$(error).add(false, "keydown", function(e){
				var targ = nvjs.event.getTarget(e);
				$$(targ).css("border", "1px solid #ccc");
			});
						
			$$(error).css("border", "1px solid red");
				error.focus();
			}catch(e){}
			return false;
		}
		
		return true;
	}
}

nvjs.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};

nvjs.event = {
	event : {},
	target : "",
	type : "",
	mouseX : "",
	mouseY : "",
	
	
	
	add : function(obj,evt,fn) {
		if (!obj)
			obj = this.selector;
		else
			this.selector = [obj];

		
		if (window.addEventListener){
			var i = 0;

			for( ;i<this.selector.length;i++){
				this.selector[i].addEventListener(evt,fn,false);
			}
		}else if (window.attachEvent){
			var i = 0;

			for( ;i<this.selector.length;i++){
				this.selector[i].attachEvent('on'+evt,fn);
			}
		}
		
		return this;
	},

	remove : function(obj,evt,fn) {
		if (!obj)
			obj = nvjs.selector
			
		if (obj.removeEventListener)
			obj.removeEventListener(evt,fn,false);
		else if (obj.detachEvent)
			obj.detachEvent('on'+evt,fn);
	},
	
	getTarget: function(e){
 		if (!e) this.event = window.event;
		if (e.target) this.target = e.target;
		else if (e.srcElement) this.target = e.srcElement;
		if (this.target.nodeType == 3) // defeat Safari bug
			this.target = this.target.parentNode;
		
		return this.target;
	},
	
	kill: function(e){	
		if(!e) var e = window.event;
		e.cancelBubble = true;
		e.returnValue = false;

		if (e.stopPropagation) {
			e.stopPropagation();
			e.preventDefault();
		}
	},
	

	getMouseX: function(e){
		if (e.pageX){
			this.mouseX = e.pageX;
		}else if (e.clientX){
			this.mouseX = e.clientX + d.body.scrollLeft
				+ d.documentElement.scrollLeft;
		}
		
		return this.mouseX;
	},

	getMouseY: function(e){
		if (e.pageY){
			this.mouseY = e.pageY;
		}else if (e.clientY){
			this.mouseY = e.clientY + d.body.scrollTop
				+ d.documentElement.scrollTop;
		}

		return this.mouseY;
	}
}

nvjs.css = {
	addClass: function(sClassName){
		nvjs.core.selector.className = nvjs.core.selector.className + " " + sClassName;
		
		return this;
	},
	
	setClass: function(sClassName){
		var i = 0;

		for( ;i<this.selector.length;i++){
			this.selector[i].className = sClassName;
		}
		
		
		return this;
	},
	
	
	removeClass: function(sClassName){
	//	var classParts = nvjs.selector.className.split(" ");
		
		
	//	return true;
	},
	
	css: function(rule, value){
		var i = 0;
		
		for( ;i<this.selector.length;i++){
			this.selector[i].style[rule] = value;
		}
			
		return this;
	},
	
	getcss: function(css){
		var i = 0;
	
		for( ;i<this.selector.length;i++){
			eNode = this.selector[i];
			var val= '', str= '';
			
			val= eNode.style[css];
			
			if(!val){
				
				if(!eNode || eNode.style== undefined) return '';
				if(/\-/.test(css)){
					str= css.replace(/\-[a-z]/g, function(w){
						return w.charAt(1).toUpperCase() + w.substring(2);
					})
				}
			
				val= eNode.style[str];
			}
			

			if(!val){
				if(eNode.currentStyle) val= eNode.currentStyle[str];
				else{
					var dv= document.defaultView || window;
					if(dv && dv.getComputedStyle){
						val= dv.getComputedStyle(eNode,'').getPropertyValue(css);
					}
				}
			}
			
		
		
			return (val)? val: '';
		}
	}
 
}


nvjs.effects = {
	roundCorners: function(which, value){
		if(nvjs.browser.mozilla){
			//nvjs.css.add("-moz-border-radius", value);
			
			var i = 0;

			for( ;i<this.selector.length;i++){

				this.selector[i].style["MozBorderRadius"] = value;
			}
	
		//	nvjs.css.add("-moz-border-radius-topleft", value);
		//	nvjs.css.add("-moz-border-radius-topright", value);
		//	nvjs.css.add("-moz-border-radius-bottomleft", value);
		//	nvjs.css.add("-moz-border-radius-bottomright", value);
		}else if(nvjs.browser.safari){
			this.css("-webkit-border-radius", value);
		
		//	nvjs.css.add("-webkit-border-top-left-radius", value);
		//	nvjs.css.add("-webkit-border-top-right-radius", value);
		//	nvjs.css.add("-webkit-border-bottom-left-radius", value);
		//	nvjs.css.add("-webkit-border-bottom-right-radius", value);
		}
		
		return this;
	},
	
	setOpacity : function(value) {
		try{			
			var i = 0;

			for( ;i<this.selector.length;i++){
				if(nvjs.browser.msie)
					this.selector[i].style.filter = 'alpha(opacity=' + value*10 + ')';
				else
					this.selector[i].style["opacity"] = value/10;
			}

		}catch(e){}
	}
}

nvjs.position = {

	getGlobalX: function(obj){
		if (!obj)
			obj = nvjs.selector;
			
    var curleft = 0;
    if(obj.offsetParent)
        while(1) 
        {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
  },

  getGlobalY: function(obj){
		if (!obj)
			obj = nvjs.selector;
			
    var curtop = 0;
    if(obj.offsetParent){
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
	}else if(obj.y)
        curtop += obj.y;
    return curtop;
  }
 
}

nvjs.getDocSize = function(){
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  
  var retArr = Array(myWidth, myHeight);
  
  return retArr;
}

nvjs.getDocFull = function(){
	if (window.innerHeight && window.scrollMaxY) {// Firefox
		yWithScroll = window.innerHeight + window.scrollMaxY;
		xWithScroll = window.innerWidth + window.scrollMaxX;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		yWithScroll = document.body.scrollHeight;
		xWithScroll = document.body.scrollWidth;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		yWithScroll = document.body.offsetHeight;
		xWithScroll = document.body.offsetWidth;
  	}
	arrayPageSizeWithScroll = new Array(xWithScroll,yWithScroll);
	//alert( 'The height is ' + yWithScroll + ' and the width is ' + xWithScroll );
	return arrayPageSizeWithScroll;
}


nvjs.getScrollXY = function(){

  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];

}

nvjs.ajax = {
	rq: "",
	targ: "",

	makeRequest: function(){
		var xmlHttp;
		try{
			xmlHttp=new XMLHttpRequest();
		}catch (e){
			try{
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}catch (e){		
				try{
					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}catch (e){
					alert("Your browser does not support AJAX!");
				return false;
				}
			}
		}
		this.rq = xmlHttp;
	},
	
	loadPage: function(pURL, targElm){
		this.makeRequest();
		this.targ = targElm;
		
		var rq = this.rq;
		this.rq.open('GET', pURL, true);
		this.rq.onreadystatechange = function(){

			if (this.readyState == 4 || this.readyState == 'complete') {
				if (this.status == 200) {
					nvjs.ajax.targ.innerHTML = (this.responseText);
				}else {
					nvjs.ajax.targ.innerHTML = (this.status);
				}
			}
		};
		
		this.rq.send(null);	
		
	}
}

nvjs.tweener = {
	tweenType : {
		'Regular': [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1],
		'Blast': [12,12,11,10,10,9,8,7,6,5,4,3,2,1],
		'Linear': [10,10,10,10,10,10,10,10,10,10]
	},
	obj : "",
	property : "",
	unit : "",
	ease : "",
	easeType : "",
	from : 0,
	to : 0,
	state : 0,
	interval : null,
	time : 0,
	milisecsperframe : 20,
	stepBy : 0,
	frames : [],
	frame : 0,
	finished : true,
	
	tween : function (property, from, to, unit, ease){
		if(nvjs.tweener.finished){
			nvjs.tweener.finished = false;
			nvjs.tweener.obj = this.selector;
			nvjs.tweener.from = from;
			nvjs.tweener.to =  to;
			nvjs.tweener.ease = ease.split(".")[0];
			nvjs.tweener.easeType = ease.split(".")[1];
			nvjs.tweener.property = property;
			nvjs.tweener.unit = unit;	
			
			nvjs.tweener.time = 20;
			nvjs.tweener.stepBy = Math.abs(to-from)/20;
			nvjs.tweener.state = from;
			

			var animDelta = (to-from); // how far to move

			var frameCount = nvjs.tweener.tweenType[nvjs.tweener.ease].length;
			var newFrame = from;
			
			for (var i=0; i<frameCount; i++) {
			  newFrame += (animDelta*nvjs.tweener.tweenType[nvjs.tweener.ease][i]/100);
			  nvjs.tweener.frames[i] = Math.round(newFrame);
			}
			
			
			
			nvjs.tweener.interval = setInterval("nvjs.tweener.exec()", nvjs.tweener.time);
		}
	},
	
	exec : function (){
				
			if(nvjs.tweener.frame != nvjs.tweener.frames.length-1){
				nvjs.tweener.state = nvjs.tweener.frames[nvjs.tweener.frame];
					
				if(nvjs.tweener.state){
					
				var i = 0;
				var len = nvjs.tweener.obj.length;
				
				
				for( ;i<len;i++){
					$$(nvjs.tweener.obj[i]).css(nvjs.tweener.property, nvjs.tweener.state + nvjs.tweener.unit);
				}
				
				}
				nvjs.tweener.frame++;
			}else{
				clearInterval(nvjs.tweener.interval);
				nvjs.tweener.finished = true;
				nvjs.tweener.frame = 0;
			}

	}
 
}

nvjs.URL = {
	getPage : function(){
		var page = window.location.toString().split("/").pop();
		
		return page != "" ? page : "index.php";
	}
}

nvjs.core.extend(nvjs.ajax);
nvjs.core.extend(nvjs.css);
nvjs.core.extend(nvjs.tweener);
nvjs.core.extend(nvjs.event);
nvjs.core.extend(nvjs.form);
nvjs.core.extend(nvjs.effects);


})();
