//-------------------------------------------------------------------
//global vars
//-------------------------------------------------------------------
var help_requested = false;
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//href - return current href minus querystring and anchor
//-------------------------------------------------------------------
function href(){
	return location.protocol + "//" + location.host + location.pathname;
}
//-------------------------------------------------------------------

//--------------------------------------------------------------
//Borrowed code to determine entity type
//--------------------------------------------------------------
function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (typeof value.length === 'number' &&
                    !(value.propertyIsEnumerable('length')) &&
                    typeof value.splice === 'function') {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}


function isEmpty(o) {
    var i, v;
    if (typeOf(o) === 'object') {
        for(i in o){
			if(o.hasOwnProperty(i)){
	            v = o[i];
	            if (v !== undefined && typeOf(v) !== 'function') {
	                return false;
	            }
			}
        }
    }
    return true;
}

String.prototype.entityify = function () {
    return this.replace(/&/g, "&amp;").replace(/</g,"&lt;").replace(/>/g, "&gt;");
};

String.prototype.quote = function () {
    var c, i, l = this.length, o = '"';
    for (i = 0; i < l; i += 1) {
        c = this.charAt(i);
        if (c >= ' ') {
            if (c === '\\' || c === '"') {
                o += '\\';
            }
            o += c;
        } else {
            switch (c) {
            case '\b':
                o += '\\b';
                break;
            case '\f':
                o += '\\f';
                break;
            case '\n':
                o += '\\n';
                break;
            case '\r':
                o += '\\r';
                break;
            case '\t':
                o += '\\t';
                break;
            default:
                c = c.charCodeAt();
                o += '\\u00' + Math.floor(c / 16).toString(16) +
                    (c % 16).toString(16);
            }
        }
    }
    return o + '"';
};

String.prototype.supplant = function (o) {
    return this.replace(/{([^{}]*)}/g,
        function (a, b) {
            var r = o[b];
            return typeof r === 'string' || typeof r === 'number' ? r : a;
        }
    );
};

String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, "");
};
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//basic delete dialog setup
//-------------------------------------------------------------------
var modal_delete_object = {
	div: $("<div id='delete_modal' title='Delete item?' class='hidden'><p><span class='fugue fugue-exclamation'>Once you leave or refresh this page, this item will be permanently deleted and cannot be recovered.</span></p><p>Are you sure?</p></div>"),
	dialog: {
		resizable: false,
		modal: true,
		width: 400,
		height: 200,
		buttons: {
			Cancel: function() {
				$(this).dialog('close');
			}
		}
	}
};
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//Function to manage delete modal
//-------------------------------------------------------------------
function delete_modal(me, ajax, parent){
	if(me.data("delete_state") == "delete"){
		var delete_obj = $.extend({}, modal_delete_object); //get the standard delete dialog object
		if(!$("#delete_modal").length){
			delete_obj.div.appendTo($("body"));
		}
		//-------------------------------------------------------------------
		//Ammend the delete dialog object to include the buttons we want
		//-------------------------------------------------------------------
		delete_obj.dialog.buttons['Delete item'] = function() {
			if(ajax){
				$.getJSON(me.attr("href") + "&ajax=1", function(data){
					if(!data.error_array){
						parent.addClass('deleted');
						me.removeClass('fugue-minus-circle-frame').addClass('fugue-arrow-curve-180-left').prop("title", "Restore this item").attr("href", "?form_name=" + data.undo.form_name + "&undo=" + data.undo.undo + "&id=" + data.undo.id).data("delete_state", "undo");
					}
				});
			}
			else{
				location.href = me.attr("href");
			}
			$(this).dialog('close');
		};
		//-------------------------------------------------------------------
		$("#delete_modal").dialog(delete_obj.dialog);
	}
	else{
		if(ajax){
			$.getJSON(me.attr("href") + "&ajax=1", function(data){
				if(data.deleteCode){
					me.attr("href", data.deleteCode).addClass('fugue-minus-circle-frame').removeClass('fugue-arrow-curve-180-left').prop("title", "Delete this item").data("delete_state", "delete");
					parent.removeClass('deleted');						
				}
			});
		}
		else{
			location.href = me.attr("href");
		}
	}
}
//-------------------------------------------------------------------

