if (typeof Ka === "undefined"){

window.Ka = function(){
	
	//setup default $ function if needed
	if (typeof $ === 'undefined'){
		$ = function(x){
			return document.getElementById(x);
		};
	} 
	
	//prototype forEach function
	if (!Array.forEach || !Array.prototype.forEach){
		Array.prototype.forEach = function(func){
			var len = this.length;
			if (typeof func !== "function"){
				Ka.error('argument passed to forEach is not a function');
				return;
			}	
			var thisp = arguments[1];
			for (var i = 0; i < len; i++){
				if (i in this){
					func.call(thisp, this[i], i, this);
				}
			}
	  	};
	}

	//prototype inArray function
	Array.prototype.inArray = function (value){
	    var i;
	    for (i=0; i < this.length; i++) {
	        if (this[i] === value) {
	            return true;
	        }
	    }
	    return false;
	};	
	
	//prototype trim function
	String.prototype.trim = function() {
		var a = this.replace(/^\s+/, '');
		return a.replace(/\s+$/, '');
	};
	
	//holds query parameters
	var windowQueryObj;
	//create namespace for Internal functions
	var Internal= {
		
		//used for callStack
		formatArguements: function (args){
			var retString = '';
			for (var z=0;z<args.length;z++){
				retString+= '\''+args[z]+'\'';
				if (args[z+1]) {
					retString+= ',';
				}
			}
			return retString;
		},
		
		//private function return element type from strong
		getElementTypeFromString:  function(element){
		    if (typeof element === 'object'){
			       return 'object';
		    } 		
		    var firstChar = element.charAt(0);
			if (firstChar == '#'){
		        return 'id';
		    } else if (firstChar === '.'){
		        return 'class';
		    } else {
				Ka.warn('argument passed ("'+element+'") is unknown.');
		        return 'unkown';
		    }
		},
		
		trimFirstChar: function(string){
			return string.substr(1,string.length-1);
		},
		
		argsToObj: function(args){		
			
			var arr = [];
			
			//create an obj out of each argument
			for (var i = 0; i < args.length; i++){
				var obj = {};
				
				//find and set element type from string
				obj.elementType = this.getElementTypeFromString(args[i]);
				obj.elementString = this.trimFirstChar(args[i]);
				obj.elementsContainer = null;
				
				//find element
				if (obj.elementType == 'id'){
					obj.elementsContainer = document.getElementById(obj.elementString);
					
				} else if (obj.elementType === 'class'){
					var retVal = [];
					var elements = document.getElementsByTagName("*");
					for (var x = 0; x < elements.length; x++){
						if (elements[x].className.indexOf(" ") >= 0){
							var classes = elements[x].className.split(" ");
							for (var j = 0;j < classes.length;j++){
								if (classes[j] == obj.elementString){
									retVal.push(elements[x]);
								} 
							}
						} else if (elements[x].className == obj.elementString){
					    	retVal.push(elements[x]);
						}
					}
					
					if (retVal.length > 0){
						obj.elementsContainer = retVal;
					}
				}
				
				if (obj.elementType != 'unknown'){
				//add to obj array
				arr.push(obj);
				}
			}
			
			return arr;
		}

	};

return {	
	version: '1.0',
	errors: false,	
	warnings: false,
	firebug: function(){
		var userAgent = navigator.userAgent.toLowerCase();
		var bool;
		if (userAgent.indexOf('safari') == -1){
			bool = window.console?true:false;
		}else{
			bool = window.console.firebug?true:false;
		}
		return bool;
	}(),

	Settings:{
		
		profileCommentsLength: 5,
		profileCommentsFade: true,
		
		popups:{
			offSetLeft: 0,
			offSetTop: 0
		},
		
		tinyMCE:{ 
			defaultHeight: 300,
			resizingMinHeight: 240,
			resizingMaxHeight: 500,
			theme_advanced_buttons1: 'bold,italic,link,unlink,forecolor,backcolor,bullist,numlist,hr,blockquote,charmap,code,emotions,kickmedia',
			theme_advanced_buttons2: '',
			theme_advanced_buttons3: '',
			plugins: 'kickmedia,emotions,media'
		},
		
		autoplay:{
			mediaPlayPage: 'true' 
		}	
		
	},
	
	$: function(){

		//create argsObj from arguements
		var argsObj = Internal.argsToObj(arguments);
		
		if (argsObj.length == 1){
			return argsObj[0].elementsContainer;
		} else if (argsObj.length > 1){
			var arr = [];
			for (var i = 0; i < argsObj.length; i++){
				if (argsObj[i].elementsContainer instanceof Array){
						
					for (var a=0; a<argsObj[i].elementsContainer.length; a++){
						thisObj = argsObj[i].elementsContainer[a];
						if (arr.inArray(thisObj) === false){
							arr.push(thisObj);
						}
					}
				
				} else {
					arr.push(argsObj[i].elementsContainer);
				}
			}
			return arr;
		}
		
	},

	alert: function(){
		if (Ka.debug){
			if (Ka.firebug){
				console.log.apply(window.console,arguments);
			}else{
				$j(arguments).each(function(i){
					alert('KaObject: '+arguments[i]);
				});
			}
		}		
	},
	
	warn: function(string){
		if (Ka.warnings){
			if (Ka.firebug){
				console.warn('KaObject: '+string+'\nLast called public Ka method: '+Internal.lastMethod);
			}else{
				alert('KaObject warning: '+string+'\nLast called public Ka method: '+Internal.lastMethod);
			}
		}
	},

	error: function(string){
		if (Ka.errors){
			if (Ka.firebug){
				console.error('KaObject: '+string+'\nLast called public Ka method: '+Internal.lastMethod);
			}else{
				alert('KaObject error: '+string+'\nLast called public Ka method: '+Internal.lastMethod);
			}
		}
	},

addDOMLoadEvent: function(func){
	$j(document).ready(func);
},
	/*
		Compliemnts of PPK
		http://www.quirksmode.org/blog/archives/2005/08/addevent_consid.html
	*/
	addEvent: function(obj,type,fn){
		if (obj.addEventListener){
			obj.addEventListener(type,fn,false);
		}else if (obj.attachEvent)	{
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); };
			obj.attachEvent( "on"+type, obj[type+fn] );
		}
	},
	
	paypalAddEvent: function(obj,fn){
	
		$j("select."+obj).change(fn);		
	
	},

	removeEvent: function(obj,type,fn){
		
		if (obj.removeEventListener){
			obj.removeEventListener( type, fn, false );
		}else if (obj.detachEvent)	{
			obj.detachEvent( "on"+type, obj[type+fn] );
			obj[type+fn] = null;
			obj["e"+type+fn] = null;
		}
	},
	

	toggle: function(){
		
		//create argsObj from arguements
		for (var i=0; i<arguments.length;i++){
			var elementHolder = this.$(arguments[i]);
			//check if return is array of elements
			if (elementHolder instanceof Array){
				//for each element if element display null or not none, make none
				for (var a = 0; a<elementHolder.length; a++){
					if ( elementHolder[a].style.display == 'block' || elementHolder[a].style.display === '' ){
						elementHolder[a].style.display = 'none';
					} else {
						elementHolder[a].style.display = 'block';
					}
				}
			} else if (elementHolder.tagName){
				//single element	
				if ( elementHolder.style.display == 'block' || elementHolder.style.display === '' ){
					elementHolder.style.display = 'none';
				} else {
					elementHolder.style.display = 'block';
				}
			} else {
				//error
			}				
		}	
	},

	
		
	show: function(){
		
		//create argsObj from arguements
		for (var i=0; i<arguments.length;i++){
			var elementHolder = this.$(arguments[i]);
			//check if return is array of elements
			if (elementHolder instanceof Array){
				//for each element if element display null or not none, make none
				for (var a = 0; a<elementHolder.length; a++){
					if ( elementHolder[a].style.display != 'block' ){
						elementHolder[a].style.display = 'block';
					}
				}
			} else if (elementHolder.tagName){
				//single element	
				if ( elementHolder.style.display != 'block' ){
					elementHolder.style.display = 'block';
				}
			} else {
				//error
			}				
		}	
	},
	
	hide: function(){
		
		//create argsObj from arguements
		for (var i=0; i<arguments.length;i++){
			var elementHolder = this.$(arguments[i]);
			//check if return is array of elements
			if (elementHolder instanceof Array){
				//for each element if element display null or not none, make none
				for (var a = 0; a<elementHolder.length; a++){
					if ( elementHolder[a].style.display != 'none' ){
						elementHolder[a].style.display = 'none';
					}
				}
			} else if (elementHolder.tagName){
				//single element	
				if ( elementHolder.style.display != 'none' ){
					elementHolder.style.display = 'none';
				}
			} else {
				//error
			}				
		}	
	},
	
	/*
		Compliemnts of PPK
		http://www.quirksmode.org/js/cookies.html
	*/
	
	Cookie: {
		create: function (name,value,days) {
			var expires;
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				expires = "; expires="+date.toGMTString();
			} else {
				expires = "";
			}
			document.cookie = name+"="+value+expires+"; path=/";
			},

		read: function(name) {
			
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') {c = c.substring(1,c.length);}
				if (c.indexOf(nameEQ) === 0) {return c.substring(nameEQ.length,c.length);}
			}
			return null;
			},

		erase: function(name) {
			
			this.create(name,"",-1);
		}
				
	},
	
	getClassNamesFromId: function (el){
		
		var id = document.getElementById(el);
		if (id){
			if (id.className){
				var retVal= [];
				if (id.className.indexOf(" ") >= 0){
					var classes = id.className.split(" ");
					for (var j = 0;j < classes.length;j++){
					retVal.push(classes[j]);
					}
				}else{
					retVal.push(id.className);
				}
			return retVal;
			} else {
				return null;
			}
		} else{
			//console.log('NOT FOUND');
			return null;
		}
	},

	hasInURL: function(string){
		
    	if (window.location.href.indexOf(string) > 0){
    	    return true;
		}
		return null;
	},

	replaceText: function(elId,oldString,newString,bool){
		
		if (document.getElementById(elId)){
			
			var elementId = document.getElementById(elId);
			var innerText = elementId.innerHTML;
			//bool = MATCH ALL
			if (!bool){			
				elementId.innerHTML = innerText.replace (oldString, newString);
			}else{
				elementId.innerHTML = innerText.replace(new RegExp( oldString, "g" ), newString);
			}
		} else{
			//issue warning that div does not exist
		}
	},
	
	pageIs: function(string){
		
		var classAr = this.getClassNamesFromId('ka_mainContainer'); 
		if (classAr){
			var bool = false;
			for (var i = 0; i<classAr.length;i++){
				if (string == classAr[i]){
					bool = true;	
					break;
				}
			}	
			return bool;
		}else{
			return false;
		}
			
	},
	
	addMenuItem:  function(obj){
		//create new list element		
		function createListElement(){
			var newLI = document.createElement('li');
			if(obj.listClass){newLI.className=obj.listClass;}
			if(obj.listId){newLI.id=obj.listId;}

			var newA = document.createElement('a');
			if(obj.linkUrl){newA.href = obj.linkUrl;}
			if(obj.linkId){newA.id = obj.linkId;}
			if(obj.linkClass){newA.className = obj.linkClass;}
			if(obj.linkTarget){newA.target = obj.linkTarget;}
			if(obj.linkHtml){newA.innerHTML = '<span>'+obj.linkHtml +'</span>';}
			newLI.appendChild(newA); 

			return newLI;
		}
			
		if (obj.onlyInURL){
			var foundInHeader = false;
			var onlyArr = obj.onlyInURL.split(',');
			for (var i = 0; i<onlyArr.length;i++){
				onlyArr[i] = onlyArr[i].trim();
				if (window.location.href.indexOf(onlyArr[i]) != -1){
					foundInHeader = true;
				}
			}
			if (foundInHeader === false){
				return;
			}
		}else{
			if (obj.ignoreInURL){
				var ignoreArr = obj.ignoreInURL.split(',');
				for (var z = 0; z<ignoreArr.length;z++){
					ignoreArr[z] = ignoreArr[z].trim();
					if (window.location.href.indexOf(ignoreArr[z]) != -1){
						return;
					}
				}
			}
		}
		var ulList;
		if(obj.menu == 'primary'){
			ulList =  Ka.$('#ka_headerTopNav_ul');
		}else if (obj.menu == 'secondary'){
			ulList =  Ka.$('#ka_headerSubNav_list');
			//check if first list is floated
			//check if listPlacement var us a num and add 1
			/*
			var testType = parseInt(obj.listPlacement);
			if (typeof testType == 'number'){
				obj.listPlacement++;
			}
			*/
		}
		if(Ka.$('#ka_headerTopNav_ul')){
			var lis = ulList.getElementsByTagName('li');		
			
			var newItem = createListElement();
	
			if ( !obj.listPlacement || obj.listPlacement == 'last' || (obj.listPlacement >=  (lis.length+1)) ){
				ulList.appendChild(newItem);
			} else{
				ulList.insertBefore(newItem, lis[obj.listPlacement-1]);
			}
		}
	},
	/* This helps easily set up "helper" popups on links
	 * You pass two arguments to this function, the element that is triggering the popup
	 * and the hidden popup element you want to unhide.
	 * 
	 * This function call be called in two ways:
	 * Externally: Ka.setHelperPopUp($('myLink'),$('popUpElement'));
	 * Hardcoded on the link: <a href="#" onclick="return false" onmouseover="Ka.setHelperPopUp(this, $('addForum'));"><img src="/images/affiliate/help.png"/></a>
	 * 
	 */
	 
	setHelperPopUp: function(elementToSet,elementToPop){
		//it's an onlick
		if (!elementToSet.__Ka_popupOn && typeof $j(elementToSet).attr('onmouseover') == 'string'){
			if ($j(elementToSet).attr('onmouseover').indexOf('setHelperPopUp') != -1){
				$j(elementToPop).fadeIn();
			}
		}
		if (!elementToSet.__Ka_popupOn){
			$j(elementToSet).hover(function(){
				$j(elementToPop).fadeIn();
			},
			function(){
				$j(elementToPop).fadeOut();
			});
			elementToSet.__Ka_popupOn = true;
		}
	},
	
	addPrimaryMenuItem: function(obj){
		obj.menu = 'primary';
		this.addMenuItem(obj);
	},
	
	addSecondaryMenuItem: function(obj){
		obj.menu = 'secondary';
		this.addMenuItem(obj);
	},
	
	/* Example:
	
	<script type="text/javascript">
	function onDomReady(){
		Ka.addPrimaryMenuItem({
			listId:'MYID1',
			listClass:'fdfd',
			listPlacement:3,
			linkId:'myLinkId',
			linkClass:'class1 class2',
			linkHtml:'Link 2',
			linkUrl:'http://www.google.com',
			linkTarget:'_blank',
			onlyInURL: 'displayHomePageExperience,displayMessageBoard'
		});
		
		Ka.addSecondaryMenuItem({
			listId:'MYID2',
			listClass:'sdfds',
			listPlacement:3,
			linkId:'myLinkId',
			linkClass:'class1 class2',
			linkHtml:'Link 1',
			linkUrl:'http://www.google.com',
			ignoreInURL: 'displayHomePageExperience,displayMessageBoard,',
		});
	}
	Ka.addDOMLoadEvent(onDomReady);
	</script>
	
	*/
	
	preloadImages: function(array){
		
		if (!array) {return;}
		
		var preloadedImagesContainer = [];
		
		for (var i=0;i<array.length;i++){
			var image = new Image();
			image.src = array[i];
			preloadedImagesContainer.push(image);
		}
	},

