/*extern $ */
var ORBTECH = {};

ORBTECH.getFullHomeUrlSecure = function ()
{
    return '/index.html';
};

ORBTECH.setFormAction = function (action)
{
    var obj = $('#http_action_id');
    obj.val(action);
};

ORBTECH.initDatePicker = function ()
{
	//$.datepick.setDefaults();
	$('.date').datepick();
    //$.datePicker.setDateFormat('mdy', '/');
    //$('.date').datePicker();
};

ORBTECH.extendObject = function (o)
{
    var F = function () {};
    F.prototype = o;
    return new F();
};

ORBTECH.Class = {};

ORBTECH.Class.Base = function ()
{
    var that = this;

    that.type = 'Base';

    that.init = function (json) {};
    that.populate = function (json)
    {
        var propName = '';
        for (propName in json)
        {
            if (json.hasOwnProperty(propName))
            {
                if (this[propName] !== undefined)
                {
                    this[propName] = json[propName];
                }
            }
        }
    };
    that.addEvents = function () {};
    that.setVars = function () {};
    that.getById = function (id)
    {
        var retVal = null;
        if (id)
        {
            retVal = window.document.getElementById(id);
        }
        if (retVal)
        {
            retVal = $(retVal);
        }
        else
        {
            retVal = $([]);
        }
        return retVal;
    };
    return that;
};

ORBTECH.Class.AjaxPost = function ()
{
    var parent = new ORBTECH.Class.Base();
    var that = ORBTECH.extendObject(parent);

    that.formId = '';
    that.form = null;
    that.actionId = '';
    that.action = null;
    that.containerId = '';
    that.container = null;
    that.resultContainerId = '';
    that.resultContainer = null;
    that.postData = {};
    that.actionWaitValue = 'Loading';
    that.saveActionValue = '';

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };

    that.setVars = function ()
    {
        parent.setVars.call(this);
        that.container = this.getById(this.containerId);
        that.resultContainer = this.getById(this.resultContainerId);
        that.action = this.getById(this.actionId);
        that.form = this.getById(this.formId);
        that.saveActionValue = this.action.val();
    };

    that.addEvents = function ()
    {
        parent.addEvents.call(this);
        this.form.submit(this.actionHandler);
    };

    that.actionHandler = function ()
    {
        that.actionEvent();
        return false;
    };

    that.actionEvent = function ()
    {
        this.submitPost();
    };

    that.submitPost = function ()
    {
        this.addInputData();
        this.sendRequest();
    };
    that.sendRequest = function ()
    {
        that.postData.ajax_request = 1;
		that.saveActionValue = this.action.val();
        if ((this.action) && (this.action.attr('type') === 'submit'))
        {
            this.action.val(this.actionWaitValue);
        }
        $.post(ORBTECH.getFullHomeUrlSecure(), this.postData, this.callBackHandler);
    };
    that.addInputData = function ()
    {
        var inputArray = $(':input', this.container);
        var input = null;
        var i = 0;
        for (i = 0; i < inputArray.length; i += 1)
        {
            input = inputArray[i];
            this.buildPostData(input);
        }
    };
    that.buildPostData = function (element)
    {
        var obj = $(element);
        var objName = obj.attr('name');
        var val = obj.val();
        var isChecked = true;
        if (obj.attr("type") === "checkbox")
        {
            isChecked = element.checked;
        }
        var addToPost = true;
        if ((objName === undefined) || (isChecked === false) || (isChecked === undefined))
        {
            addToPost = false;
        }
        if (addToPost === true)
        {
            this.postData[objName] = val;
        }
    };
    that.callBackHandler = function (data)
    {
        that.callBack(data);
    };
    that.callBack = function (data)
    {
        this.resultContainer.html(data);
        if (this.saveActionValue !== '')
        {
            this.action.val(this.saveActionValue);
        }
        ORBTECH.initPage();
        ORBTECH.initToggleLegend();
        ORBTECH.tableSorterFunction();
    };
    return that;
};