//-----------------------------------------------------------------------
function clearErrors(form){
	form = $("form#" + form);
	var form_id = $(form).attr("id").replace("_update", "").replace("_add", "");
	$('#' + $(form).attr("id") + ' li').children().removeClass("error");
	$("ol#" + form_id + "_error_report").removeClass("error").removeClass("success").empty();
}
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
function countObjectProperties(o) {
	var count = 0;
	var k;
	
	for(k in o){
		if(o.hasOwnProperty(k)){
			count++;
		}
	}
	return count;
}
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
function handle_error_array(error_array, form, msg){
	var ctrl;
	var i;
	form = $(form);
	
	if(!msg){
		msg = "Record updated";
	}
	
	var div_id = form.attr("id").replace("_update", "").replace("_add", "") ;
	var form_id = form.attr("id");

	clearErrors(form.attr("id"));
	
	if(countObjectProperties(error_array) > 0){
		$("ol#" + div_id + "_error_report").addClass("error");	

		for(ctrl in error_array){
			if(error_array.hasOwnProperty(ctrl)){
				if(typeOf(error_array[ctrl]) !="object"){
					$("#" + form_id + "_" + ctrl).addClass("error").siblings().addClass("error");
					$("ol#" + div_id + "_error_report").append("<li>" + $("#" + form_id + "_" + ctrl).siblings("label").html() + error_array[ctrl] + "</li>");
				}
				else{
					for(i in error_array[ctrl]){
						if(error_array[ctrl].hasOwnProperty(i)){
							var rows = $('form#' + form_id + " thead td" ).get();
							var cell = $("#" + form_id + "_" + ctrl + '_' + i).parent().addClass("error");
							var idx = cell.parent("tr").children().index(cell);
							
							var header = $("#" + div_id + "_add table thead tr th:nth-child(" + (idx + 1) + "), #" + div_id + "_update table thead tr th:nth-child(" + (idx + 1) + ")");
							header.addClass("error");
							$("ol#" + div_id + "_error_report").append("<li>" + header.html() + ": " + error_array[ctrl][i] + "</li>");
						}
					}
				}
			}
		}
	}
	
	else{
		$("ol#" + div_id + "_error_report").addClass("success").append("<li>" + msg + "</li>");
		form.find(".dirty").removeClass("dirty");
		
		var clearErrorMsg = function(){$("ol#" + div_id + "_error_report").removeClass("success").removeClass("error").children().remove();};
		var ajax_grid_timeout = setTimeout(clearErrorMsg, 1750);

		if(!form.hasClass("grid_add")){		
			if($("form#" + form_id).parents("div.modal_form").length > 0){
				window.formTimer = setTimeout("close_modal()", 1000);
			}
			else if($("form#" + form_id).parents("div.pop_up_form").length > 0){
				$("form#" + form_id).parents("div.pop_up_form").redrawShadow({left: 0, top: 3, blur: 5});
				window.formTimer = setTimeout("close_form('" + $("form#" + form_id).parents("div.pop_up_form").attr("id") + "')", 1000);
			}
			else if($("form#" + form_id).parents("div.ui-dialog").length > 0){
				window.formTimer = setTimeout("close_dialog('" + $($("form#" + form_id).parents("div.ui-dialog-content")[0]).attr("id") + "')", 1000);
			}
		}
	}
}
//-----------------------------------------------------------------------

