var sortableReordered=false;

function isNumeric(x) {
	// I use this function like this: if (isNumeric(myVar)) { }
	// regular expression that validates a value is numeric
	//var RegExp = /^(-)?(\d*)(\.?)(\d*)$/; // Note: this WILL allow a number that ends in a decimal: -452.
	// compare the argument to the RegEx
	// the 'match' function returns 0 if the value didn't match
	//var result = x.match(RegExp);
	//return result;
	return true;
}

var DHTML = (document.getElementById || document.all || document.layers);

function updateMainMenu(li, id) {
	sortableReordered = true;
	holler('post','/cms/index.cfm?system_action=update_menu&menu=main&order='+Sortable.serialize('main_nav_ul'),'');
	//alert(Sortable.serialize('main_nav_ul'));
}

function registerCal(inputField, button, onUpdate) {
	if (onUpdate === undefined) {onUpdate = new Function("alert('hi');");}
	Calendar.setup(
		{
			inputField	   : inputField,
			ifFormat	   : "%Y-%m-%d",
			button         : button,
	        align          : "bR",
	        singleClick    : true,
			onUpdate 	   : onUpdate
		}
	)
	getObj(button).onclick();
}
/**
* Multi update from object
*/
function multiUpdate (obj) {
	var js;
	for (var i in obj) {
		if(i == 'javascript') {
			js = obj[i];
		} else {
		//properties starting with _ will not be considered
			if (!(i.match(/^_/)) && getObj(i)) {
				getObj(i).innerHTML = obj[i];
			}
		}
	}
	if(js) {
		eval(js);
	}
}

function _ (myvar) {
	return encodeURIComponent(myvar);
}

if (typeof $ != "function") {
	function $ (obj) {
		if (typeof obj != "obj") {
			obj = document.getElementById(obj);
		}
		return obj;
	}
}

// ckd, Feb 8, 2007
// users JSON to update any named Page element in the layout
// so, set Page::set('inner_title','Hello World'); causes the inner_title block to be rendered back via ajax
// use it to render multiple areas of the screen back in one go.

function linkToModule(module, div, query_string) {

	if (typeof query_string != "string") {
		var query_string = "";
	}

	if(module.substring(0,3) != 'cms')
		urchinTracker('/' + module);

	var ajax = holler('post','/'+module+'?layout=json&'+query_string, '',
		function (x) {
			try {
				var m = eval('(' + x.responseText + ')');
				multiUpdate(m);
			} catch (e) {
				alert(e + x.responseText);
			}
		}
	);


	return ajax;
}

function submitTo(formObj, action, div, url) {

	if(!objExist(div)) {
		alert('Unable to submit this form '+div);
		return false;
	}

	var ajax = new hollerAtMe('POST', formObj, action+'?layout=ajax',div);


		function (x) {
			try {
				var m = eval('(' + x.responseText + ')');
				multiUpdate(m);
			} catch (e) {
				alert(e + x.responseText);
			}
		}

	return ajax;
}

function IsNumeric(sText){
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

   for (i = 0; i < sText.length && IsNumber == true; i++) {
      Char = sText.charAt(i);
      if (ValidChars.indexOf(Char) == -1) IsNumber = false;
   }

   return IsNumber;
}

function redirect(url){
	window.location.href = url;
}

function getObj(name) {
	if( typeof(name) == 'object' ) {
		this.obj = name;
	} else {
		if (document.getElementById) {
			this.obj = document.getElementById(name);
		} else if (document.all)  {
			this.obj = document.all[name];
		} else if (document.layers)  {
			this.obj = document.layers[name];
		}
	}
	return this.obj;
}

function objExist(name) {

	if( typeof(name) == 'object' ) {
		return true;
	} else {
		if (document.getElementById) {
			this.obj = document.getElementById(name);
		} else if (document.all)  {
			this.obj = document.all[name];
		} else if (document.layers)  {
			this.obj = document.layers[name];
		}
		if(this.obj) {
			return true;
		} else {
			return false;
		}
	}

}

// Object check added - 11/15/2006
function divDsp(el, dspState)
{
	if (!DHTML) return;

	if( typeof(el) == 'object' ) {
		x = el;
	} else {
		var x = new getObj(el);
	}
	x.style.display = (dspState)? (dspState=='inline'?'':dspState) : (x.style.display=='inline'||x.style.display=='') ? 'none' : '';
}