ORBTECH.Class.List = function ()
{
    var parent = new ORBTECH.Class.AjaxPost();
    var that = ORBTECH.extendObject(parent);

    that.type = 'List';
    that.resultContainerId = 'list_container_id';
    that.resultContainer = null;
    that.pageNumberId = 'page_number_id';
    that.pageNumber = null;
    that.totalPageNumberId = 'total_page_num_id';
    that.totalPageNumber = null;
    that.pageNumberInt = -1;
    that.totalPageNumberInt = -1;

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };

    that.setVars = function ()
    {
        parent.setVars.call(this);
        that.pageNumber = this.getById(this.pageNumberId);
        that.totalPageNumber = this.getById(this.totalPageNumberId);
        that.pageNumberInt = this.pageNumber.val();
        that.totalPageNumberInt = this.totalPageNumber.val();
        that.pageNumberInt = window.parseInt(this.pageNumberInt);
        that.totalPageNumberInt = window.parseInt(this.totalPageNumberInt);
    };

    return that;
};

ORBTECH.Class.SearchOption = function ()
{
    var parent = new ORBTECH.Class.AjaxPost();
    var that = ORBTECH.extendObject(parent);

    that.type = 'SearchOption';
    that.containerId = 'searchContainer';
    that.resultContainerId = 'searchStringContainer';
    that.actionId = 'search_column_name';
    that.defaultHtml = '';

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };

    that.setVars = function ()
    {
        parent.setVars.call(this);
        that.defaultHtml = this.resultContainer.html();
    };

    that.addEvents = function ()
    {
        this.action.change(this.updateSearchHandler);
    };

    that.updateSearchHandler = function ()
    {
        that.updateSearchOption();
    };

    that.updateSearchOption = function ()
    {
        var value = this.action.val();
        var re = /_id$/;
        if (re.test(value))
        {
            this.addInputData();
            that.postData['search[search_module]'] = this.postData['search[http_module]'];
            that.postData['search[http_action]'] = "searchUpdate";
            that.postData['search[http_module]'] = "table_list";
            this.sendRequest();
        }
        else
        {
            this.resultContainer.html(this.defaultHtml);
        }
    };
    return that;
};

ORBTECH.Class.Search = function ()
{
    var parent = new ORBTECH.Class.List();
    var that = ORBTECH.extendObject(parent);

    that.type = 'Search';
    that.formId = 'search_list_form_id';
    that.containerId = 'search_list_form_id';
    that.actionId = 'search_id';

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };
    that.actionHandler = function ()
    {
        that.actionEvent();
        return false;
    };

    that.actionEvent = function ()
    {
        this.pageNumberInt = 1;
        this.pageNumber.val(this.pageNumberInt);
        this.submitPost();
    };
    return that;
};

ORBTECH.Class.Page = function ()
{
    var parent = new ORBTECH.Class.List();
    var that = ORBTECH.extendObject(parent);

    that.type = 'Page';
    that.formId = 'page_list_form_id';
    that.containerId = 'page_list_form_id';
    that.actionId = 'paganation_id';
    that.paganationBackId = 'paganationBack';
    that.paganationBackAction = null;
    that.paganationForwardId = 'paganationForward';
    that.paganationForwardAction = null;

    that.init = function (json)
    {    
        this.populate(json);
        this.setVars();
        this.addEvents();
    };
    
    that.setVars = function ()
    {
        parent.setVars.call(this);
        that.paganationBackAction = this.getById(this.paganationBackId);
        that.paganationForwardAction = this.getById(this.paganationForwardId);
    };

    that.addEvents = function ()
    {
        parent.addEvents.call(this);
        this.paganationBackAction.click(this.paganationBackHandler);
        this.paganationForwardAction.click(this.paganationForwardHandler);
    };

    that.paganationBackHandler = function ()
    {
        that.paganationBack();
    };
    that.paganationBack = function ()
    {
        if (this.pageNumberInt > 1)
        {
            this.pageNumberInt -= 1;
            this.pageNumber.val(this.pageNumberInt);
            this.submitPost();
        }
    };
    that.paganationForwardHandler = function ()
    {
        that.paganationForward();
    };
    that.paganationForward = function ()
    {
        if (this.pageNumberInt < this.totalPageNumberInt)
        {
            this.pageNumberInt += 1;
            this.pageNumber.val(this.pageNumberInt);
            this.submitPost();
        }
    };
    return that; 
};