//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
function ajaxGrid_add(form, data, insert_id){
	var new_form = window[form + "_ajax_form"];
	var html = new_form.form.replace(/<%id_increment%>/g, new_form.id_increment++);
	var table = $("#" + form + "_update_table");
	table.children("tbody").append(html);
	var row = table.find("tbody tr:last-child").css("background-color", "#e6e9fd");
	if(new_form.ready){new_form.ready(row);}
	var clear_color = function(){row.css('background-color', 'inherit');};
	var checkboxes = row.find("input[type=checkbox]");
	if(checkboxes.length > 0){
		checkboxes.prop("checked",false);
	}
	row.find("select").each(function(){
		me = $(this);
		if(me.attr("class").match("_cascade")){
			me.html($("#" + me.attr("id").replace("_" + (new_form.id_increment-1), "")).html());
		}
	});
	for(var x in data){
		if(data.hasOwnProperty(x)){
			var elem = row.find("#" + new_form.form_name + "_" + x + "_" + (new_form.id_increment-1));
			if(elem.length > 0){
				if(elem.prop("nodeName").toLowerCase() == "span"){
					var src_elem = $("#" + form.replace("_add", "") + "_" + x);
					if(src_elem.length > 0){
						if(src_elem.prop("nodeName").toLowerCase() == "select"){
							elem.html(src_elem.children("option:selected").html());
						} else if(src_elem.prop("type").toLowerCase() == "checkbox"){
							if(src_elem.val() == data[x]){
								elem.html("&#09745;");
							}
						} else if(src_elem.hasClass("autocomplete_val")){
							elem.html($("#" + form.replace("_add", "") + "_" + x + "_autocompletor").val());
						} else {
							elem.html(data[x]);
						}
					}
				} else if(elem.prop("type").toLowerCase() == "checkbox"){
					if(elem.val() == data[x]){
						elem.prop("checked", "checked");
					}
				} else {
					if(elem.hasClass("{date:true,")){
						elem.val(data[x].substring(5, 7) + "/" + data[x].substring(8, 10) + "/" + data[x].substring(0, 4));
					}
					else elem.val(data[x]);
				}
			}
		}
	}
	row.find(".autocomplete_val").each(function(){
		var a = $(this);
		$("#" + a.attr("id") + "_autocompletor").val($("#" + a.attr("id").replace("_" + (new_form.id_increment-1), "") + "_autocompletor").val());
	});
	var del = row.find("a.delete_field").data("delete_state", "delete");
	if(del.length > 0){
		del.attr("href", del.attr("href") + insert_id);
	}
	var ajax_grid_timeout = setTimeout(clear_color, 1250);
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//ajaxTable_add
//-------------------------------------------------------------------
function ajaxTable_add(form, data, insert_id){
	var new_form = window[form + "_ajax_form"];
	
	var html = new_form.form.replace(/<%id_increment%>/g, new_form.id_increment++);
	$.each(data, function(i, v){
		var reg = new RegExp("<%" + i + "%>", "g");
		html = html.replace(reg, v);
	});
	var table = $("#" + form + "_update_table");
	html.find("a.delete_field").data("delete_state", "delete");
	table.children("tbody").append(html);
	var row = table.find("tbody tr:last-child").css("background-color", "#e6e9fd");
	if(new_form.ready){new_form.ready(row);}
	var clear_color = function(){row.css('background-color', 'inherit');};
	$.each(data, function(i, v){
		field = row.find("[name=" + i + "]")
		if(field.length > 0){
			if(field.hasClass("autocomplete_val")){
				json = window[form.attr("id") + "_" + i];
				field.siblings("input").val(json_arr_return_val(json, "value", v, "label"));
			}
			if(field.prop("type")=="checkbox"){
				if(v && v != "0" && v.length != 0){
					field.prop("checked", "checked");
				} else field.prop("checked", false);
			}
			if(field.hasClass(form.attr("id") + "_" + i + "_cascade")){
				json = window[form.attr("id") + "_" + i];
				if(!json){
					if(console.log) console.log("can't find cascade refresh json");
				}
				else{
					id = field.attr("class").match(/cascade_requires_\w+/);
					id = id[0].substring(17);		
					field.empty().append(force_cascade(data[id], json));
				}
			}
			if(v == null){
				v = '';
			}
			if(field.prop("type")!="checkbox" && field.prop("type")!="radio") field.val(v);
		}
	});
	table.find("tbody > tr").each(function(i, v){
		if(i%2 == 0){
			$(v).removeClass("edit_table_stripe_0").addClass("edit_table_stripe_1");
		}
		else $(v).removeClass("edit_table_stripe_1").addClass("edit_table_stripe_0");
	});
	var ajax_grid_timeout = setTimeout(clear_color, 1250);
}
//-------------------------------------------------------------------

//-----------------------------------------------------------------------
var ajaxForm_options = {
	dataType: 'json',
	data: {"ajax": 1}, 
    success:       
		function(data, successText, jqForm){
			jqForm = $(jqForm).siblings("div").hide().end().show();
			if(!data.error_array){
				jqForm.find(".dirty").removeClass("dirty");	
			}
			handle_error_array(data.error_array, jqForm[0]);	
		}  // post-submit callback 
};
//-----------------------------------------------------------------------

//-------------------------------------------------------------------
//ajaxGrid_options
//-------------------------------------------------------------------
function ajaxGrid_options(form){
	ajax_options = {
		dataType: 'json',
		data: {"ajax": 1},
		success:
			function(data, successText, jqForm){
				jqForm = $(jqForm).siblings("div#" + $(jqForm).attr("id").replace("add", "loader_div")).hide().end().show();// I changed this 101010
				if(!data.error_array){
					jqForm.find(".dirty").removeClass("dirty");	
				}
				handle_error_array(data.error_array, jqForm[0]); //I changed this 101010
				
				if(!data.error_array){
					ajaxGrid_add(form.attr("id").replace("_add", ""), data.add_row, data.insert_id);
				}
			}
	};
	return ajax_options;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//ajaxTable_options
//-------------------------------------------------------------------
function ajaxTable_options(form, success){
	ajax_options = {
		dataType: 'json',
		data: {"ajax": 1},
		success:
			function(data, successText, jqForm){
				jqForm = $(jqForm).siblings("div.loader").hide().end().show();// I changed this 101010
				if(!data.error_array){
					jqForm.find(".dirty").removeClass("dirty");
				}
				handle_error_array(data.error_array, jqForm[0]); //I changed this 101010
				if(!data.error_array && data.add_row && data.update_table){
					var table = $(data.update_table);
					var row = table.find("tbody > tr");
					var tbody = $("#" + jqForm.attr("id") + "_update_table").children("tbody");
					tbody.append(row);
					if($.isFunction(success)) success(data);
				}
				if(!data.error_array && data.update_table){
					var table = $(data.update_table);
					var row = table.find("tbody > tr");
					window[jqForm.attr("id").replace("_1", "") + "_update_row"].replaceWith(row);
					if($.isFunction(success)) success(data);
				}
			}
	};
	return ajax_options;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
function refresh_option_list_ajaxForm(ctrl, id, form, obj){
	var refresh_select_options = {
	dataType: 'json', 
	data: {ajax: 1},
    success:       
		function(data, successText, jqForm){
			var val;
			handle_error_array(data.error_array, jqForm);
			val = data.insert_id;

			$.post(location.href, {ajax: 1, option_refresh: ctrl, form_name: form}, function(data){
				$('#' + id).html(data).val(val);
			});
			if(countObjectProperties(data.error_array) === 0){
				$("div#" + $(obj).attr("id") + "_popup").removeShadow().hide();
			}
		}  // post-submit callback 
	};

	return refresh_select_options;
}
//-------------------------------------------------------------------


//-----------------------------------------------------------------------
//Function to filter a JSON lookup configured for jquery.cascade.js
//-----------------------------------------------------------------------
function filterJSON(lookup, json){
	var output = [];
	$.each(json, function(i, v){
		if(v.When == lookup){
			output.push({Value: v.Value, Text: v.Text});
		}
	});
	return output;
}
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function returnOptions(default_value, default_option, json){
	var html = null;
	var row;
	
	if(default_option.length > 0){
		html = '<option value="' + default_value + '">' + default_option + "</option>\n";
	}
		
	$.each(json, function(i,v){
		html += '<option value="' + v.Value + '">' + v.Text + "</option>\n";
	});
	
	return html;
}
//-----------------------------------------------------------------------


//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
function JSONintersect(json1, json2){
	
	var output = [];
	var row1;
	var row2;
	
	for(row1 in json1){
		if(json1.hasOwnProperty(row1)){
			for(row2 in json2){
				if(json2.hasOwnProperty(row2)){
					if(json1[row1].Value == json2[row2].Value && json1[row1].Text == json2[row2].Text){
						output.push({Value: json1[row1].Value, Text: json1[row1].Text});
					}
				}
			}
		}
	}
	return output;
}
//-----------------------------------------------------------------------

//-------------------------------------------------------------------
//json_arr_delete
//-------------------------------------------------------------------
function json_arr_delete(arr, key, search){
	for(var k in arr){
		if(arr.hasOwnProperty(k)){
			if(arr[k][key] == search){
				return arr.splice(k, 1);
			}
		}
	}
	
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//json_arr_search_count
//-------------------------------------------------------------------
function json_arr_search_count(arr, key, search){
	var i = 0;
	for(var k in arr){
		if(arr.hasOwnProperty(k)){
			if(arr[k][key] == search){
				i++;
			}
		}
	}
	return i;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//json_arr_search_count
//-------------------------------------------------------------------
function json_arr_edit(arr, key, search, data){
	var i = 0;
	for(var k in arr){
		if(arr.hasOwnProperty(k)){
			if(arr[k][key] == search){
				for(var l in data){
					if(data.hasOwnProperty(l)){
						arr[k][l] = data[l];
					}
				}
			}
		}
	}
	return i;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//json_arr_return_val
//-------------------------------------------------------------------
function json_arr_return_val(arr, key, search, key2){
	for(var k in arr){
		if(arr.hasOwnProperty(k)){
				if(arr[k][key] == search){
				return arr[k][key2];
			}
		}
	}
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//json_arr_return_arr
//-------------------------------------------------------------------
function json_arr_return_arr(arr, key, search){
	for(var k in arr){
		if(arr.hasOwnProperty(k)){
			if(arr[k][key] == search){
				return arr[k];
			}
		}
	}
}
//-------------------------------------------------------------------


//-------------------------------------------------------------------
//Close modal form
//-------------------------------------------------------------------
function close_modal(){
	$.modal.close();
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//Close pop_up_form
//-------------------------------------------------------------------
function close_form(div){
	$("#" + div).removeShadow().slideUp();
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//Close dialog
//-------------------------------------------------------------------
function close_dialog(div){
	$("#" + div).dialog("close");
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//json_subset
//-------------------------------------------------------------------
function json_subset(lookup, key, json){
	var x = [];
	var ob;
	
	for(ob in json){
		if(json.hasOwnProperty(ob)){
			if(json[ob][key] == lookup){
				x.push(json[ob]);
			}
		}
	}
	return x;
}
//-------------------------------------------------------------------


//-------------------------------------------------------------------
//json_first_occurrence
//-------------------------------------------------------------------
function json_first_occurrence(lookup, key, json){
	var ob;
	for(ob in json){
		if(json.hasOwnProperty(ob)){
			if(json[ob][key] == lookup){
				return [ob];
				/*break;*/
			}
		}
	}
}
//-------------------------------------------------------------------

//-----------------------------------------------------------------------
function implode_parsequery(q){
	
	var href = [];
	var c;
	
	for(c in q){
		if(q.hasOwnProperty(c)){
			href.push(c + "=" + q[c]);
		}
	}
	
	return "?" + href.join("&");
}
//-----------------------------------------------------------------------

//-------------------------------------------------------------------
//Code to force cascade selects to refresh after autofill
//-------------------------------------------------------------------
function force_cascade(value, json){
	var html = '<option value="0" selected="selected">select...</option>';
	if(!json){
		return html;
	}
	
	for(i=0; i < json.length; i++){
		if(json[i].When == value){
			html += '<option value="' + json[i].Value + '">' + json[i].Text + '</option>';
		}
	}
	return html;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//Date conversion of STD MySQL datestring to Javascript date
//-------------------------------------------------------------------
function mysql_date(string) {  
    var date = new Date();  
    var parts = String(string).split(/[- :]/);  
  
    date.setFullYear(parts[0]);  
    date.setMonth(parts[1] - 1);  
    date.setDate(parts[2]);  
    if(parts.length >= 4) date.setHours(parts[3]);  
    if(parts.length >= 5)date.setMinutes(parts[4]);  
    if(parts.length >= 6)date.setSeconds(parts[5]);  
    if(parts.length >= 7) date.setMilliseconds(parts[6]);  
  
    return date;  
}  
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//time_format
//-------------------------------------------------------------------
function time_format(dt){
	var time = {hour: dt.getHours(), minute: dt.getMinutes().toString(), meridiem: "am"};
	if(time.hour > 12){
		time.meridiem = "pm";
		time.hour = time.hour - 12
	}
	else if(time.hour == 12){
		time.meridiem = "pm";
	}
	while(time.minute.length < 2){
		time.minute = "0" + time.minute;
	}
	if(time.hour === 0){
		time.hour = 12;
	}
	return time.hour + ":" + time.minute + " " + time.meridiem;
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//display list of all items in autocompletor
//-------------------------------------------------------------------
function autocompletor_list(elem){
	var ul = $("<ul>").addClass("autocompletor_list").appendTo("body");
	if(elem.siblings("label").length > 0) ul.prop("title", elem.siblings("label").html().replace(": ", ""));
	var rt = elem.attr("id").replace(/_\d+/, "");
	list = window[rt];
	for(var k in list){
		if(list.hasOwnProperty(k)){
			$("<li>").appendTo(ul).append("<a href='?id=" + list[k]['value'].replace(" ", "%20") + "'>" + list[k]['label'] + "</a>");
		}
	}
	ul.find("li > a").click(function(event){
		var me = $(this);
		var id = me.attr("href");
		id = id.substring(id.indexOf("id="));
		id = id.substring(3);
		elem.siblings("input").val(me.html());
		elem.val(id);
		ul.dialog("close");
		event.preventDefault();
	});
	ul.dialog({
		close: function(){
			ul.remove();
		},
		width: 500,
		height: 400,
		hide: "slide"
	});
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//apply_form_events
//-------------------------------------------------------------------
function apply_form_events(jq){
	var me;
	jq.each(function(){
		me = $(this);
		if(me.hasClass("edit_table") && (me.hasClass("ajax_add") || me.hasClass("ajax_form"))){
			me.data("ajax_options", ajaxTable_options(me));
		}
		else if(me.hasClass("grid_add")){
			me.data("ajax_options", ajaxGrid_options(me));
		} else{
			me.data("ajax_options", ajaxForm_options);	
		}
		
		me.validate && me.validate({
			ignore: ".ignore",
			debug: false,
			invalidHandler: function(form, validator) {
				var errors = validator.numberOfInvalids();
				if(errors) {
					var message = errors == 1 ? 'You missed 1 field. It has been highlighted' : 'You missed ' + errors + ' fields. They have been highlighted';
					$("div.error span").html(message);
					$("div.error").show();
				} else {
					$("div.error").hide();
				}
		    },
			submitHandler: function(form) {
				var frm = form;
				var rte;
				
				form = $(form);
				
				rte = form.find("textarea.elrte");
				if(rte.length > 0){
					rte.elrte("updateSource");
				}
				if(form.hasClass("ajax_form")){
					if($("#" + form.attr("id") + "_form_type").val() == "add" && form.hasClass("entry") && !form.hasClass("ajax_add")){
						frm.submit();
					} else {
						form.hide().siblings("div").show();
						form.ajaxSubmit(form.data("ajax_options"));
					}
				}
				else frm.submit();
			},
			errorClass: "validateError"
		});
	});
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//paginate_forms_code
//-------------------------------------------------------------------
function paginate_forms_code(div){
	var forms = div.find("form.ajax_form");
	if(forms.length > 0){
		apply_form_events(forms);
		forms.find('input:submit').button();
	}
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//apply_paginate_ajax
//-------------------------------------------------------------------
function apply_paginate_ajax(me){
	me.data("ajax_options", {
		data: {ajax: 1}, 
		success: function(responseText, statusText, xhr, jqForm){
			var div = me.parent();
			var new_div = $(responseText);
			div.replaceWith(new_div);
			paginate_forms_code(new_div);
			apply_paginate_ajax(new_div.children("form.paginate"));
		}
	}).ajaxForm(me.data("ajax_options"));
}
//-------------------------------------------------------------------

var root_location = location.href.split("/");
root_location[root_location.length-1]="";
root_location=root_location.join("/");

//-------------------------------------------------------------------
//READY CODE
//-------------------------------------------------------------------
$(document).ready(function(){
			
	$("a.click_once_menu").click(function(event){
		$("ul#ul_" + $(this).attr("id").replace("_menu", "")).slideToggle();
		event.preventDefault();
	});
	$(".ui_button, .div_button, .delete_button").mouseover(function(event){$(this).addClass("ui-state-hover");}).mouseout(function(event){$(this).removeClass("ui-state-hover");});
	$("form.entry a.delete_field").click(function(event){
		delete_modal($(this), false, $($(this).parents("tr")[0]));
		event.preventDefault();
	});
	$("td a.delete_field").live('click', function(event){ //Grid delete buttons found by td rather than form.grid because non-update forms have no form element
		delete_modal($(this), true, $($(this).parents("tr")[0]));
		event.preventDefault();
	}).data("delete_state", "delete");
	$("form.grid.dirty_form input, form.grid.dirty_form textarea, form.grid.dirty_form select, form.entry.dirty_form input, form.entry.dirty_form textarea, form.entry.dirty_form select").live("change", function(event){
		$(this).addClass("dirty");
	});
	apply_form_events($("form.ajax_form, form.ajax_add"));
	$("#help").draggable({ axis: 'x', handle: 'div#help_title_bar'}).resizable({ handles: 'w, s, sw' });
	$("#help_content").tabs({
		select: function(event, ui) {
			$.post(root_location + root_backup + "help/index.php", {help_tab: ui.index});
		},
		selected: help_tab
	});
	$("#help_link").click(function(event){
		$("div#help").slideDown('slow');
		$.post(root_location + root_backup + "help/index.php", {help_state: "open"});
		event.preventDefault();
		event.stopPropagation();
	});
	$("a#help_minimize").click(function(event){
		$("div#help").css("height", "auto").css("min-height", "0px");
		$("div#help_content").slideUp('slow');
		$.post(root_location + root_backup + "help/index.php", {help_state: "minimized"});
		event.preventDefault();
	});
	$("a#help_close").click(function(event){
		$("div#help").css("min-height", "0px").slideUp('slow');
		$.post(root_location + root_backup + "help/index.php", {help_state: "closed"});
		event.preventDefault();
	});
	$("a#help_maximize").click(function(event){
		$("div#help").css("min-height", "100%");
		$("div#help_content").slideDown('slow');
		$.post(root_location + root_backup + "help/index.php", {help_state: "open"});
		event.preventDefault();
	});
	$("#help li.help_topics a, #search_topics ul.help_topics li a").live("click", function(event){
		scroll(0,0);
		$("#help #help_topic").load($(this).attr("href"), {help_ajax: 1}, function(){$(this).slideDown('slow');});
		event.preventDefault();
	});
	$("#help li.category_topics a").live("click", function(event){
		scroll(0,0);
		$("#help-category-topic").load($(this).attr("href"), {help_ajax: 1}, function(){$(this).slideDown('slow');});
		event.preventDefault();
	});
	$("#filter_help").data("ajax_options",{
	url: root_location + root_backup + "help/index.php",
	data: {"help_ajax": 1}, 
    success:       
		function(data, successText, jqForm){
			$("#help #help_topic").slideUp();
			if(data == "<h3>Search results</h3><ul class='help_topics'></ul>") data = "<h3>Search results</h3><p class='error'>No matches found</p>";
			$("#help #search_topics").html(data).slideDown();
		}
	});
	$("a.expand_collapse").click(function(event){
		var t = $(this);
		if(t.hasClass("expand")){
			t.removeClass("expand").addClass("collapse").removeClass("fugue-toggle-expand").addClass("fugue-toggle");
				
		} 
		else {
			t.removeClass("collapse").addClass("expand").addClass("fugue-toggle-expand").removeClass("fugue-toggle");
		}
		t.parent("li").children("li ul").slideToggle();
		event.preventDefault();
	});

	//-------------------------------------------------------------------
	//Code for new window navigation
	//-------------------------------------------------------------------
	$('a[rel="new_window"]').click(function(event){
        window.open($(this).attr('href'));
        event.preventDefault();
    });
	//-------------------------------------------------------------------
    
    //-------------------------------------------------------------------
    //Left-nav draw-style navigation
    //-------------------------------------------------------------------
    $("ul.drawer_menu").find("li > ul").parent("li").children("a:first-child").after("<div class='drawer_pull'><div class='ui-icon'>&nbsp;</div></div>");
	
	$("div.drawer_pull").siblings("ul.active").parent().children("div.drawer_pull").addClass("open");
	
	$("div.drawer_pull").mouseover(function(event){
		$(this).addClass("drawer_hover");
	}).mouseout(function(event){
		$(this).removeClass("drawer_hover");
	}).mousedown(function(event){
		$(this).addClass("drawer_active");
	}).mouseup(function(event){
		$(this).removeClass("drawer_active");
	}).click(function(event){
		var me = $(this);
		if(me.hasClass("open")){
			me.removeClass("open").siblings("ul").slideUp();
		}
		else{
			me.addClass("open").siblings("ul").slideDown();
		}
	});
    //-------------------------------------------------------------------
	
	//-------------------------------------------------------------------
	//paginate events
	//-------------------------------------------------------------------
	$("form.paginate a").live("click", function(event){
		var me = $(this);
		$.get(me.attr("href"), {ajax: 1}, function(data){
			div = $(data)
			me.parents("div.paginate_div").replaceWith(div);
			apply_paginate_ajax(div.children("form.paginate"));
			paginate_forms_code(div);
		});
		event.preventDefault();	
	});
	$("form.paginate").each(function(){
		apply_paginate_ajax($(this));
	});
	//-------------------------------------------------------------------
	
	//-------------------------------------------------------------------
	//Edit Table Code
	//-------------------------------------------------------------------
	$("<div class='button_container marginl10'><div class='ui-state-default ui-corner-left ui-corner-right ui_button sprite_button add_edit_table'><a href='#'><span class='fugue-plus-circle'>Add new record</span></a></div></div>").insertBefore($("table.edit_table").parent().siblings("div").hide().end())
	.click(function(event){
		var me = $(this).parent();
		$("#" + me.attr("id").replace(/_div$/, "")).prop("title", me.prop("title")).parent().prop("title", "Add record").dialog({width: 'auto', modal: true});
		event.stopPropagation();
		event.preventDefault();
	});
	
	$("a.edit_table_edit").live("click", function(event){
		var me = $(this);
		var frm_id = me.parents("table").attr("id").replace("_update_table", "");
		var key = me.attr("id").replace(frm_id + "_", "");
		var id;
		var form_name = $("#" + frm_id + "_1_form_name").val();
		var datum = {form_name: form_name, autofill: 1, ajax: 1};
		window[frm_id + "_update_row"] = me.parents("tr");
		$("#" + frm_id + "_1_form_type").val("update");
		id = key.match(/\d+/);
		id = id[0];
		
		key = key.replace("_" + id.toString(), "");
		datum[key] = id;
		
		$("#" + frm_id + "_1").autofill({
			location: href(),
			data: datum,
			success: function(data){
				//console.log(data);
			}
		}).parent().prop("title", "Edit record").dialog({width: 500, modal: true});
		event.preventDefault();
	});
	//-------------------------------------------------------------------
});
//-------------------------------------------------------------------

//-------------------------------------------------------------------
//Custom Validation Methods
//-------------------------------------------------------------------
if(jQuery.validator){
	jQuery.validator.addMethod("clickonce_default_required", function(value, element, params) { 
		switch( element.nodeName.toLowerCase() ) {
			case 'select':
				// could be an array for select-multiple or a string, both are fine this way
				var val = $(element).val();
				return (val && val.length > 0) || val == params[0];
			case 'input':
				if ( this.checkable(element) ){
					return (this.getLength(value, element) > 0) || value == params[0];
				}
				break;
			default:
				return $.trim(value).length > 0 || value == params[0];
		}
	}, "This field is required.");
	jQuery.validator.addMethod("clickonce_required", function(value, element, params) { 
		switch( element.nodeName.toLowerCase() ) {
			case 'select':
				// could be an array for select-multiple or a string, both are fine this way
				var val = $(element).val();
				return val && val.length > 0 && val != params[0];
			case 'input':
				if ( this.checkable(element) ){
					return this.getLength(value, element) > 0;
				}
				break;
			default:
				return $.trim(value).length > 0;
		}
	}, "This field is required.");
	jQuery.validator.addMethod("telephone", function(telephone, element){return this.optional(element) || telephone.match(/^\(?[\d]{3}\)?[\-.\s]?[\d]{3}[-.\s]?[\d]{4}$|^[\d]{3}[-.\s]?[\d]{4}$/);}, "Please specify a valid phone number");
	jQuery.validator.addMethod("postal_code", function(postal_code, element){return this.optional(element) || postal_code.match(/^([a-zA-Z][0-9][a-zA-Z](\s*)[0-9][a-zA-Z][0-9]){1}$/);}, "Please specify a valid postal code");
	jQuery.validator.addMethod("currency", function(currency, element){return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test($.trim(currency.replace("$", "")));}, "Please specify a valid dollar amount");
	jQuery.validator.addMethod("percent", function(percent, element){return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test($.trim(percent.replace("%", "")));}, "Please specify a valid percentage");
	//jQuery.validator.addMethod("currency", function(currency, element){return this.optional(element) || currency.match(/^(\-?\$?\d)(,\d{1,3}|\d*)(\.\d{2})?$/);}, "Please specify a valid dollar amount");
	jQuery.validator.addMethod("time", function(time, element){return this.optional(element) || time.match(/^[0-2]?\d(:[0-6]\d(\s?[aApP][mM])?){1}$/);}, "Please specify a valid time");//
}
//-------------------------------------------------------------------
