// GLOBALS
var fields = null; // OVERRIDE ON JSON GRID PAGE
var update = true;
var data = new Object();
data.rows = [];
var elemId = ""; // USED FOR MULTIPLE HTML ELEMENT IDS
var cmsStates = null;
var debug = false;

// REPLACE DOM ELEMENT
jQuery.fn.replaceWith = function(replacement) {
  return this.each(function(){
    element = $(this);
    $(this)
      .after(replacement).next()
      .attr('class', element.attr('class')).attr('id',element.attr('id'))
      .html(element.html())
      .prev().remove();
  });
};
// QUERY STRING
jQuery.query = function(s) {
	var r = {};
	if (s) {
		if(s.indexOf('?') >= 0){
			s = s.substring(s.indexOf('?') + 1); // remove everything up to the ?
		}
		if(s.indexOf('#') >= 0){
			s = s.substring(0, s.indexOf('#')); // get everything before hash
		}
		s = s.replace(/\&amp;/, '&'); // fix amps
		s = s.replace(/\&$/, ''); // remove the trailing &
		jQuery.each(s.split('&'), function() {
			var splitted = this.split('=');
			if(splitted.length == 2){
				var key = splitted[0];
				var val = splitted[1];
				// convert numbers
				if (/^[0-9.]+$/.test(val)) val = parseFloat(val);
				// convert booleans
				if (val == 'true') val = true;
				if (val == 'false') val = false;
				// ignore empty values
				if (typeof val == 'number' || typeof val == 'boolean' || val.length > 0) r[key] = val;
			}
		});
	}
	return r;
};

// PARAMETER FUNCTIONS (DEPRECATED: see above for strings like query strings Ex: ?cat=1&id=2#item)
paramKeys = new Array();
paramValues = new Array();

function getParam(key){
	var value = null;
	for(var i=0;i<paramKeys.length;i++){
		if (paramKeys[i]==key){
			value = paramValues[i];
			break;
		}
	}
	if(value){
		return urldecode(value);
	}
	return value;
}

function parseParams(data, delimiter){
	paramKeys = new Array();
	paramValues = new Array();

	if(delimiter==null) delimiter="&";
	if(data==null){
		data = document.location.search;
	}
	if(data){
		var c = data.substring(0,1);
		if(c == "?") data = data.substring(1);
	}
	
	var query = data;
	var pairs = query.split(delimiter);
	for(var i=0;i<pairs.length;i++){
		var pos = pairs[i].indexOf('=');
		if(pos >= 0){
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			paramKeys[paramKeys.length] = argname;
			paramValues[paramValues.length] = value;
		}
	}
}

// INCLUDES EXTERNAL JS FILES
function include(filename){
	var head = document.getElementsByTagName('head')[0];
	script = document.createElement('script');
	script.src = filename;
	script.type = 'text/javascript';
	head.appendChild(script)
}

// CMS STATES & COUNTRY AJAX COMBINATION
function cmsGetStates(count,id){
	elemId = count;
	var country = $("#cmsCountries"+elemId).val();
	if(id == null) id="";
	if(country == null || country == ""){
		$("#cmsStates"+elemId).html(cmsStates);
	}else{
		$("#cmsStates"+elemId).html("Loading...");
		$.ajax({
		   type: "POST",
		   data: "event=States&state="+id+"&country="+country,
		   success: cmsSetStates
		 });
	}
}
function cmsSetStates(value){
	if(cmsStates == null) cmsStates = $("#cmsStates"+elemId).html();
	$("#cmsStates"+elemId).html(value);
}
function cmsFilePopup(file){
	if(file) window.open(file,'File');
}