ORBTECH.Class.Legend = function ()
{
    var parent = new ORBTECH.Class.AjaxPost();
    var that = ORBTECH.extendObject(parent);

    that.type = 'Legend';
    that.formId = 'legend_list_form_id';
    that.actionId = 'legend_id';
    that.containerId = 'legend_list_form_id';
    that.resultContainerId = 'list_container_id';
    that.toggleLegend = null;

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };

	that.addEvents = function ()
    {
		this.form.unbind();
        this.form.submit(this.actionHandler);
    };

    that.actionHandler = function ()
    {
        that.actionEvent();
        return false;
    };
    that.actionEvent = function ()
    {
        this.submitPost();
        this.toggleLegend.hideLegend();
    };    

    return that;
};

ORBTECH.Class.ToggleLegend = function ()
{
    var parent = new ORBTECH.Class.AjaxPost();
    var that = ORBTECH.extendObject(parent);

    that.type = 'ToggleLegend';
    that.containerId = 'tableLegendContainer';
    that.actionId = 'toggle_legend_id';
    that.requestedLegendHtml = false;

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.addEvents();
    };
    that.addEvents = function ()
    {
        this.action.toggle(this.showHandler, this.hideHandler);
    };
    that.showHandler = function ()
    {
        that.showLegend();
    };
    that.hideHandler = function ()
    {
        that.hideLegend();
    };
    that.callBackHandler = function (data)
    {
        that.callBack(data);
    };
    that.callBack = function (data)
    {
        that.requestedLegendHtml = true;
        this.container.html(data);
        var legend = new ORBTECH.Class.Legend();
        legend.init();
        legend.toggleLegend = this;
    };
    that.showLegend = function ()
    {
        if (this.requestedLegendHtml === false)
        {
            var module = this.getById('page_http_module').val();
            that.postData["legend[http_action]"] = "tableListUpdate";
            that.postData["legend[http_module]"] = "table_list";
            that.postData["legend[table_name]"] = module;
            this.sendRequest();
        }
        this.container.show('slow');
    };
    that.hideLegend = function ()
    {
        this.container.hide();
    };
    return that;
};



ORBTECH.initList = function ()
{
    ORBTECH.initSearch();
    ORBTECH.initPage();
    ORBTECH.initToggleLegend();
};

ORBTECH.initSearch = function ()
{
    var search = new ORBTECH.Class.Search();
    search.init();

    var searchOption = new ORBTECH.Class.SearchOption();
    searchOption.init();
};

ORBTECH.initPage = function ()
{
    var page = new ORBTECH.Class.Page();
    page.init();
};

ORBTECH.ready = function ()
{
    ORBTECH.initDatePicker();
    ORBTECH.initList();
	//ORBTECH.initDates();
    ORBTECH.tableSorterFunction();
    ORBTECH.initUserSearch();
    //ORBTECH.addPaganationEvents();
    //ORBTECH.addAjaxSubmitEvents();
    //ORBTECH.addLegendAjaxSubmitEvents();
    //ORBTECH.addSearchListEvents();
	ORBTECH.addCompanyEvents();
	ORBTECH.addPayrollEvents();
	ORBTECH.addInvoiceEvents();
	ORBTECH.addDeleteUserEvents();
	ORBTECH.addTicketWarningEvents();
};

$(document).ready(ORBTECH.ready);

var Form = function () {};

Form.submit = function (formObject)
{
    if (formObject !== undefined) 
    {
        formObject.submit();
    }
};

ORBTECH.addInvoiceEvents = function ()
{
    var confirmInvoiceSubmit = function ()
    {
        var submitForm = false;
        var msg = 'Are you sure you wish to save the invoice?\n';
        msg += 'After a invoice has been saved it can not be modified.';
        if (confirm(msg))
        {
            submitForm = true;
        }
        return submitForm;
    };
    $('#save_invoice_form').submit(confirmInvoiceSubmit);
};

ORBTECH.addPayrollEvents = function ()
{
	var confirmPayrollSubmit = function ()
	{
		var submitForm = false;
		var msg = 'Are you sure you wish to save the payroll?\n';
		msg += 'After a payroll has been saved it can not be modified.';
		if (confirm(msg))
		{
			submitForm = true;
		}
		return submitForm;
	};
	$('#save_payroll_form').submit(confirmPayrollSubmit);
};