function popup(href,width,height,win_name) {
	    if (!win_name) win_name = 'none';
	    var window_features = "height="+height+",width="+width+",toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0,copyhistory=0,dependent=1,top=100,left=100";
		win = window.open(href,win_name,window_features);
		if(win) {win.focus();}
		return false;
}

function selectAll(selectBox){
	for(var i=0;i<selectBox.options.length;i++){
		selectBox.options[i].selected = true;
	}
	return;
}

function unSelectAll(selectBox){
	for(var i=0;i<selectBox.options.length;i++){
		selectBox.options[i].selected = false;
	}
	return;
}

function selectAllChecked(selectBox){
	for(var i=0;i<selectBox.length;i++){
		selectBox[i].checked = true;
	}
	return;
}

function unSelectAllChecked(selectBox){
	for(var i=0;i<selectBox.length;i++){
		selectBox[i].checked = false;
	}
	return;
}

function numOnly(el) {
	var tmp 	= el.value.replace(/[^0-9.]/g,'');
	var argv 	= numOnly.arguments;
	if (argv.length==2) {
		if(tmp.length >= argv[1]) {
			el.form[(getIndex(el)+1) % el.form.length].focus();
		}
	}
	return el.value=tmp;
}

function getIndex(input) {
	var index = -1, i = 0, found = false;
	while (i < input.form.length && index == -1)
	if (input.form[i] == input)index = i;
	else i++;
	return index;
}


function checkAll(checkBox){
	for(var i=0;i<checkBox.length;i++){
		checkBox[i].checked = true;
	}
	return;
}

function unCheckAll(checkBox){
	for(var i=0;i<checkBox.length;i++){
		checkBox[i].checked = false;
	}
	return;
}


