/*Browser Detect*/
// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();
var isFirefox=(agt.indexOf('firefox')!=-1);
var isIE=((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);
var is_ie3    = (isIE && (is_major < 4));
var is_ie4    = (isIE && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie4up  = (isIE && (is_major >= 4));
var is_ie5    = (isIE && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5_5  = (isIE && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie5up  = (isIE && !is_ie3 && !is_ie4);
var is_ie5_5up =(isIE && !is_ie3 && !is_ie4 && !is_ie5);
var is_ie6    = (isIE && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
var is_ie6up  = (isIE && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);
var isOpera=(agt.indexOf('opera')!=-1);
var isNetscape=(agt.indexOf('netscape')!=-1);
var requiresSID = false;
if(agt.indexOf('netscape/8.0') != -1 || agt.indexOf('netscape/7') != -1 || isFirefox || isOpera)
	requiresSID = true;
/*check for minimum IE version of 6*/
if(isIE){
	if(!is_ie6up){
		alert('This site requires at least Internet Explorer version 6 and Windows Media Player 9. Please upgrade.');
		}
	}
/* Capture mouse movement and set MouseX and MouseY to its x,y corordinates */
var MouseX=0;
var MouseY=0;
if(document.all){document.onmousemove = mouseMove;}
else if(document.addEventListener){
	document.addEventListener("mousedown",mouseMove,false);
    document.addEventListener("mousemove",mouseMove,false);
    document.addEventListener("mouseup",mouseMove,false);
    }
else if (document.captureEvents){document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);}

function mouseMove(e) {
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		MouseX = e.pageX;
		MouseY = e.pageY;
		}
	else if (e.clientX || e.clientY){
		if(document.body){
			if(document.documentElement){
				MouseX = e.clientX + document.body.scrollLeft
					+ document.documentElement.scrollLeft;
				MouseY = e.clientY + document.body.scrollTop
					+ document.documentElement.scrollTop;
				}
			}		
		}
	}
/* Define document.getElementById for Internet Explorer 4 */
if (typeof(document.getElementById) == "undefined")
	document.getElementById = function (id)
	{
		// Just return the corresponding index of all.
		return document.all[id];
	}
/* Code so that insertAdjacentHTML works in Mozilla Browsers*/
if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
	HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode){
		switch (where){
			case 'beforeBegin':
				this.parentNode.insertBefore(parsedNode,this)
				break;
			case 'afterBegin':
				this.insertBefore(parsedNode,this.firstChild);
				break;
			case 'beforeEnd':
				this.appendChild(parsedNode);
				break;
			case 'afterEnd':
				if (this.nextSibling){
					this.parentNode.insertBefore(parsedNode,this.nextSibling);
					}
				else{this.parentNode.appendChild(parsedNode);}
				break;
			}
		}
	HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr){
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
		}
	HTMLElement.prototype.insertAdjacentText = function(where,txtStr){
		var parsedText = document.createTextNode(txtStr)
		this.insertAdjacentElement(where,parsedText)
		}
	}
// function to assign hover to divs that have the pin _behavior so they hide onMouseOut
function initPin() {
	//assign hover to li and hide w_select select tags on hover
	var navEls = GetElementsByAttribute('div', '_behavior', 'pin');
	//alert('found '+navEls.length);
	for (var n=0; n<navEls.length; n++) {
		//alert(navEls[n].id);
		navEls[n].onmouseout=function(e) {
			if(undefined == e){e = fixE(e);}
			if(undefined != e){
				if(checkMouseLeave(this,e)){
					/*Check for onhide attribute*/
					var onhide=this.getAttribute('onhide');
					//window.status="onhide="+onhide;
					if(onhide){eval(onhide);}
					this.style.display='none';
					}
				}
			}
		}
	}
/* Add initPin to the onLoad queue */
if (window.addEventListener){window.addEventListener("load",initPin,false);}
else if (window.attachEvent){window.attachEvent("onload",initPin);}