ORBTECH.addDeleteUserEvents = function ()
{
    var confirmUserDelete = function ()
    {
        var deleteUser = false;
        var msg = 'Are you sure you wish to delete this user?\n';
        msg += 'This will delete all tickets associated with this user, and it can not be reversed.';
        if (confirm(msg))
        {
            deleteUser = true;
        }
        return deleteUser;
    };
    $('#delete_user_form').submit(confirmUserDelete);
};

ORBTECH.hideShowFieldServiceReportNumber = function ()
{
	var company = $('#ticket_company_id');
    var container = $('#add_ticket_form');
    if ((container) && (company))
    {
		var fieldServiceReportNumber = $('#field_service_report_number');
		var companyValue = company.find('option[selected]').text();
        companyValue = companyValue || ''
		companyValue = companyValue.toLowerCase();
		if (companyValue === 'servright')
		{
			fieldServiceReportNumber.parent('p').show();
		}
		else
		{
			fieldServiceReportNumber.parent('p').hide();
		}
	}
};

ORBTECH.addTicketWarningEvents = function ()
{
	var showWarningHandler = function ()
	{
		var ticket_warning = $('#ticket_warning_container'),
        	ticket_warning_head = null;

    	if (ticket_warning.length > 0) {
        	ticket_warning_head = $('#ticket_warning_head').text();
			alert(ticket_warning_head);
    	} 
	};
	showWarningHandler();
};

ORBTECH.buildPostObj = function (element, index, post_data)
{
    var obj = $(element);
    var objName = obj.attr('name');
    var val = obj.val();
    var isChecked = true;
    var isCheckBox = false;
    if (obj.attr("type") === "checkbox")
    {
        isChecked = element.checked;
    }
    //alert("objName: " + objName + " isChecked: " + isChecked);
    var addToPost = true;
    if ((objName === undefined) || (isChecked === false) || (isChecked === undefined))
    {
        addToPost = false;
    }
    if (addToPost === true)
    {
        post_data[objName] = val;
    }
    return post_data;
};

ORBTECH.addCompanyEvents = function ()
{
	ORBTECH.hideShowFieldServiceReportNumber();
	var company = $('#ticket_company_id');
	var after_hours = $('#after_hours_id');
	var container = $('#add_ticket_form');
	if (container.length === 0)
	{
		container = $('#edit_ticket_form');
	}
	if ((container.length) && (company.length))
	{
		var companyPropObj = {};
		companyPropObj.company_initial_time = $('#company_initial_time');
		companyPropObj.company_initial_amount = $('#company_initial_amount');
		companyPropObj.company_hourly_rate_id = $('#company_hourly_rate_id');
		companyPropObj.company_extra_expense = $('#company_extra_expense');

		companyPropObj.tech_initial_time = $('#tech_initial_time');
        companyPropObj.tech_initial_amount = $('#tech_initial_amount');
        companyPropObj.tech_hourly_rate_id = $('#tech_hourly_rate_id');
        companyPropObj.tech_travel_pay = $('#tech_travel_pay');

		var changeFunction = function ()
		{
			var company_value = company.val();
			var post_data = {};
            var buildSearchPostObj = function (index)
            {
                post_data = ORBTECH.buildPostObj(this, index, post_data);
            };
			if (company_value !== '0')
			{
				ORBTECH.hideShowFieldServiceReportNumber();

				$(':input', container).each(buildSearchPostObj);
				post_data["ticket[search_module]"] = post_data["ticket[http_module]"];
				post_data["ticket[http_action]"] = "getDefaultCompanyInfo";
				post_data["ticket[http_module]"] = "company";
				//post_data.http_action = 'getDefaultCompanyInfo';
				//post_data.http_module = 'company';
				post_data.ajax_request = 1;
				var callBackFunction = function (data)
				{
					try
					{
						data = data || {};
						var companyObj = eval('(' + data + ')');
						var prop = null;
						for (prop in companyObj)
						{
							if (companyObj.hasOwnProperty(prop))
							{
								if (companyPropObj[prop] !== undefined)
								{
									companyPropObj[prop].val(companyObj[prop]);
								}
							}
						}
					}
					catch (e)
					{
						alert("There was an error parsing the company json " + e.message);
					}
				};
				if (company.val().length > 1)
				{
					$.post(ORBTECH.getFullHomeUrlSecure(), post_data, callBackFunction);
				}
				else
				{
					var prop = null;
					for (prop in companyPropObj)
					{
						if (companyPropObj.hasOwnProperty(prop))
						{
							companyPropObj[prop].val('');
						}
					}
				}
			}
		};	
		company.change(changeFunction);
		after_hours.change(changeFunction);
	}
};