// AJAX Functionality
function holler(method,url,parameters,callback) {
	var method = method.toUpperCase();
	 try{
	    if (window.XMLHttpRequest) {
	        var xmlhttp = new XMLHttpRequest();
	    } else if (window.ActiveXObject) {
			try {
				var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
	    }

		if(method=="POST"){

			xmlhttp.open(method, url, true);
			xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//application/x-www-form-urlencoded
			xmlhttp.setRequestHeader("Content-length", parameters.length);//parameters.length
			xmlhttp.setRequestHeader("Connection", "close");
			xmlhttp.send(parameters);
		} else{
			xmlhttp.open(method, url+'&'+parameters, true);
			xmlhttp.send(null);
		}

     } catch(e){
	 	alert('Error occurred while trying to process your request: ' + e);
	 	throw e;
	 	return;
	 }

    xmlhttp.onreadystatechange = function () {
	  		if (xmlhttp.readyState == 4 || xmlhttp.readyState == 'complete') {
				if (xmlhttp.status == 200) {
					if (typeof callback == 'function') {
						callback(xmlhttp);
					} else {
						eval(callback);
					}
				} else{
					alert('An error occurred while trying to return your request. \nError '+xmlhttp.status+': '+xmlhttp.statusText);
					return;
				}
		    }
		};
}


function hollerBack(method,url,parameters,thisObj,LoadingTxt) {
	 var xmlhttp 	= null;
	 var method 	= method.toUpperCase();
     var self = this;

	 try{
	    if (window.XMLHttpRequest) {
	        var xmlhttp = new XMLHttpRequest();
	    } else if (window.ActiveXObject) {
			try {
				var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
	    }

		if(method=="POST"){
			xmlhttp.open(method, url, true);
			xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//application/x-www-form-urlencoded
			xmlhttp.setRequestHeader("Content-length", parameters.length);
			xmlhttp.setRequestHeader("Connection", "close");
			xmlhttp.send(parameters);
		} else{
			xmlhttp.open(method, url+'&'+parameters, true);
			xmlhttp.setRequestHeader("Pragma", "no-cache");
			xmlhttp.send(null);
		}

     } catch(e){
	 	alert('Error occurred while trying to process your request: ' + e);
	 	throw(e);
	 	return;
	 }

    xmlhttp.onreadystatechange = function () {

		if (objExist(thisObj)) {
			var x = new getObj(thisObj);
		} else if (typeof thisObj != "string") {
			var x = thisObj;
		}

		if (xmlhttp.readyState == 4 || xmlhttp.readyState == 'complete') {

			try {
				x.innerHTML = xmlhttp.responseText;
				if (
				(self != window) &&
				//(typeof self == "function") &&
				(typeof self.onload == 'function')) {
					self.onload(xmlhttp);
				}
			} catch (e) {
				alert('An error occurred while trying to return your request. \nError '+e.description);
			}

			if (xmlhttp.status != 200) {
				alert('An error occurred while trying to return your request. \nError '+xmlhttp.status+': '+xmlhttp.statusText);
				return;
			}
	    } else{

			if(LoadingTxt){
				x.innerHTML = '<div>'+LoadingTxt+'</div>';
			} else {
				x.innerHTML = '<div><img src="/img/loading.gif" alt="" width="220" height="19" border="0" /></div>';
			}
			return;
			//x.innerHTML = '<b>Loading...</b>';
		}
	};
	//xmlhttp.setRequestHeader("Content-Length", "66");
}

function hollerAtMe(method,formObj,url,thisObj) {

	this.uniqueId = new Date().getTime();
	this.frameName = 'frame_'+this.uniqueId;

	try{
		// Create New hidden iframe
		var divElm = document.createElement('DIV');
		divElm.style.display = 'none';
		document.body.appendChild(divElm);
		divElm.innerHTML = '<iframe name=\"'+this.frameName+'\" id=\"'+this.frameName+'\" src=\"about:blank\" onload=\"loadFrame(this,\''+thisObj+'\')\"></iframe>';
	} catch(e){
	 	alert('Error occurred while trying to create frame');
	 	return;
	 }

	try{

//		alert(formObj.action+"="+url);
		h_action = formObj.action;
		h_method = formObj.method;
		h_target = formObj.target;

		// Set target of ajax call to frame
		formObj.action 	= url;
		formObj.method 	= method;
		formObj.target = this.frameName;
		formObj.submit();

		formObj.action	= h_action;
		formObj.method 	= h_method;
		formObj.target 	= h_target;

	} catch(e){
	 	alert('Error occurred while trying to submit form: ' + e);
	 	return;
	 }

	// the source div to swap out
	if (objExist(thisObj)) {
		var x = new getObj(thisObj);
		x.innerHTML = '<div><img src="/img/core/loading.gif" alt="" width="220" height="19" border="0" /></div>';
	}
}

function loadFrame(iframeObj, thisObj) {
	try{
		frameName = iframeObj.id;
		var x = new getObj(thisObj);
		x.innerHTML = '<div><img src="/img/core/loading.gif" alt="" width="220" height="19" border="0" /></div>';
		x.innerHTML = window.frames[frameName].document.body.innerHTML;
	} catch(e){
	 	alert('Error occurred while trying to load data from frame');
	 	return;
	}
}


function getFormValues(fobj,valFunc) {
	var str         = "";
	var valueArr     = null;
	var val         = "";
	var cmd         = "";

	for(var i = 0;i < fobj.elements.length;i++) {
		switch(fobj.elements[i].type) {
			case "hidden":
			case "text":
			case "textarea":
			case "password":
				if(valFunc) {
					//use single quotes for argument so that the value of
					//fobj.elements[i].value is treated as a string not a literal
					cmd = valFunc + "(" + 'fobj.elements[i].value' + ")";
					val = eval(cmd)
				}
				str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&";
			break;
			case "select-one":
				str += fobj.elements[i].name + "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
			break;
			case "select-multiple":
				for(var z=0;z<fobj.elements[i].options.length;z++){
					if(fobj.elements[i].options[z].selected==true)
						str += fobj.elements[i].name + "=" + fobj.elements[i].options[z].value + "&";
				}
			break;
			case "checkbox":
				if(fobj.elements[i].checked==true)
					str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&";
			break;
		}
	}
	str = str.substr(0,(str.length - 1));
	return str;
}

function maxlength(obj, len)
{
	if(obj.value.length>=len) { obj.value = obj.value.substr(0,len) }
}

function print_r(obj) {
	big_list = "";
	for (property in obj) {
    	big_list +=property+"="+obj[property]+"\n";
	  }
	alert(big_list);
	return;
}

function URLEncode(plaintext) {
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";


	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
}

function URLDecode(encoded) {
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef";

   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2)
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   return plaintext;
}