// PROTOTYPES & JS ADDONS
Array.prototype.remove = function(from, to) {
	var rest = this.slice((to || from) + 1 || this.length);
	this.length = from < 0 ? this.length + from : from;
	return this.push.apply(this, rest);
};
String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,""); }
String.prototype.ltrim = function(){ return this.replace(/^\s+/,""); }
String.prototype.rtrim = function(){ return this.replace(/\s+$/,""); }
String.prototype.startsWith = function(str){ return (this.match("^"+str)==str); }
String.prototype.endsWith = function(str){ return (this.match(str+"$")==str); }
function isArray(obj){
   if (obj.constructor.toString().indexOf("Array") == -1)
	  return false;
   else
	  return true;
}
// THIS IS OBJECT BASED (alternative jquery $.inArray(value, array))
Array.prototype.inArray = function(value){
	var i;
	for(i=0; i < this.length; i++){
		if(this[i] === value){
			return true;
		}
	}
	return false;
};
function inArray(value, array){
	var pos = -1;
	jQuery.each(array, function(index, item){
		var obj = array[index];
		if(obj.id == value){
			pos = index;
		}
	});
	return(pos);
}
function stopEvent(e){
	if(!e){
		e = window.event;
	}
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

// JQGRID DATA FUNCTIONS
function toggle(id,field){
	if(field == null){
		field = "ids";	
	}
	if(update){
		if(fields != null){ // JSON PROCESSING
			if(inArray(id, data.rows) < 0){
				add(id);
			}else{
				remove(id);
			}
		}else{ // OLD DELIMITED PROCESSING
			var rows;
			if(typeof(field) == "string"){
				rows = $("#"+field).attr("value");
			}else if(typeof(field) == "object"){
				rows = $(field).val();
			}
			if(rows != null){
				rows = rows.split("|");
			}else{
				rows = [];
			}
			if($.inArray(id, rows) < 0){
				add(id,field);
			}else{
				remove(id,field);
			}
		}
	}else{
		update = true;
	}
}
function add(id,field){
	if(field == null){
		field = "ids";	
	}
	if(fields != null){ // JSON PROCCESSING
		if(inArray(id, data.rows) < 0){
			var obj = new Object();
			obj.id = id;
			for(var i=0; i<fields.length; i++){
				var name = fields[i];
				var value = $("#"+name+id).val();
				if(value != null){
					eval("obj." + name + " = value");
				}
			}
			data.rows[data.rows.length] = obj;
		}
		setData();
	}else{ // OLD DELIMITED PROCESSING
		var rows;
		if(typeof(field) == "string"){
			rows = $("#"+field).val();
		}else if(typeof(field) == "object"){
			rows = $(field).val();
		}
		if(rows != null && rows != ""){
			rows = rows.split("|");
		}else{
			rows = [];
		}
		if($.inArray(id, rows) < 0){
			rows[rows.length] = id;
		}
		rows = rows.join('|');
		if(typeof(field) == "string"){
			$("#"+field).val(rows);
		}else if(typeof(field) == "object"){
			$(field).val(rows);
		}
	}
}
function remove(id,field){
	if(field == null){
		field = "ids";	
	}
	if(fields != null){ // JSON PROCESSING
		if(inArray(id, data.rows) >= 0){
			var obj = get(id);
			var index = $.inArray(obj, data.rows);
			if(index >= 0){
				data.rows.remove(index);
			}
		}
		setData();
	}else{ // OLD DELIMITED PROCESSING
		var rows;
		if(typeof(field) == "string"){
			rows = $("#"+field).val();
		}else if(typeof(field) == "object"){
			rows = $(field).val();
		}
		if(rows != null){
			rows = rows.split("|");
		}else{
			rows = [];
		}
		if($.inArray(id, rows) >= 0){
			rows.remove($.inArray(id, rows));
		}
		rows = rows.join('|');
		if(typeof(field) == "string"){
			$("#"+field).val(rows);
		}else if(typeof(field) == "object"){
			$(field).val(rows);
		}
	}
}

// JQGRID SUBMISSION FUNCTION
function submitEvent(event, msg){
	if(event != null && $('#event') != null){
		$('#event').attr('value',event);
	}
	if(msg != "0" || msg != "false" || msg != "none" || msg != "no"){
		if(msg == null){
			if(event != null){
				msg = "Are you sure you want to "+event+" the selected entries?";
			}else{
				msg = "Are you sure you want to continue?";
			}
		}
		if(confirm(msg)){
			$("#ids").attr("value", $("#list").getGridParam('selarrrow'));
			return(true);
		}else{
			$('#event').attr('value','');
		}
	}
	return(false);
}
function setAction(action,form){
	if(action != null) form = "mainForm";
	if(action != null) $("#"+form).attr("action",action);
}

// JQGRID JSON SPECIFIC FUNCTIONS
function setup(field){
	if(field == null){
		field = "ids";	
	}	
	var ids = $("#"+field).attr("value").split("|");
	jQuery.each(ids, function(index, item){
		if(ids[index] != "") add(ids[index]);
	});
	setData();
}
function get(id){
	var obj = null;
	jQuery.each(data.rows, function(index, item){
		var obj2 = data.rows[index];
		if(obj2.id == id){
			obj = obj2;
		}
	});
	return(obj);
}
function setSelection(id, grid){
	if(grid == null){
		grid = "list";	
	}		
	var selected = $('#'+grid).getGridParam("selarrrow");
	if(inArray(id,selected) == -1){
		window.status = selected;
		$('#'+grid).setSelection(id);
	}
}	
function setObject(id, field){
	var obj = get(id);
	if(obj != null){
		var value = $("#"+field).val();
		var name = $("#"+field).attr('name');
		eval("obj." + name + " = value");
		set(obj);
	}
}
function set(obj){
	var index = $.inArray(obj, data.rows);
	if(index >= 0){
		data.rows[index] = obj;
	}
	setData();
}
function setData(){
	var dataString = $.toJSON(data);
	$("#ids").attr("value",dataString);
	return(true);
}

// MISC FUNCTIONS
function confirmDelete() {
	var agree=confirm("Are you sure you want to delete this entry?");
	if (agree)
		return true;
	else
		return false;
}
function confirmSend() {
	var agree=confirm("Are you sure you want to send this Email Blast?");
	if (agree)
		return true;
	else
		return false;
}

// FORM FUNCTIONS
function submitForm(form){
	$("#"+form).submit();
}
function checkAll(field) {
	for (i = 0; i < field.length; i++)
		field[i].checked = true;
}
function uncheckAll(field) {
	for (i = 0; i < field.length; i++)
		field[i].checked = false;
}

// TINYMCE
// http://wiki.moxiecode.com/index.php/TinyMCE:Custom_filebrowser
var tinyWindow = null;
var tinyImageWindow = null;
var tinyFieldName = null;
var tinyFileType = null;
function tinyImagePopup(field_name, url, type, win){
	tinyWindow  = win;
	tinyFieldName = field_name;
	tinyFileType = type;
	tinyImageWindow = window.open(CMS_PATH+'/tiny_mce/image_browser.php','tinyImageWindow','width=680,height=570,resizable=0,scrollbars=0,status=0,toolbar=0,location=0,menubar=0');
	tinyImageWindow.focus();
}
function setFile(value){
	tinyWindow.document.forms[0].elements[tinyFieldName].value = value;
	if(tinyFileType == "image"){
        if (tinyWindow.ImageDialog.getImageData) tinyWindow.ImageDialog.getImageData();
        if (tinyWindow.ImageDialog.showPreviewImage) tinyWindow.ImageDialog.showPreviewImage(value);
	}else if(tinyFileType == "media"){
		tinyWindow.switchType(value);
		tinyWindow.generatePreview();
	}
	tinyImageWindow.close();
}
// TYPEOF FIX
function RealTypeOf(v){
  if(typeof(v) == "object"){
    if(v === null) return "null";
    if(v.constructor == (new Array).constructor) return "array";
    if(v.constructor == (new Date).constructor) return "date";
    if(v.constructor == (new RegExp).constructor) return "regex";
    return "object";
  }
  return typeof(v);
}
// UNESCAPE FIX
function urldecode(str){
	str = "" + str;
	while(true){
		var i = str . indexOf ('+');
		if (i < 0)
			break;
		str = str . substring (0, i) + '%20' +
			str . substring (i + 1, str . length);
	}
	return unescape(str);
}
String.prototype.startsWith = function(str){return (this.match("^"+str)==str)}
String.prototype.endsWith = function(str){return (this.match(str+"$")==str)}
String.prototype.toCapitalCase = function(){
	var re = /\s/;
	var words = this.split(re);
	re = /(\S)(\S+)/;
	for(i = words.length - 1; i >= 0; i--){
		re.exec(words[i]);
		words[i] = RegExp.$1.toUpperCase()
		+ RegExp.$2.toLowerCase();
	}
	return words.join(' ');
}
String.prototype.replaceAll = function(strTarget, strSubString){
    var strText = this;
    var intIndexOfMatch = strText.indexOf(strTarget);
     
    while(intIndexOfMatch != -1){
        strText = strText.replace( strTarget, strSubString);
        intIndexOfMatch = strText.indexOf(strTarget);
    }
    return(strText);
}
function isEven(num){
	return !(num % 2);
}
function isOdd(num){
	return !isEven(num);
}
function consoleLog(message){
	if(typeof window.console != "undefined" && typeof window.console.log != "undefined"){
		console.log(message);
	}
}
function isDefined(variable){
    return (!(!(document.getElementById(variable))))
}