ORBTECH.tableSorterFunction = function ()
{
    var tableArray = [];
    var initTableFunction = function (index)
    {
        var tableParam = {
            table: this,
            stripeTable: true
        };
		if (tableParam.table.id === 'ticket_table_list_container')
		{
			tableParam.stripeTable = false;
		}
        var table = new ORBTECH.Table(tableParam);
        tableArray[tableArray.length] = tableArray;
    };
    $('table.sortMe').each(initTableFunction);
};

ORBTECH.initUserSearch = function ()
{
    var searchClick = function ()
    {
        var button = $(this);
		var button_val = button.val();
        var zip_code = $('#user_search_zip_code_id').val();
        var mile_radius = $('#user_search_mile_radius_id').val();
        var post_data = {
            "user_search[zip_code]": zip_code,
            "user_search[mile_radius]": mile_radius,
            "ajax_request": 1,
            "user_search[http_action]": "userSearch",
            "user_search[http_module]": "user"
        };
        var callBackFunction = function (data) {
            //$('#footer').append(data);
            var user_search_div = $('#user_search_div_id');
            user_search_div.html(data);
            user_search_div.show('slow');
            button.val(button_val);
        };
        button.val('Loading');
        $.post(ORBTECH.getFullHomeUrlSecure(), post_data, callBackFunction);
    };
    $('input.userSearch').click(searchClick);
};

ORBTECH.hide = function (id)
{
    $('#' + id).hide();
};
ORBTECH.show = function (id)
{
    $('#' + id).show();
};

ORBTECH.searchUserSelect = function (user_id, name) 
{
    $('#user_id').val(user_id);
    $('#user_id_name').val(name);
    ORBTECH.hide('user_search_div_id');
};

ORBTECH.toggleAllCheckBox = function (obj) 
{
    var form = null;
    var toggleCheck = null;
    if (obj !==  undefined) 
    {
        form = obj.form;
        if (form) 
        {
            toggleCheck = function (index)
            {
                if (this.checked === true)
                {
                    this.checked = false;
                    obj.value = "Check All";
                }
                else
                {
                    this.checked = true;
                    obj.value = "Uncheck All";
                }
            };
            $(':checkbox', form).each(toggleCheck);
        }
    }
};

ORBTECH.debug = function (obj) 
{
    var prop = null;
    for (prop in obj)
    {
        $('#footer').append('<p>' + prop + ' = ' + obj[prop] + '<\/p>');
    }
};

ORBTECH.stripeFunction = function (container)
{
    var jStripeMeTr = $(".stripeMe tr", container);
    var stripe = function ()
    {
        $(this).addClass("over");
    };
    var unStripe = function ()
    {
        $(this).removeClass("over");
    };
    jStripeMeTr.mouseover(stripe);
    jStripeMeTr.mouseout(unStripe);
    $(".stripeMe tr:even", container).addClass("altRow");
};

ORBTECH.initDates = function ()
{
    var json = {},
        selectDate = null,
        selectDateArray = $('.date'),
        i = 0,
        len = selectDateArray.length;

        for (i = 0; i < len; i += 1)
        {
            json = {
                "containerId": selectDateArray[i].id,
                "index": i
            };
            selectDate = new ORBTECH.Class.SelectDate();
            selectDate.init(json);
        }
};

ORBTECH.initToggleLegend = function ()
{
    var toggleLegend = new ORBTECH.Class.ToggleLegend();
    toggleLegend.init();
};