// behavior="menu" display="sub1"
function initMenu() {
	//assign hover to li and hide w_select select tags on hover
	var navEls = GetElementsByAttribute('*', '_behavior', 'menu');
	//alert('found '+navEls.length);
	for (var n=0; n<navEls.length; n++) {
		var dname=navEls[n].getAttribute('display');
		var dObj=getObject(dname);
		if(undefined != dObj){
			navEls[n].onmouseover=function(e) {
				var dname=this.getAttribute('display');
				var dObj=getObject(dname);
				dObj.style.display='block';
				//showId('\''+dname+'\'');
				}
			navEls[n].onmouseout=function(e) {
				if(undefined == e){e = fixE(e);}
				if(undefined != e){
					var dname=this.getAttribute('display');
					var dObj=getObject(dname);
					if(checkMouseLeave(this,e)){
						dObj.style.display='none';
						}
					}
				}
			}
		}
	}
/* Add initPin to the onLoad queue */
if (window.addEventListener){window.addEventListener("load",initMenu,false);}
else if (window.attachEvent){window.attachEvent("onload",initMenu);}

// 
function initMaxLength() {
	//assign hover to li and hide w_select select tags on hover
	var navEls = GetElementsByAttribute('textarea', 'maxlength', '[0-9]+');
	//alert('found '+navEls.length+' textarea fields with a maxlength');
	for (var n=0; n<navEls.length; n++) {
		//alert(navEls[n].id);
		navEls[n].onkeydown=function(e) {
			if(undefined == e){e = fixE(e);}
			var keynum = e.keyCode;
			var max=Math.round(this.getAttribute('maxlength'));
            var lastkeynum = this.getAttribute('lastkeynum');
			this.setAttribute('lastkeynum',keynum);
			//window.status=this.name+' length: '+this.value.length+' keycode='+keynum;
			//allow backspace key
			if(keynum==8){return true;}
			//allow delete key
            if(keynum==46){return true;}
            //allow ctrl-a
            if(keynum==65 && lastkeynum==17){return true;}
            //allow ctrl-c
            if(keynum==67 && lastkeynum==17){return true;}
            //arrow keys
            if(keynum >36 && keynum < 41){return true;}
			//remove any characters longer than maxlength
			if(this.value.length > max){this.value=this.value.substring(0,max);}
			//Disable typing more characters
			if(this.value.length >= max){return false;}

			}
		}
	}
/* Add initMaxLength to the onLoad queue */
if (window.addEventListener){window.addEventListener("load",initMaxLength,false);}
else if (window.attachEvent){window.attachEvent("onload",initMaxLength);}



/* sets hasFlash to true if the user has flash player installed */
var hasFlash = function(){
	var nRequiredVersion = 6;
	if(navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.indexOf("Windows") > -1){
		document.write('<script language="VBScript"\> \non error resume next \nhasFlash = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & ' + nRequiredVersion + '))) \n</script\> \n');
		if(window.hasFlash != null){return window.hasFlash;};
	};
	if(navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] && navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
		var flashDescription = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description;
		return parseInt(flashDescription.charAt(flashDescription.indexOf(".") - 1)) >= nRequiredVersion;
	};
	return false;
}();