/* Example
	Ka.preloadImages([
		"images/danielle_pop.jpg",
		"images/syndee_pop.jpg",
     	"images/sarah_pop.jpg",
     	"images/nicole_pop.jpg"
	]);
*/


	removeStyle: function(fileName){
		var styleLinks = document.getElementsByTagName('link');
		for (var i = 0; i < styleLinks.length; i++){
	  	  if ( styleLinks[i].href.indexOf(fileName) > 0 ){
	  	          styleLinks[i].disabled = true;
	 	   }
		}
	},

	keepPosition: function(){
		
		var l,t, fixedLeft, fixedTop;

		return function(el){
	
			el = $j(el);
			$j(el).css('zIndex','1000');

			if ($j(el).css('position') != 'abolute'){
				$j(el).css('position', 'absolute');
			}		
								
			function keepPosition(){
				l = $j(document).scrollLeft() + fixedLeft;
				t = $j(document).scrollTop() + fixedTop;		
				$j(el).css({top: t, left: l});
			}
				
			function onStopDrag(){
				fixedLeft = $j(el).offset().left - $j(document).scrollLeft();
				fixedTop = $j(el).offset().top - $j(document).scrollTop();
							
				$j(window).unbind('scroll');
				$j(window).unbind('resize');
				$j(window).bind("scroll",keepPosition);				
				$j(window).bind("resize",keepPosition);
			}	
			onStopDrag();
			$j(el).Draggable({zIndex:1000, onStop: onStopDrag});				

		};
		
	}(),	
	
	popup: function(){
		
		var lastPop, created, l, t, fixedLeft, fixedTop, callBackPopped, callBackClose,lastCenterElementFunc;
		
		function prepAndCheck(arg){
			
			//return if element is already a jQ object
			if (arg.jquery) {
				//things created on the fly are removed after faded out
				created = true;
				return arg;
			}
			
			//if jQ finds this html element
			if ($j(arg).length == 1){ 
				$arg = $j(arg);
				//and it's a div container or our main login form, return it, as it doesn't need a container
				//if ($arg[0].nodeName.toLowerCase == 'div' || $arg[0].id=='ka_loginPopup'){
					return $arg;
				//}
			}else{
				$arg = $j('<p>'+arg+'</p>');
			}
			
			//wrap this non div element in a container and return it
			//wrap the whole object in an outer container and return
			$t = $j('<div class="popup_top"></div');
			$m = $j('<div class="popup_mainBody"></div')
				.append( arg )
				.prepend( $j('<div class="ka_closePopup ka_sprite_misc"></div>').click(function(){
					Ka.popup();
				}) );
				//.append('<input id="ka_popupSend" style="margin: 0 auto;" type="button" value="Ok" />');
			$b = $j('<div class="popup_bottom"></div');
					
			$e = $j('<div class="ka_popup ka_popupBackgroundColor"></div>').append($t).append($m).append($b);
			return $e;		
		}
		
		//center element
		function centerElement($popEl){
			//console.log('centerElement','centering...');
			l = (($j(window).innerWidth() / 2) - ($popEl.width() / 2) + $j(document).scrollLeft()  + Ka.Settings.popups.offSetLeft);			
			t = (($j(window).innerHeight() / 2) - ($popEl.height() / 2) + $j(document).scrollTop() + Ka.Settings.popups.offSetTop);
			$popEl.css({position: 'absolute', top: t, left: l});
		}
		
		function cleanOutPopups($popEl){
			if (created){
				$j(lastPop).remove();
			}else{
				$j(lastPop).hide();
			}
			lastPop = null;
			created = null;
			$j(window).unbind('scroll',lastCenterElementFunc);
			$j(window).unbind('resize',lastCenterElementFunc);
		
		}
		
		return function(){
			//function to remove and unbind popup
			//removes the popup if popup created it on the fly (text)
			//hides it if not
			function keepPosition(){
				l = $j(document).scrollLeft() + fixedLeft;
				t = $j(document).scrollTop() + fixedTop;
				$popEl.css({position: 'absolute', top: t, left: l});
			}
			
			function killLastPopup($popEl){
				//check if lastPop wasn't removed
				if (typeof lastPop !== "undefined" && lastPop !== null) {
					cleanOutPopups($popEl);
				}
			}
			
			var $popEl;
			//check if this is 1) Login popup 2) SSO enabled site and redirect to SSO login
			if (arguments.length > 0 && typeof arguments[0]==='string'){
                //if this is login div
                if (arguments[0].indexOf('ka_loginPopup') !== -1){
                    //if SSO is enabled
                    if(Ka.Info.SSOENABLED==='true'){
                    	//document.location = Ka.Info.SSOLOGINURL+'?redirectUrl='+encodeURIComponent(window.location.pathname+window.location.search);
                    	document.location = Ka.Info.SSOLOGINURL + ((Ka.Info.SSOLOGINURL.indexOf("?")>=0) ? "&" : "?")+'redirectUrl='+encodeURIComponent(window.location.pathname+window.location.search);
                    	return false;
                    }
                }
            }

			switch(arguments.length){
				case 0:
					//no arguments (close)
					cleanOutPopups(lastPop  ? lastPop : $popEl);
					$j('#__dimScreen').unbind('click');
					jQuery.dimScreenStop();
					break;
					
				case 1:
					// if argument is function, run close callback (close)
					if (typeof arguments[0] == 'function'){
						cleanOutPopups(lastPop  ? lastPop : $popEl);
						jQuery.dimScreenStop(arguments[0]);
						return;
					}else{
					// check if object or id (open)
						$popEl = prepAndCheck(arguments[0]);
					}
					break;
				
				case 2:
					$popEl = prepAndCheck(arguments[0]);
					// if id and functionStart (open)
					if (typeof arguments[1] == 'function'){
						callBackPopped = arguments[1];
					}
					// if second argument is custom obj (open)
					//
					//
					break;

				case 3:
					//it id/object, funcStart, and funcEnd (open)
					$popEl = prepAndCheck(arguments[0]);
					callBackPopped = arguments[1];
					callBackClose = arguments[2];
					break;
			}

			//if popEl exists (open call) popup element and run callbacks
			if ($popEl !== null && typeof $popEl !== 'undefined'){
				killLastPopup(lastPop  ? lastPop : $popEl);
				$popEl.css('zIndex','1000');
				
				//set lastPop to undo later
				lastPop = $popEl;
				
				//affiliate pages have a different main container
				// add an extra check here for skip hompage which is not really an AC page
				if ( Ka.Info.PAGE && Ka.Info.PAGE && Ka.Info.PAGE !== "affiliate/homePage.jsp" && Ka.Info.PAGE.indexOf('affiliate/') != -1 ){
					$popEl.appendTo('div#topcontainer');
				}else{
					if($('ka_mainContainer')){
						$popEl.appendTo('div#ka_mainContainer');
					}else{
						$popEl.appendTo(document.body);
					}
				}
				
				$popEl.show();
				centerElement($popEl);
				//call callBackPopped if exists
				if(callBackPopped){callBackPopped();}
				
				$j.dimScreen(800, 0.4);	
				
				//add listeners
				lastCenterElementFunc=function(){
					centerElement($popEl);
				};
				$j(window).scroll(lastCenterElementFunc);				
				$j(window).resize(lastCenterElementFunc);
				
				if ($popEl.attr('id') != 'ka_ProgressBarDiv'){
					$j('#__dimScreen').one('click',function(){
						cleanOutPopups(lastPop  ? lastPop : $popEl);
						if(callBackClose){
							jQuery.dimScreenStop(callBackClose);	
						}else{
							jQuery.dimScreenStop();	
						}		
					});
				}
				
				centerElement($popEl);
				//hack for size detection
				setTimeout(function(){centerElement($popEl);},1);
			}
		};
	}(),
	

    /* continue callback will hold message */
    /* cancel callback does not need to include Ka.popup() close command */
	prompt: function(message,continueCallback, cancelCallback){
		//cancel callback exists set it to fade out popup first
		//before executing
		if (cancelCallback){
			cancelCallback = function(){
				Ka.popup(cancelCallback);
			};
		//else default cancelCallback to a fadeout
		}else{
			cancelCallback = function(){
				Ka.popup();
			};
		}
		
		//create popup with content
		$top = $j('<div class="popup_top"></div');
		$middle = $j('<div class="popup_mainBody"></div') 
					.append( $j('<div class="ka_closePopup ka_sprite_misc"></div>').click(
						function(){
							cancelCallback();
						}
					))
					.append( $j('<p>'+message+'</p>') )
					.append( $j('<input id="ka_promptInput" type="text"/>') )
					.append( $j('<div id="ka_popupButtonHolder"></div>') );	
		$bottom = $j('<div class="popup_bottom"></div');
				
		$e = $j('<div class="ka_popup ka_prompt ka_popupBackgroundColor"></div>')
			.append($top)
			.append($middle)
			.append($bottom);
		
		//popup content and focus on input	
		this.popup($e,function(){
			$('ka_promptInput').focus();
		});

		$j('#ka_popupButtonHolder')
			.append( $j('<input id="ka_popupSend" type="button" value="'+Ka.Messages.SENDINAPPRO +'"  />') 
				.one('click',function(){
						var submitText = $('ka_promptInput').value;
						Ka.popup(function(){
							if(continueCallback){continueCallback(submitText);}		
						});
				})
			)

			.append( $j('<input id="ka_popupCancel" type="button" value="'+Ka.Messages.CANCELINAPPRO +'" />') 
				.one('click',function(){
					cancelCallback();
				})
			);

			
	},



    /* continue callback will hold message */
	confirm: function(message,continueCallback, cancelCallback){

		$top = $j('<div class="popup_top"></div');
				
		$middle = $j('<div class="popup_mainBody"></div') 
					.append( $j('<div class="ka_closePopup ka_sprite_misc"></div>').click(function(){
						if (cancelCallback){
							Ka.popup(cancelCallback);
						}else{
							Ka.popup();
						}
					}) )
					.append( $j('<p>'+message+'</p>') )
					.append( $j('<div id="ka_popupButtonHolder"></div>') );
						
		$bottom = $j('<div class="popup_bottom"></div');
				
		$e = $j('<div class="ka_popup ka_confirm ka_popupBackgroundColor"></div>')
			.append($top)
			.append($middle)
			.append($bottom);
		
		if(cancelCallback){
			this.popup($e,function(){},cancelCallback);
		}else{
			this.popup($e);
		}
		
		$j('#ka_popupButtonHolder')
			.append( $j('<input id="ka_popupSend" type="button" value="'+Ka.Messages.MessageBoards.OK +'" />')
				.one('click',function(){
					Ka.popup(function(){
						continueCallback();
					});
				})
			)
			.append( $j('<input id="ka_popupCancel" type="button" value="'+Ka.Messages.MessageBoards.CANCELARRANGEMENT +'" />')
				.one('click',function(){
					if(cancelCallback){
						Ka.popup(cancelCallback);
					}else{
						Ka.popup();
					}
				})
			);		
			
			
	},
		
	/* 
	 * compares 2 arrays and returns an array of differences
	 * if the returned array length is zero you know they are identical
	 * posBool (default false) will also add the found position to diff array element
	 * */
	compareArrays: function(oldArr,newArr,posBool){
		if (oldArr.length != newArr.length){
			return Ka.alert('compareArrays: Arrays must be the same length');
		}
		var diffArr = [];
		for (var i = 0; i<oldArr.length; i++){
			if (oldArr[i] != newArr[i]){
				if (posBool){
					diffArr.push([newArr[i],(i+1)]);
				}else{
					diffArr.push(newArr[i]);
				}
			}
		}
		return diffArr;
	},
	
	String: {
		/* trims leading and trailing spaces */
		trim: function(a) {
			if (a===''){return '';}
			a = a.replace(/^\s+/, '');
			return a.replace(/\s+$/, '');
		},
		
		/* removes multiple spaces */
		singleSpace: function(string){
		    var completeText = '';
		    //remove extra white spaces
		    string = string.split('  ');
		
		    for (var i=0;i<string.length;i++){
		        //if it has a next character
		        if (string[i+1]){
		            //and it's first character isn't a space, add one
		            if (string[i+1].charAt(0) != ' '){
		                string[i] = string[i]+' ';
		            }
		        }
		        completeText += string[i];        
		    }
		    return completeText;
		},
		
		encodeDoubleQuotes: function(string){
			return string.replace(/"/g,'&quot;');
		},

		addSlashSingleQuote: function(string){
			return string.replace(/'/g,"\\'");
		},

		addSlashDoubleQuote: function(string){
			return string.replace(/"/g,'\\"');
		},
				
		encodeHTML: function(string){
			var string = string.replace(/&/g,'&amp;');
			string = string.replace(/"/g,'&quot;');
			string = string.replace(/</g,'&lt;');
			string = string.replace(/>/g,'&gt;');
			return string;
		},
		
		doubleQuoteEntity: function(string) {
			return string.replace(/\"/gi,'&#34;');
		}
		
		
		
	},
	
	Array: {
		trim: function(arr){
			for (var i=0;i<arr.length;i++){
				arr[i] = Ka.String.trim(arr[i]);
			}
			return arr;
		}	
	},
	
	Util:{
		
		getLocationParam: function(qName){
			if (window.location.search.length !== 0){
				//if query param object exists pull from it
				if (!windowQueryObj){
					if (window.location.search.length !== 0){
						windowQueryObj={};
					    queryString = window.location.search.substr(1,window.location.search.length);
					    queryArr = queryString.split('&');
					    for (var i=0;i<queryArr.length;i++){
					        var splitPair = queryArr[i].split('=');
					        windowQueryObj[splitPair[0]] = splitPair[1];
					    }
					}
				}
				//look for param and return it's value
				if (windowQueryObj[qName]){
					return windowQueryObj[qName];
				}
			}	 
		},
		
		rgbToHex: function(rgb){
		    //get numbers
		    if(!rgb){return;}
		    rgb = rgb.toString();
		    rgb = rgb.substr(4,rgb.length);
		    rgb = rgb.substr(0,rgb.length-1);
		    rgb = rgb.split(',');
		    Ka.Array.trim(rgb);
		
		    var toHex = function(N){
		        if (N===null) {return "00";}
		        N=parseInt(N, 10); 
		        if (N===0 || isNaN(N)) {return "00";}
		        N=Math.max(0,N); 
		        N=Math.min(N,255); 
		        N=Math.round(N);
		        return "0123456789ABCDEF".charAt((N-N%16)/16)+"0123456789ABCDEF".charAt(N%16);
		    };
		    
		    return toHex(rgb[0])+toHex(rgb[1])+toHex(rgb[2]);
		},
		
		loadCss: function(url){
			var l=document.createElement('link');
			l.rel="stylesheet";
			l.href=url;
			document.getElementsByTagName('head')[0].appendChild(l);
		},
		
		loadScript: function(url){
			var s=document.createElement('script');
			s.type="text/javascript";
			s.src=url;
			document.getElementsByTagName('head')[0].appendChild(s);
		},
		
		//compliments of http://ejohn.org/blog/injecting-word-breaks-with-javascript/
		wbr: function(str, num){ 
		  return str.replace(new RegExp("([\\w\<]{" + num + "})([\\w\<])", "g"), function(all,text,chara){
		    
		    if ($j.browser.safari) {
		    	return text + "<wbr />&shy;" + chara;
		    } else {
		    	return text + "<wbr />" + chara;
		    }
		  });
		}
				
		
	}
	
};

//initiate function
}();

//end if
}


/*

var bob = new Ka.popupClass;
bob.title="Hi there!";
bob.message="This is a messahe.";
bob.height="400px";
bob.width="600px";
bob.init();

*/
//new popup class
//pass string reference of 'prompt','confirm', or 'alert'
//default to alert
Ka.popupClass = function(type){
	this.type=type;
};

Ka.popupClass.prototype={
	//type
	type: 'alert',
	//id of main popup container
	id: null,
	
	//callbacks
	openCallBack: function(){},
	closeCallBack: function(){Ka.popup();},
	
	//content
	title:'',
	content:'',
	
	//html (css formatting)
	width: '400px',
	height: 'auto',
	zIndex: '1000',

	//if true, background will grey out
	greyOutOnPop: true,
	//if true clicking on the backround won't close the popup
	blockBackground: false,
	showCloseButton: true,
	
	//offset
	offsetTop: Ka.Settings.popups.offSetTop,
	offsetLeft: Ka.Settings.popups.offSetLeft,
	
	//CSS classes
	//main class on all popups
	mainClass: 'ka_popup',
	//additional class on query prompts
	promptClass: 'ka_prompt',
	//additional class on confirmation prompts
	confirmClass: 'ka_confirm',
	//additional class on alert prompts
	alertClass: 'ka_alert',
		
	//activates the popup
	init: function(){
		var $e = this.createPopup();
		Ka.popup($e);
	},
	
	createPopup: function(){
		//create popup with content
		$top = $j('<div class="popupClass_top"><h3>'+this.title+'</h3></div')
			.append( $j('<div class="ka_closePopupClass ka_sprite_misc"></div>').click(
									function(){
										Ka.popup();
									}
								));
		
		$middle = $j('<div class="popupClass_mainBody"></div') 
					.append( $j('<p>'+this.content+'</p>') );	
		$bottom = $j('<div class="popupClass_bottom"></div');
				
		$e = $j('<div class="ka_popupClass ka_prompt ka_popupClassBackgroundColor"></div>')
			.css('width',this.width)
			.css('height',this.height);
		
		//add optional id
		if(this.id){$e.attr('id',this.id);}
		
		$e.append($top)
			.append($middle)
			.append($bottom);
		
		return $e;		
	},
	
	centerPopup: function(el){
		$popEl = $j(el);
		l = (($j(window).innerWidth() / 2) - ($popEl.width() / 2) + $j(document).scrollLeft()  + this.offSetLeft);			
		t = (($j(window).innerHeight() / 2) - ($popEl.height() / 2) + $j(document).scrollTop() + this.offSetTop);
		
		$popEl.css({position: 'absolute', top: t, left: l});
	},
	
	
	//closes the popup
	closePopup:function(){
		
	}
};