ORBTECH.Class.SelectDate = function ()
{
    var parent = new ORBTECH.Class.Base(),
        that = ORBTECH.extendObject(parent);

    that.containerId = '';
    that.container = null;
    that.index = -1;
    that.day = null;
    that.month = null;
    that.year = null;

    that.init = function (json)
    {
        this.populate(json);
        this.setVars();
        this.draw();
        this.setVarsAfterDraw();
        this.addEvents();
        this.hideContainer();
    };

    that.hideContainer = function ()
    {
        this.container.hide();
    };
    that.setVars = function ()
    {
        that.container = this.getById(this.containerId);
    };
    that.setVarsAfterDraw = function ()
    {
        that.day = this.getById('selectDateDay_' + this.index);
        that.month = this.getById('selectDateMonth_' + this.index);
        that.year = this.getById('selectDateYear_' + this.index);
    };
    that.addEvents = function ()
    {
        this.day.change(this.updateDateHandler);
        this.month.change(this.updateDateHandler);
        this.year.change(this.updateDateHandler);
    };
    that.updateDateHandler = function ()
    {
        that.updateDate();
    };
    that.updateDate = function ()
    {
        var year = this.year.val(),
        month = this.month.val(),
        day = this.day.val();

        if (year && month && day)
        {
            this.container.val(year + '-' + month + '-' + day);
        }
    };
    that.getHtml = function ()
    {
        var html = '',
        dateArray = this.container.val().split('/'),
        month = '',
        day = '',
        year = '',
        currentDate = new Date(),
        currentYear = currentDate.getFullYear();

        if (dateArray.length === 3)
        {
            month = dateArray[0];
            day = dateArray[1];
            year = dateArray[2];
        }

        html += '<select id="selectDateMonth_' + this.index + '">';
        html += '<option valuue=""></option>';
        html += this.getOptionHtml(1, 12, month);
        html += '</select>';

        html += '<select id="selectDateDay_' + this.index + '">';
        html += '<option valuue=""></option>';
        html += this.getOptionHtml(1, 31, day);
        html += '</select>';

        html += '<select id="selectDateYear_' + this.index + '">';
        html += '<option valuue=""></option>';
        html += this.getOptionHtml(1900, currentYear + 5, year);
        html += '</select>';

        return html;
    };
    that.getOptionHtml = function (start, end, defaultValue)
    {
        var html = '',
        start = start || 1,
        end = end || 12,
        value = start,
        selected = '';

        for (i = start; i <= end; i += 1)
        {
             selected = '';
             value = i + '';
             if (value.length === 1)
             {
                 value = '0' + value;
             }
             if (defaultValue === value)
             {
                 selected = ' selected="selected" ';
             }
             html += '<option value="' + value + '" ' + selected + '>' + i + '</option>';
        }
        return html;
    };
    that.draw = function ()
    {
        var html = this.getHtml();
        this.container.after(html);
    };
    return that;
};