function urlencode(text) {
	//http://wmtdev.avincimovie.com/fonts/futura.swf?txt=hello%3Ca+href=%22ksl.com%22%3Eksl%3C/a%3E
	text=text.replace(/\//g,"%2F");
	text=text.replace(/\?/g,"%3F");
	text=text.replace(/\</g,"%3C");
	text=text.replace(/\>/g,"%3E");
	text=text.replace(/\"/g,"%22");
	text=text.replace(/=/g,"%3D");
	text=text.replace(/&/g,"%26");
	//text=text.replace(/\s/g,"+");
    return text;
	}
//CheckMouseEnter
function checkMouseEnter (element, evt) {
	   if (element.contains && evt.fromElement) {
	        return !element.contains(evt.fromElement);
		   }
	   else if (evt.relatedTarget) {
	   	   return !containsDOM(element, evt.relatedTarget);
		   }
	   }

// checkMouseLeave
function checkMouseLeave (element, evt) {
	   //window.status=evt;
	   //return;
	   if (element.contains && undefined != evt.toElement) {
	        return !element.contains(evt.toElement);
		   }
	   else if (evt.relatedTarget) {
		   return !containsDOM(element, evt.relatedTarget);
		   }
	   }

//containsDOM - does container have containee
function containsDOM (container, containee) {
	   var isParent = false;
	   do {
	        if ((isParent = container == containee)){break;}
		   containee = containee.parentNode;
		   }
 	   while (containee != null);
	   return isParent;
	   }
//fixE
function fixE(e){
	if (typeof e == 'undefined'){e = window.event;}
	if (typeof e.layerX == 'undefined'){e.layerX = e.offsetX;}
	if (typeof e.layerY == 'undefined'){e.layerY = e.offsetY;}
	return e;
	}
// Get browser width and height
var BrowserWidth=0;
var BrowserHeight=0;
function getBrowserWH() {
	if(document.all) {
		BrowserWidth = document.body.offsetWidth;
		BrowserHeight = document.body.offsetHeight;
		}
	else{
		BrowserWidth = window.innerWidth;
		BrowserHeight = window.innerHeight;
		}
	}
//get Cookie with said name
function getCookie(name){
	name = trim(name);
	var cookies = document.cookie.split(";");
	var tmp;
	for (var i=0; i<cookies.length; i++){
		tmp = cookies[i].split("=");
		var cname=trim(tmp[0]);
		var cval=trim(tmp[1]);
		//alert('Looking for ['+name+']\nName: ['+cname+']\nValue: ['+cval+']');
		if (cname == name){return unescape(cval);}
		}
	return null;
	}
function setCookie(name, val, expireHours) {
	var expireDate = new Date ();
  	expireDate.setTime(expireDate.getTime() + (expireHours * 3600 * 1000));
  	document.cookie = name + "=" + escape(val) + "; path=/" + ((expireHours == null) ? "" : "; expires=" + expireDate.toGMTString());
	}

//trim - remove beginning and ending spaces
function trim(value){
	if (null != value && undefined != value && "" != value){
		var rval=value.replace(/^[\s\0\r\n\t]*/g,"");
		rval.replace(/[\s\0\r\n\t]*$/g,"");
	    return rval;
		}
	else{return "";}
	}
function getWidth(obj) {
	if(undefined == obj){
		/*Default to Browser Width*/
		if(document.all) {return document.body.offsetWidth;}
		else{return window.innerWidth;}
		}
	else{
		if(undefined != obj.innerWidth){return obj.innerWidth;}
		else if(undefined != obj.offsetWidth){return obj.offsetWidth;}
		}
	}
function getHeight(obj) {
	if(undefined == obj){
		/*Default to Browser Width*/
		if(document.all) {return document.body.offsetHeight;}
		else{return window.innerHeight;}
		}
	else{
		if(undefined != obj.innerHeight){return obj.innerHeight;}
		else if(undefined != obj.offsetHeight){return obj.offsetHeight;}
		}
	}
// GetElementsByAttribute - returns an array of tags that have an attribute of value.
function GetElementsByAttribute(tag, att, val){
        //GetElementsByAttribute(tagname, attributename,stringtomatch)
        var a, list, found = new Array(), re = new RegExp(val, 'i');
        //if(undefined != document.getElementsByTagName(tag)){return found;}
        list = document.getElementsByTagName(tag);
        //alert("Found "+list.length+" tags with name of "+tag+" ,checking for "+att+" with a val of "+val);
        for (var i = 0; i < list.length; ++i) {
            a = list[i].getAttribute(att);
            if (undefined == a){a = list[i][att];}
            if (undefined != a){
	            if (typeof(a)=='string' && (val.length==0 || a.search(re) != -1)) {
	               found[found.length] = list[i];
	               //alert("Found a match");
	               }
	           }
            }
        return found;
        }
// showProperties - shows the properties of any element
function showProperties(obj,id){
	var cObj=getObject(obj);
    if(undefined == cObj){return abort("undefined object passed to showProperties");}
	var str="Properties that have values for :" + cObj + "\n";
	var namestr='';
	for(name in cObj){
		if(cObj[name]){
			//typeof returns "number" "string" "boolean" "function" "undefined" "object"
			var type=typeof(cObj[name]);
			if(type != "object" && type != "function"){
				var cval=String(cObj[name]);
				if(cval.length < 100){
					str += "[" + name + "]["+type+"] = " + cval + "<br>\r\n";
					}
				else{
					var part=cval.substring(0,100);
					str += "[" + name + "]["+type+"] = " + cval.length + 'chars long. Partial content:\n' +part + "<br>\r\n";
                	}
				}

			}
		namestr += name + ", ";
		}
	if(!id){
		alert(str);
		}
	else{
		setText(id,str);
    	}
  	}
//showHide
function showId(id){
    if(undefined == document.getElementById(id)){
		alert('Error in showId\n"'+id+'" is not defined as a valid object');
		return;
    	}
	var formObj=document.getElementById(id);
	formObj.style.position='absolute';
    formObj.style.top=MouseY+"px";
    formObj.style.left=MouseX+"px";
    formObj.style.display='inline';
    //
	//alert(formObj.style.display);
    return true;
    }
// checkAllElements - check/toggle all checkboxes that have an attribute of value
function checkAllElements(att,val,ck){
        //show all tags tag with attribute att that has a value of val
        //returns number of items checked
        var cust=GetElementsByAttribute('input',att,'^'+val+'$');
        var cnt = 0;
        for(var i=0;i<cust.length;i++){
	   	 if(cust[i].type=='checkbox'){cust[i].checked=ck;cnt++;}
           }
        if (ck){return cnt;}
	   return 0;
        }
//submitForm -- parses through theForm and validates input based in additonal field attributes
// Possible attributes are: required="1" mask="^[0-9]" maskmsg="Age must begin with a number" maxlength="23"
function submitForm(theForm){
	if(undefined == theForm){return false;}
	//alert("theForm type="+typeof(theForm));
	if(theForm.length ==0){return false;}
	for(var i=0;i<theForm.length;i++){
		var dname=theForm[i].name;
		if(theForm[i].getAttribute('displayname')){dname=theForm[i].getAttribute('displayname');}
		var msg=dname+" is required";
	    if(theForm[i].getAttribute('requiredmsg')){msg=theForm[i].getAttribute('requiredmsg');}
	  	/* Password confirm */
	  	if(dname == 'password_confirm'){continue;}
	  	if(dname == 'tc'){
			if(undefined != theForm.is_register){
				if(theForm.is_register.value != 1){continue;}
				}
			}
	  	if(dname == 'password'){
			if(undefined != theForm.password_confirm){
				var confirm=1;
				if(undefined != theForm.is_register){
					var val=theForm.is_register.value;
					if(val.length==0 || val != 1){confirm=0;}
					//alert("val="+val+', confirm='+confirm);
					}
				if(confirm == 1){
			  		if(theForm.password_confirm.value.length == 0){
						alert('Password confirmation is required');
		                if(theForm[i].type!='hidden'){theForm[i].focus();}
		                return false;
		            	}
		            if(theForm[i].value.length == 0){
						alert('Password is required');
		                if(theForm[i].type!='hidden'){theForm[i].focus();}
		                return false;
		            	}
		            if(theForm[i].value != theForm.password_confirm.value){
						alert('Passwords do not match.  Please retype password.');
		                if(theForm[i].type!='hidden'){theForm[i].focus();}
		                return false;
		            	}
		  			}
	  			}
			}

        //check for required attribute
        if(theForm[i].getAttribute('required') && theForm[i].getAttribute('required') == 1){
			var showalert=0;
			if(theForm[i].type=='checkbox'){
				if(!theForm[i].checked){showalert=1;}
				}
			else if (theForm[i].value==''){showalert=1;}
			if(showalert){
				alert(msg);
	            if(theForm[i].type!='hidden'){theForm[i].focus();}
	            return false;
	            }
            }
            //check for mask attribute - a filter to test input against
            if(theForm[i].getAttribute('mask') && theForm[i].getAttribute('mask').value != '' && theForm[i].value != ''){
                var mask=theForm[i].getAttribute('mask');
                if(mask != 'searchandreplace'){
                //alert("mask="+mask);
                var re = new RegExp(mask, 'i');
                if(re.test(theForm[i].value) == false){
                    var msg = dname+" must be of type "+mask;
                    if(theForm[i].getAttribute('maskmsg')){msg=theForm[i].getAttribute('maskmsg');}
                    alert(msg);
                    if(theForm[i].type!='hidden'){theForm[i].focus();}
                    return false;
                    }
           	}
                }
            //check for length attribute on textarea fields
            //alert(theForm[i].type);
            if(theForm[i].type == 'textarea' && theForm[i].getAttribute('maxlength')){
                var len=theForm[i].value.length;
                var max=Math.abs(theForm[i].getAttribute('maxlength'));
                if(len > max){
                    var msg = dname+" must be less than "+max+" characters\nYou entered "+len+" characters.";
                    alert(msg);
                    if(theForm[i].type!='hidden'){theForm[i].focus();}
                    return false;
                    }
                }
            }
        return true;
	}
function passwordScore(passwd){
		var intScore   = 0
		var strVerdict = 0
		
		// PASSWORD LENGTH
		if (passwd.length==0 || !passwd.length)                         // length 0
		{
			intScore = -1
		}
		else if (passwd.length>0 && passwd.length<5) // length between 1 and 4
		{
			intScore = (intScore+3)
		}
		else if (passwd.length>4 && passwd.length<8) // length between 5 and 7
		{
			intScore = (intScore+6)
		}
		else if (passwd.length>7 && passwd.length<12)// length between 8 and 15
		{
			intScore = (intScore+12)
		}
		else if (passwd.length>11)                    // length 16 or more
		{
			intScore = (intScore+18)
		}
		
		
		// LETTERS (Not exactly implemented as dictacted above because of my limited understanding of Regex)
		if (passwd.match(/[a-z]/))                              // [verified] at least one lower case letter
		{
			intScore = (intScore+1)
		}
		
		if (passwd.match(/[A-Z]/))                              // [verified] at least one upper case letter
		{
			intScore = (intScore+5)
		}
		
		// NUMBERS
		if (passwd.match(/\d+/))                                 // [verified] at least one number
		{
			intScore = (intScore+5)
		}
		
		if (passwd.match(/(.*[0-9].*[0-9].*[0-9])/))             // [verified] at least three numbers
		{
			intScore = (intScore+5)
		}
		
		
		// SPECIAL CHAR
		if (passwd.match(/.[!,@,#,$,%,^,&,*,?,_,~]/))            // [verified] at least one special character
		{
			intScore = (intScore+5)
		}
		
																 // [verified] at least two special characters
		if (passwd.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/))
		{
			intScore = (intScore+5)
		}
	
		
		// COMBOS
		if (passwd.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))        // [verified] both upper and lower case
		{
			intScore = (intScore+2)
		}

		if (passwd.match(/(\d.*\D)|(\D.*\d)/))                    // [FAILED] both letters and numbers, almost works because an additional character is required
		{
			intScore = (intScore+2)
		}
 
																  // [verified] letters, numbers, and special characters
		if (passwd.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/))
		{
			intScore = (intScore+2)
		}

	return intScore;
	}
function passwordBar(score){
	//highest score is 45
	var bar='<div style="width:100px;background:#FFF;margin-left:5px;margin-right:5px;">';

	var barlen=Math.round(score*2);
	if(barlen>0){
		var color='red';
		var pcnt=Math.round((score/50)*100);
		bar += '<div style="font-size:10px;font-family:arial;">Strength Score: '+pcnt+'%</div>';
		if(barlen>45){color='#10D305';}
		else if(barlen>40){color='#86FC54';}
		else if(barlen>35){color='#CAFC54';}
		else if(barlen>30){color='#FEF552';}
		else if(barlen>25){color='#FED852';}
		else if(barlen>20){color='#FDC653';}
		else if(barlen>15){color='#FDAC53';}
		else if(barlen>10){color='#FC9B54';}
		bar += '<div style="width:'+barlen+'px;background-color:'+color+';height:6px;"></div>';
		}
	bar += '</div>';
	return bar;
	}