var browserName = navigator.userAgent; 
var isIE = browserName.match(/MSIE/); // find IE and 

var pageProps = {

	header:"<span class=\"heading\">. . . providing advancements  in <span class=\"redpain\">pain </span> management</span>"
 
};

Array.prototype.reduce=function(templateFunction) {

  for (var i=0;i<this.length;i++)
	{templateFunction(this[i]);}

};

Array.prototype.copyTo=function(arr,idx){

  for (var i=idx;i<arr.length;i++)
	{this.push(arr[i]);}

};

Array.prototype.remove=function(idx){
	
	try{
		// remove the last element
		if(idx===this.length-1){
			this.pop();
			return;
		}
		else{   
			for(var i = idx,l = this.length-1; i<l; i++){
				this[i] = this[i+1]; 
			}
			this.pop();
		}
	}
	catch(e){
		alert(e.message);
	}
};

Array.prototype.addto=function(name,len){

	for(var i = 0;i<len;i++){
		var s = name+(i+1);
		this.push(s);
	}
};

Array.prototype.preloadImgs=function(name,len,ext){

	for(var i = 0;i<len;i++){
		var img = new Image();
		img.src = name+(i+1)+ext;
		this.push(img);
	}
};

Array.prototype.swap=function(idx1,idx2){
	// swap the values
	var tmp = this[idx1];
	this[idx1] = this[idx2];
	this[idx2] = tmp;
};

Array.prototype.isTypeOf=function(t){

	for (var i=0;i<this.length;i++){
		if(typeof this[i] !==t)
		   {return false;}
	}

	return true;
};

if(!Array.indexOf){
	Array.prototype.indexOf=function(n){

		for (var i=0;i<this.length;i++){
			if(n===this[i])
	  	 	{return i;}
		}
		return -1;
	};	
}


var random = function(num){
	return Math.round((Math.random()*num)+0);
};

var newRandom = function(lastnum,num){

	// * newRandom: 
	//   returns a new random number
	var current = lastnum;
	// get new random number
	while(current===lastnum){
		current = random(num);
		if(current!==lastnum){
			return current;
		}
	}

};

var StringBuffer = function(){

	var arr = new Array();


	this.append = function(str){
		arr.push(str);
	};

	this.remove = function(str){
		var idx = arr.indexOf(str);
		arr.remove(idx);
	};

	this.removeAll = function(str){

		while(arr.indexOf(str) > -1){
			this.remove(str);
		}
	};


	this.clear = function(){
		arr = null;
		arr = new Array();
	};

	this.toString = function(){return arr.join(' ');};

};

var displayText1 = function(node,txt){
	node.innerHTML = txt;
};

var $fun = function(func){

	var arr = new Array();

	if(arguments.length > 1){
		for(var i = 1;i<arguments.length;i++){
			arr.push(arguments[i]);
		}
	}


	return func.apply(null,arr);

};



var Hashmap = function(){

	var obj = {};	
	var keys = new Array();

	this.put = function(key,value){
		if(keys.indexOf(key) > -1){
			alert(key + " already exist. each key must have a unique name")
			return;
		}
		keys.push(key);
		obj[key] = value;
	};

	// if there are arguments
	if(arguments.length > 0){

		for(var i = 0,l = arguments.length;i<l;i+=2){
			if(i+1<l){
				this.put(arguments[i],arguments[i+1]);
			}
			else{
				this.put(arguments[i],null);
			}
		}
	}
	

	this.get = function(key){
		return obj[key];
	};

	this.hasKeys = function(){return keys.length > 0;};

	this.getKeys = function(){return keys;};
	
	this.getMap = function(){return obj;};

	this.remove = function(key){
		
		if(keys.indexOf(key)===-1){
			alert(key + " does not exist")
			return;
		}
		delete obj[key];
		keys.remove(keys.indexOf(key));
		
	};

};

var $ele = function(ele){

	return document.getElementById(ele);

};

var $tags = function(el,tg){
	el = el || document;
	return el.getElementsByTagName(tg);
};

var $styles = function(ele,styles){

	for (var name in styles) {
 	 		ele.style[name] = styles[name];
	}

};

// function sets element styles
var el2 = function(arg){
	this.elem = $ele(arg);
	this.$styles = function(styles){
		$styles(this.elem,styles);
	};
	
};

var $el = function(arg){
	return new el2(arg);
};

var $attr = function(elem,attr){
	return $ele(elem).getAttribute(attr);
};

var $create = function(el){return new newelem(el);}