ORBTECH.Table = function (paramObject)
{
    var thisTable = this;
    var table = null;
    var jTable = null;
    var jTableBody = null;
    var jRowArray = null;
    var rowArray = null;
    var jThArray = null;
    var thArray = null;
    var jTdArray = null;
    var jTfArray = null;
    var sortedRowArray = [];
    var colClickArray = [];
    var stripeTable = false;

    var init = function ()
    {
        if (paramObject)
        {
            if (paramObject.table)
            {
                table = paramObject.table;
            }
            if (paramObject.stripeTable)
            {
                stripeTable = paramObject.stripeTable;
            }
        }
        addSortEvents();
        stripe();
        //addLegendEvents();
    };
    var trim = function (str) 
    {
        return str.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
    };
    var setTable = function (arg)
    {
        table = arg;
    };
    var getTable = function ()
    {
        return table;
    };
    var setJTable = function (arg)
    {
        jTable = arg;
    };
    var getJTable = function ()
    {
        if (jTable === null)
        {
            jTable = $(getTable());
        }
        return jTable;
    };
    var setJThArray = function (arg)
    {
        jThArray = arg;
    };
    var getJThArray = function ()
    {
        if (jThArray === null)
        {
            jThArray = $('thead tr th', getJTable());
        }
		return jThArray;
    };
    var setJTdArray = function (arg)
    {
        jTdArray = arg;
    };
    var setJTableBody = function (arg)
    {
        jTableBody = arg;
    };
    var getJTableBody = function ()
    {
        if (jTableBody === null)
        {
            jTableBody = $('tbody', getJTable());
        }
        return jTableBody;
    };
    var getJTdArray = function ()
    {
        if (jTdArray === null)
        {
            jTdArray = $('tbody tr td', getJTable());
        }
        return jTdArray;
    };
    var setJTfArray = function (arg)
    {
        jTfArray = arg;
    };
    var getJTfArray = function ()
    {
        if (jTfArray === null)
        {
            jTfArray = $('tfoot tr td', getJTable());
        }
        return jTfArray;
    };
    var addSortEvents = function ()
    {
        var sortEvent = function ()
        {
            var caller = this;
            var index = caller.cellIndex;
            if (colClickArray[index] === undefined)
            {
                colClickArray[index] = 0;
            }
            colClickArray[index] = colClickArray[index] + 1;
            sortByIndex(index, colClickArray[index]);
        };
        getJThArray().click(sortEvent);
    };
    var setJRowArray = function (arg)
    {
        jRowArray = arg;
    };
    var getJRowArray = function ()
    {
        if (jRowArray === null)
        {
            jRowArray = $('tbody tr', getJTable());
        }
        return jRowArray;
    };
    setRowArray = function (arg)
    {
        rowArray = arg;
    };
    var getRowArray = function ()
    {
		var jRowArray = null;
        if (rowArray === null)
        {
			jRowArray = getJRowArray();
			if (jRowArray)
			{
            	rowArray = getJRowArray().get();
			}
        }
		rowArray = rowArray || [];
        return rowArray;
    };
    var addSortedRowArrayElement = function (colNum, rowArray)
    {
        sortedRowArray[colNum] = rowArray;
    };
    var setSortedRowArray = function (arg)
    {
        sortedRowArray = arg;
    };
    var getSortedRowArray = function ()
    {
        return sortedRowArray;
    };
    var removeTdRows = function ()
    {
        getJRowArray().remove();
    };
    var addBackTdRows = function ()
    {
        getJTableBody().html(getJRowArray());
    };
    var sortByIndex = function (index, clickNum)
    {
        var thisSortByIndex = this;
        var colNum = index + 1;
        var sortedRow = null;
        var tdTextArray = [];
        var sortedRowArray = [];
        var rowArray = getRowArray();
        var sortFunction = null;
        var firstCellText = '';
        var intRegEx = /^\d+$/;
        var floatRegEx = /^(\d|\.)+$/;
        var moneyRegEx = /^\$(\d|\.)+$/;
		var dateRegExMDY = /^\d\d\/\d\d\/\d\d\d\d/;

        var sortByInt = function (obj1, obj2)
        {
            return $(obj1.cells[index]).html() - $(obj2.cells[index]).html();
            //return tdTextArray[obj1.rowIndex] - tdTextArray[obj2.rowIndex];
        };
        var sortByFloat = function (obj1, obj2)
        {
            return $(obj1.cells[index]).html() - $(obj2.cells[index]).html();
        };
        var sortByMoney = function (obj1, obj2)
        {
            var float1 = $(obj1.cells[index]).html();
            var float2 = $(obj2.cells[index]).html();
			float1 = trim(float1);
			float2 = trim(float2);
            float1 = float1.replace(/^\$/, '');
            float2 = float2.replace(/^\$/, '');
            float1 = parseFloat(float1);
            float2 = parseFloat(float2);
            return float1 - float2;
        };
        var sortByString = function (obj1, obj2)
        {
            var retVal = null;
            var str1 = $(obj1.cells[index]).html();
            var str2 = $(obj2.cells[index]).html();
            if (str1 === str2)
            {
                retVal = 0;
            }
            else if (str1 < str2)
            {
                retVal = -1;
            }
            else
            {
                retVal = 1;
            }
            return retVal;
        };	
		var sortByDateMDY = function (obj1, obj2)
        {
            var retVal = null,
            	str1 = $(obj1.cells[index]).html(),
            	str2 = $(obj2.cells[index]).html();
				date1Array = str1.split('/'),
				date2Array = str2.split('/'),  
				date1 = null,
				date2 = null;

			if (date1Array.length === 3 && date2Array.length === 3) {
				date1 = new Date(date1Array[2], date1Array[0], date1Array[1]);
				date2 = new Date(date2Array[2], date2Array[0], date2Array[1]);
			}

            if (date1 === date2)
            {
                retVal = 0;
            }
            else if (date1 < date2)
            {
                retVal = -1;
            }
            else
            {
                retVal = 1;
            }
            return retVal;
        };
        sortedRowArray = getSortedRowArray();
        if (rowArray.length > 0)
        {
			if (sortedRowArray[colNum] === undefined)
			{
				firstCellText = $(rowArray[0].cells[index]).text();
				firstCellText = trim(firstCellText);
				if (intRegEx.test(firstCellText))
				{
					sortFunction = sortByInt;
				}
				else if (floatRegEx.test(firstCellText))
				{
					sortFunction = sortByFloat;
				}
				else if (moneyRegEx.test(firstCellText))
				{
					sortFunction = sortByMoney;
				}
				else if (dateRegExMDY.test(firstCellText))
                {
                    sortFunction = sortByDateMDY;
                }
				else
				{
					sortFunction = sortByString;
				}
				sortedRow = $(rowArray.sort(sortFunction));
				addSortedRowArrayElement(colNum, sortedRow);
			}
			else
			{
				sortedRow = sortedRowArray[colNum];
			}
			if ((clickNum % 2) === 0)
			{
				sortedRow = $(sortedRow.get().reverse());
			}
			setRowArray(null);
			setJRowArray(sortedRow);
			addBackTdRows();
			stripe();
		}
    };
    var stripe = function ()
    {
        var mouseOverFunction = null;
        var mouseOutFunction = null;
        var jTrArray = null;
        if (stripeTable === true)
        {
            mouseOverFunction = function ()
	    {
                $(this).addClass("over");
            };
            mouseOutFunction = function ()
	    {
                $(this).removeClass("over");
            };
            jTrArray = $("tr", getTable());
            jTrArray.mouseover(mouseOverFunction);
            jTrArray.mouseout(mouseOutFunction);
            jTrArray.removeClass("altRow");
            $("tr:even", getJTable()).addClass("altRow");
        }
    };
    var addLegendEvents = function ()
    {
        var requestedLegendHtml = false;
        var showLegend = function ()
        {
            var thisObj = this;
            var xPos = getX(thisObj);
            var yPos = getY(thisObj);
            var xOffset = 25;
            var post_data = {};
            var table_name = '';
            xPos += 25;
            var tableLegendContainer = $('#tableLegendContainer');
            tableLegendContainer.css("left", xPos + 'px');
            tableLegendContainer.css("top", yPos + 'px');
            var callBackFunction = function (data)
            {
                requestedLegendHtml = true;
                tableLegendContainer.html(data);
                ORBTECH.addLegendAjaxSubmitEvents();
                tableLegendContainer.show('slow');
            };
            if (requestedLegendHtml === false)
            {
                table_name = $('#http_module_id').val();
                post_data = {
                    ajax_request: 1,
                    "legend[http_action]": "tableListUpdate",
                    "legend[http_module]": "table_list",
                    "legend[table_name]":  table_name
                };
                $.post(ORBTECH.getFullHomeUrlSecure(), post_data, callBackFunction);
            }
            else
            {
                tableLegendContainer.show('slow');
            }
        };
        var hideLegend = function ()
        {
            var thisObj = this;
            var tableLegendContainer = $('#tableLegendContainer');
            tableLegendContainer.hide();
        };
        $('img.tableLegendImg').toggle(showLegend, hideLegend);
    };
    var getX = function (obj)
    {
        var pos = 0;
        if (obj.x)
        {
            pos += obj.x;
        }
        else if (obj.offsetParent)
        {
            while (obj)
            {
                pos += obj.offsetLeft;
                obj = obj.offsetParent;
            }
        }
        return pos;
    };
    var getY = function (obj)
    {
        var count = 0;
        var pos = 0;
        if (obj.y)
        {
            pos += obj.y;
        }
        else if (obj)
        {
            while (obj)
            {
                pos += obj.offsetTop;
                obj = obj.offsetParent;
            }
        }
        return pos;
    };
    init();
};

