(function(){
	if(!window.DJP) window['DJP'] = {}
	
	// private
    function returnTarget(evt){
		evt = (evt) ? evt : ((window.event) ? window.event : "");
		var elt = null;
		if(evt.target){
			elt = evt.target;
		}else if(evt.srcElement){
			elt = evt.srcElement;
		}
		return elt;
	}	

	//public
		/* PROTOTYPES */
	Array.prototype.inArray = function(value){
		var returnArray = false;
		for(i=0;i<this.length; i++){
			if(typeof(value) == 'function'){
				if(value.test(this[i])){
					if(!returnArray){ 
						returnArray = [];
					}
					returnArray.push(i);
				}
			}else{
				if(this[i]===value){
					if(!returnArray){
						returnArray = []
					}
					returnArray.push(i);
				}
			}
		}
		return returnArray;
	};	
	Array.prototype.is_inArray = function(value){
		var found = false;
		for(i=0;i<this.length; i++){
			if(this[i] == value){
				found = true;
			}
		}
		return found;
	};
	String.prototype.trim = function(){
	   return this.replace(/^\s+|\s+$/g,"");
	}
	String.prototype.stripTags = function(){
	   return this.replace(/<([^>]+)>/g,'');
	}
	
	function getElementsByClassName(className, tag, elm){
		if (document.getElementsByClassName) {
			getElementsByClassName = function (className, tag, elm) {
				elm = elm || document;
				var elements = elm.getElementsByClassName(className),
					nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
					returnElements = [],
					current;
				for(var i=0, il=elements.length; i<il; i+=1){
					current = elements[i];
					if(!nodeName || nodeName.test(current.nodeName)) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		else if (document.evaluate) {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = "",
					xhtmlNamespace = "http://www.w3.org/1999/xhtml",
					namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
					returnElements = [],
					elements,
					node;
				for(var j=0, jl=classes.length; j<jl; j+=1){
					classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
				}
				try	{
					elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
				}
				catch (e) {
					elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
				}
				while ((node = elements.iterateNext())) {
					returnElements.push(node);
				}
				return returnElements;
			};
		}
		else {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = [],
					elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
					current,
					returnElements = [],
					match;
				for(var k=0, kl=classes.length; k<kl; k+=1){
					classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
				}
				for(var l=0, ll=elements.length; l<ll; l+=1){
					current = elements[l];
					match = false;
					for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
						match = classesToCheck[m].test(current.className);
						if (!match) {
							break;
						}
					}
					if (match) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		return getElementsByClassName(className, tag, elm);
	};	
	window['DJP']['getElementsByClassName'] = getElementsByClassName;
		/* COOKIES */
	function getCookie(name){
		var start = document.cookie.indexOf(name + "=" );
		var len = start + name.length + 1;
		if((!start) && (name != document.cookie.substring(0,name.length))) {
			return null;
		}
		if(start == -1){
			return null;
		}
		var end = document.cookie.indexOf(';',len);
		if(end == -1){
			end = document.cookie.length;
		}
		return unescape(document.cookie.substring(len,end));
	}
	window['DJP']['getCookie'] = getCookie;
	
	function setCookie(name,value,expires,path,domain,secure){
		var today = new Date();
		today.setTime( today.getTime() );
		if(expires){
			expires = expires * 1000 * 60 * 60 * 24;
		}
		var expires_date = new Date(today.getTime()+(expires));
		document.cookie = name+'='+escape(value) +
			( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
			( ( path ) ? ';path=' + path : '' ) +
			( ( domain ) ? ';domain=' + domain : '' ) +
			( ( secure ) ? ';secure' : '' );
	}
	window['DJP']['setCookie'] = setCookie;

	function deleteCookie(name,path,domain){
		if(getCookie(name)){
			document.cookie = name + '=' +
				( ( path ) ? ';path=' + path : '') +
				( ( domain ) ? ';domain=' + domain : '' ) +
				';expires=Thu, 01-Jan-1970 00:00:01 GMT';
		}
	}
	window['DJP']['deleteCookie'] = deleteCookie;
	
		/* EVENTS */
	function addLoadEvent(func){
		var oldonload = window.onload;
		if(typeof window.onload != 'function') {
			window.onload = func;
		}else{
			window.onload = function() {
				oldonload();
				func();
			}
		}
	}
	// Add an event for window.onload
	window['DJP']['addLoadEvent'] = addLoadEvent;
	
	function addEvent(elm,func,ev){
		if(window.addEventListener){ // W3C
			elm.addEventListener(ev,func,false);
		}else{ // IE
			ev = 'on'+ev;
			elm.attachEvent(ev, func);
		}
	}
	// Add event
	window['DJP']['addEvent'] = addEvent;
	
	function removeEvent(elm,func,ev){
		if(elm.removeEventListener){
			elm.removeEventListener(ev,func,false);
		}else{
			ev = 'on'+ev;
			elm.detachEvent(ev,func);
		}
	}
	// Remove event
	window['DJP']['removeEvent'] = removeEvent;
		
	function getThis(id,e){
		var elem1 = id;
		var elem2 = returnTarget();
		if(elem2 != null && elem2 != undefined){
			var elem = elem2;
		}else{
			var elem = elem1;
		}
		return elem;
	}
	// Use to retreive the owner of the event for IE
	window['DJP']['getThis'] = getThis;
	
		/* STRING MANIPULATION */
	function remove_accents(s){
		var accents = {
			'é':'e', 
			'è':'e', 
			'ê':'e', 
			'ë':'e',
			//upper
			'É':'e',
			'È':'e',
			'Ê':'e',
			'Ë':'e',
			/*
			'æ':'ae',
			//upper
			'Æ':'ae',
			*/
			'à':'a', 
			'à':'a', 
			'â':'a', 
			'ä':'a', 
			'å':'a', 
			'à':'a',
			//upper
			'À':'a',
			'É':'a',
			'Â':'a',
			'Ä':'a',
			'Å':'a',
			
			'ç':'c',
			//upper
			'Ç':'c',
			
			'ì':'i',
			'í':'i',
			'î':'i',
			'ï':'i',
			//upper
			'Í':'i',
			'Î':'i',
			'Ï':'i',
			'Ì':'i',
			
			'ñ':'n',
			//upper
			'Ñ':'n',
			
			'ò':'o',
			'ó':'o',
			'ô':'o',
			'ö':'o',
			'õ':'o',
			'ø':'o',
			//upper
			'Ó':'o',
			'Ò':'o',
			'Ô':'o',
			'Ö':'o',
			'Õ':'o',
			'Ø':'o',
			/*
			'œ':'oe',
			//upper
			'Œ':'oe',
			*/
			'ù':'u',
			'ú':'u',
			'û':'u',
			'ü':'u',
			//upper
			'Ù':'u',
			'Ú':'u',
			'Û':'u',
			'Ü':'u',
			
			'ÿ':'y',
			//upper
			'Ÿ':'y'
			};
		for(i in accents){
			var re = new RegExp(i,"g");
			s = s.replace(re,accents[i]);
		}
		return s;
	}
	// Removes accents in string, for comparison purposes
	window['DJP']['removeAccents'] = remove_accents;
	
	function createRandomWord(length) {
		var consonants = 'bcdfghjklmnpqrstvwxyz';
		var vowels = 'aeiou';
		var rand = function(limit) {
				return Math.floor(Math.random()*limit);
			}
		var length = parseInt(length,10);
		var consonants = consonants.split('');
		var vowels = vowels.split('');
		
		for (var i=0,word='';i<length/2;i++) {
			var randConsonant = consonants[rand(consonants.length)];
			var randVowel = vowels[rand(vowels.length)];
			word += (i===0) ? randConsonant.toUpperCase() : randConsonant;
			word += i*2<length-1 ? randVowel : '';
		}
		return word;
	}
	// Creat random word on the fly, useful for development
	window['DJP']['createRandomWord'] = remove_accents;
	
		/* STYLES */
	function hasClass(elem,cl){
		var classes = elem.className.split(' ');
		for(var i=0;i<classes.length;i++){
			if(classes[i] == cl){
				return true;
			}
		}
		return false;
	}
	// returns true of false according to if the class is found for the given element
	window['DJP']['hasClass'] = hasClass;
	
	function addClass(elem,cl){
		if((hasClass(elem,cl))||(typeof elem=='undefined')) return;
		elem.className += " "+cl;
	}
	// checks if it exists already, if not, adds the class to the given element
	window['DJP']['addClass'] = addClass;
	
	function removeClass(elem,cl){
		if((!hasClass(elem,cl)) || (typeof elem == 'undefined')) return;
		var classes=elem.className.split(" ");
		var result=[];
		for(var i in classes){
			if(classes[i] != cl){
				result.push(classes[i]);
			}
		}
		elem.className = result.join(" ");
	}
	// checks if it has the class, and removes it
	window['DJP']['removeClass'] = removeClass;
	
		/* DOM */
	function removeChildrenFromNode(node) {
		if(node.hasChildNodes()) {
			while(node.childNodes.length >= 1 ) {
				node.removeChild(node.firstChild);       
			} 
		}
	}
	window['DJP']['removeChildren'] = removeChildrenFromNode;
	
	function removeMe(node){
		node.parentNode.removeChild(node);
	}
	window['DJP']['removeElement'] = removeMe;
	
	
		/* AJAX */
	function do_ajax(method,url,data,returnType,reponseFunc,sync){
		var async = !sync ? true : false; // if set to true in method, will perform a synchronous request
		if(method == 'GET'){
			var d = new Date()
			url += ("?"+data+"&timestamp="+d.getTime());
			params = null;
		}else{
			params = data;
		}
		switch(returnType){
			case 'XML':
			case 'JSON':
			case 'HTML':
			case 'TEXT':
			break;
			default:
				alert('Unsupported return type for AJAX request');
				return;
			break;
		}
		var xmlHttp=null;
		try{
			xmlHttp=new XMLHttpRequest();// W3C
		}catch(e){
			try{
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");// IE
			}catch(e){
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");// IE < 6
			}
		}

		xmlHttp.open(method,url,async);
		if(method == 'POST'){
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
		}
		xmlHttp.onreadystatechange = function(){
			if(xmlHttp.readyState == 4){
				if (xmlHttp.status == 200 || xmlHttp.status == 304) {
                var data;
				var OK;
					try{
						if(returnType == 'XML'){
							data = xmlHttp.responseXML;
							alert(data)
						}else{
							data = xmlHttp.responseText;
							if(returnType == 'JSON'){
								data = eval('('+data+')');
							}
						}
						OK = true;
					}catch(e){
						OK = false;
					}
					if(OK){
						reponseFunc(data);
					}else{
						alert("An AJAX error occured - could not retreive data");
					}
				}
			}
		}
		xmlHttp.send(params);
	}
	// Perform an AJAX request
	window['DJP']['ajax'] = do_ajax;
	
	function getDaysPerMonth(month, year){
		month--;
		monthMaxDays	= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		monthMaxDaysLeap= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		/* 
		Check for leap year. These are some conditions 
			to check year is leap year or not...
		1.Years evenly divisible by four are normally 
			  leap years, except for... 
		2.Years also evenly divisible by 100 are not 
			  leap years, except for... 
		3.Years also evenly divisible by 400 are 
			  leap years. */
		if ((year % 4) == 0){
			if ((year % 100) == 0 && (year % 400) != 0){
				return monthMaxDays[month];
			}
			return monthMaxDaysLeap[month];
		}else{
			return monthMaxDays[month];
		}
	}
	window['DJP']['getDaysInMonth'] = getDaysPerMonth;
	
	
	
	/*
	aimation
	*/
	
	function slideElem(elem,finish,steps,intervals,powr,callback) { 
		if (elem.slideElemInt)
			window.clearInterval(elem.slideElemInt);
		var actStep = 0;
		var something = elem.style.marginLeft != '' ? elem.style.marginLeft : 0;
		var startMargin = parseInt(something);
		var endMargin = startMargin + finish;
		elem.slideElemInt = window.setInterval(
		function() { 
		  elem.currentMargin = easeInOut(startMargin,endMargin,steps,actStep,powr);
		  elem.style.marginLeft = elem.currentMargin + "px"; 
		  actStep++;
		  if (actStep > steps){
			  window.clearInterval(elem.slideElemInt);
			  callback();
		  }
		} 
		,intervals)
	}
	window['DJP']['slideMargin'] = slideElem;
	
	function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) { 
		var delta = maxValue - minValue; 
		var stepp = minValue+(Math.pow(((1 / totalSteps) * actualStep), powr) * delta); 
		return Math.ceil(stepp) 
	} 

	
	
	Preloader = {
	  callbacks: [],
	  images: [],
	  loadedImages: [],
	  imagesLoaded: 0,
	
	  add: function(image){
		if (typeof image == 'string') this.images.push(image);
		if (typeof image == 'array' || typeof image == 'object'){
		  for (var i=0; i< image.length; i++){
			this.images.push(image[i]);
		  }
		}
	  },
	  onFinish: function(func){
		if (typeof func == 'function') this.callbacks.push(func);
		if (typeof func == 'array' || typeof func == 'object'){
		  for (var i=0; i< func.length; i++){
			this.callbacks.push(func[i]);
		  }
		}
	  },
	  load: function(){
		for(var i=0; i<this.images.length; i++){
		  this.loadedImages[i] = new Image();
		  this.loadedImages[i].onload = function(){ Preloader.checkFinished.apply(Preloader) }
		  this.loadedImages[i].src = this.images[i];
		}
	  },
	
	  checkFinished: function(){
		this.imagesLoaded++;
		if (this.imagesLoaded == this.images.length) this.fireFinish();
	  },
	  fireFinish: function(){
		for (var i=0; i<this.callbacks.length; i++){
		  this.callbacks[i]();
		}
		this.images = [];
		this.loadedImages = [];
		this.imagesLoaded = 0;
		this.callbacks = [];
	  }
	}	
	window['DJP']['Preloader'] = Preloader;
	
})();
/*
	AJAX EXAMPLE

DJP.ajax("POST","../save_video.php","snippets=40&fb_sig_user=0","JSON",myFunc);
function myFunc(data){
	// handle our data
}
*/