var newelem = function(el){

	// set element
	this.el = document.createElement(el);

	// set attributes 
	this.$attrs = function(att){
		
		if(att == null){return;} // return if null;

		for(var name in att){
			this.el.setAttribute(name,att[name]);
		}
	};

	// set text and innerHTML 
	this.$txt = function(txt){

			if(txt == null){return;} // return if null;
			this.el.innerHTML = txt;
	};

	// set the styles
	this.$styles = function(styles){
		
		if(styles == null){return;} // return if null;
		$styles(this.el,styles);
	};

	// return the element
	this.$ele = function(){return this.el;};

};

var $element = function(name,attrs,txt,styles){

	// create new element
	var el = $create(name);

	// add any attributes
	el.$attrs(attrs);

	// add any text or innerHTML
	el.$txt(txt);

	// add 3wstyles
	el.$styles(styles);

	// return the new element
	return el.$ele();

}

var $events = function(el,ev){
	for(var i = 0;i<ev.length;i++){ // loop through events array
			addEvent(el,ev[i].event,ev[i].fn,ev[i].useCapture);
		}
};

var $appendto = function(elem1,elem2){
	elem1.appendChild(elem2);
};


var isEvent = function(ev){

	var events = "abort|blur|change|click|dblclick|error|focus|keydown|keypress|keyup|mousedown|mousemove"+
			"|mouseout|mouseover|mouseup|reset|resize|select|submit|unload".split('|');

	for(var i = 0;i < events.length;i++)
	{
		if(ev.indexOf(events[i]) > -1)
		{
			return true;
		}
	}

	return false;

};

var $regevents = function(ev){

	for (var name in ev){

		var idx = name.indexOf('_');
		

		if(idx == -1){
			alert(name + " not valid, missing _ ");
			return;
			break;
	
		}

		var id = name.substring(0,idx);
		var event = name.substring(idx+1,name.length);

		var id = name.substring(0,idx);
		var event = name.substring(idx+1,name.length);

		var nd = $ele(id);

		// set event
		try{
			addEvent(nd,event,ev[name].fn,ev[name].useCapture);
		}
		catch(e){
			alert("error..... " + e.message);	
		}
		
	}
};

var datetime = {

	months:["January","February","March","April","May","June",
	"July","August","September","October","November","December"],

	days:['Sunday','Monday','Tuesday','Wednesday',
	'Thursday','Friday','Saturday'],

	today:new Date(),

	leadingZero:function(nr){
		if (nr < 10){ nr = "0" + nr;}
		return nr;
	},


	takeYear:function(theDate){
		x = theDate.getYear();
		var y = x % 100;
		y += (y < 38) ? 2000 : 1900;
		return y;
	}

};
	// year
	datetime.year = datetime.takeYear(datetime.today);
	// month
	datetime.month = datetime.months[datetime.today.getMonth()];
	// dayname
	datetime.dayname = datetime.days[datetime.today.getDay()];
	// day
	datetime.day = datetime.leadingZero(datetime.today.getDate());
	// place dayname 
	datetime.placeDayName = function(el){$ele(el).innerHTML = this.dayname + ' '};
	// pace month and day
	datetime.placeMonthDay = function(el){$ele(el).innerHTML = this.month + ' ' + this.day};
	// place year
	datetime.placeYear = function(el){$ele(el).innerHTML = ' ' + this.year};
	// dayname month day year
	datetime.placeDate = function(d,m,y){
		this.placeDayName(d);
		this.placeMonthDay(m);
		this.placeYear(y);
	};

// fix IE .png bug
var correctPNG = function() // correctly handle PNG transparency in Win IE 5.5 & 6.
{
   var arVersion = navigator.appVersion.split("MSIE")
   var version = parseFloat(arVersion[1])
   if (((version >= 5.5) && (version < 7)) && (document.body.filters)) 
   {
      for(var i=0; i<document.images.length; i++)
      {
         var img = document.images[i]
         var imgName = img.src.toUpperCase()
         if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
         {
            var imgID = (img.id) ? "id='" + img.id + "' " : ""
            var imgClass = (img.className) ? "class='" + img.className + "' " : ""
            var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
            var imgStyle = "display:inline-block;" + img.style.cssText 
            if (img.align == "left") imgStyle = "float:left;" + imgStyle
            if (img.align == "right") imgStyle = "float:right;" + imgStyle
            if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
            var strNewHTML = "<span " + imgID + imgClass + imgTitle
            + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
            + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
            + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
            img.outerHTML = strNewHTML
            i = i-1
         }
      }
   }    
}

