var overlayManager;
var ajaxLoadingPanel;
var loadingPanelTimeoutQueue = [];

/************************************************************
    Global Ajax Call
************************************************************/
//global status timer
var statusTimer;

function sendAjax(url, action, callback, postData) {

    var sPostData = "";

    for( var x in postData ) {

        var data;
        var label;

        if (isArray(postData[x])) {
            label = x;
            data = postData[x];
        } else if (typeof(postData[x]) == "object") {
            label = "_" + x;
            data = YAHOO.lang.JSON.stringify(postData[x]);
        } else {
            label = x;
            data = postData[x];
        }

        sPostData += label + "=" + encodeURIComponent(data) + "&";
    }

    var arguments = new Array();
    arguments[0] = action;
    arguments[1] = callback;

//    loadingPanelTimeoutQueue.push( setTimeout('showLoadingPanel()', 2000) );

    var handleAjaxSuccess = function(o) {

        var response = YAHOO.lang.JSON.parse(o.responseText);

        var returnData = {};
        returnData.payload = response.payload;
        returnData.params = o.argument[0];

        clearTimeout( loadingPanelTimeoutQueue.shift() );

        if( response.status == "ERROR") {
            alert(response.message);
//            hideLoadingPanel();
            return false;
        } else if (response.status == "WARNING") {
            showStatus(response.message);
        } else if (response.status == "TIMEOUT") {
            document.location.href = "/login.php";
            return false;
        } else if (response.status == "DENIED") {
            alert(response.message);
            return false;
		}
//        hideLoadingPanel();

        //runs callback specified by user
        var callback = o.argument[1];
        callback(returnData);
        return true;
    }

    var handleAjaxFailure = function(o) {
        clearTimeout(loadingPanelTimeoutQueue.shift());

        if(o.responseText !== undefined) {
            alert("Communication Error with Server (" + o.status + ") - " + o.statusText);
        }
    }

    var request = YAHOO.util.Connect.asyncRequest('POST', url, {
            success: handleAjaxSuccess,
            failure: handleAjaxFailure,
            argument: arguments
        },
        sPostData
    );

    //request.responseType = YAHOO.util.DataSource.TYPE_JSON;
    request.responseType = 3;
}

function showStatus(msg) {
    if(statusTimer) clearTimeout(statusTimer);

    var ref = YAHOO.util.Dom.get("system-message");

    //set message content
    ref.innerHTML = msg;

    //display status box
    YAHOO.util.Dom.setStyle(ref, "display", "block");

    //animate color
    var origColor = "#fffce5";
    var pulseColor = "#fff6a8";
    
    var rowColorAnim = new YAHOO.util.ColorAnim(ref, {
        backgroundColor:{to:origColor, from:pulseColor}, duration:2});
    var onComplete = function() {
        rowColorAnim = null;
        YAHOO.util.Dom.setStyle(ref, "backgroundColor", origColor);
    }
    rowColorAnim.onComplete.subscribe(onComplete);
    rowColorAnim.animate();

    statusTimer = setTimeout("clearStatus()", 5000);
}

function clearStatus() {
    var ref = YAHOO.util.Dom.get("system-message");
    YAHOO.util.Dom.setStyle(ref, "display", "none");
}

/**
* managing items between two select lists
* list 1 reference:         m1
* list 2 reference:         m2
*/

function one2two(m1,m2)
{
    m1 = YAHOO.util.Dom.get(m1);
    m2 = YAHOO.util.Dom.get(m2);

    m1len = m1.length;

    for (i=0; i<m1len; i++) {
        if (m1.options[i].selected == true) {
            m2len = m2.length;
            m2.options[m2len]= new Option(m1.options[i].text);
            m2.options[m2len].value = m1.options[i].value;
        }
    }

    for (i = (m1len -1); i>=0; i--) {
        if (m1.options[i].selected == true) {
            m1.options[i] = null;
        }
    }
}

function two2one(m1,m2)
{
    m1 = YAHOO.util.Dom.get(m1);
    m2 = YAHOO.util.Dom.get(m2);

    m2len = m2.length;

    for (i=0; i<m2len; i++) {
        if (m2.options[i].selected == true) {
            m1len = m1.length;
            m1.options[m1len]= new Option(m2.options[i].text);
            m1.options[m1len].value = m2.options[i].value;
        }
    }
    for (i=(m2len-1); i>=0; i--) {
        if (m2.options[i].selected == true) {
            m2.options[i] = null;
        }
    }
}

/************************************************************
    Calendar Popup
*************************************************************
    config: {
        "btnId":            "myBtn",
        "dateTextFieldId":  "myDateField",
        "time":             "00:00:00"
    }
    dateTextFieldId: <input type="text" disabled="disabled" id="myDateField" value="" />
    btnId: <img src="/images/icons/calendar.png" id="myBtn" align="top" alt="Show Calendar" title="Show Calendar" />
************************************************************/
function createCalendar(config) {

    var Event = YAHOO.util.Event,
    Dom = YAHOO.util.Dom,
    dialog,
    calendar;

    var showBtn = Dom.get(config.btnId);

    Event.on(showBtn, "click", function() {

        if (!dialog) {
            // Hide Calendar if we click anywhere in the document other than the calendar
            Event.on(document, "click", function(e) {
                var el = Event.getTarget(e);
                var dialogEl = dialog.element;
                if (el != dialogEl && !Dom.isAncestor(dialogEl, el) && el != showBtn && !Dom.isAncestor(showBtn, el)) {
                dialog.hide();
                }
            });

            function resetHandler() {
                // Reset the current calendar page to the select date, or
                // to today if nothing is selected.
                var selDates = calendar.getSelectedDates();
                var resetDate;

                if (selDates.length > 0) {
                resetDate = selDates[0];
                } else {
                resetDate = calendar.today;
                }

                calendar.cfg.setProperty("pagedate", resetDate);
                calendar.render(document.body);
            }

            function closeHandler() {
                dialog.hide();
            }

            dialog = new YAHOO.widget.Dialog(config.btnId + "_dlg", {
                visible:false,
                context:[config.btnId, "tl", "bl"],
                buttons:[ {text:"Reset", handler: resetHandler, isDefault:true}, {text:"Close", handler: closeHandler}],
                draggable:false,
                close:true
            });
            dialog.setHeader('Pick A Date');
            dialog.setBody('<div id="cal"></div>');
            dialog.render(document.body);
            
            dialog.showEvent.subscribe(function() {
                if (YAHOO.env.ua.ie) {
                // Since we're hiding the table using yui-overlay-hidden, we
                // want to let the dialog know that the content size has changed, when
                // shown
                dialog.fireEvent("changeContent");
                
                }
            });

            if (!overlayManager) {
                createOverlayManager();
            }

            overlayManager.register(dialog);
        }//if(!dialog)

	    // Lazy Calendar Creation - Wait to create the Calendar until the first time the button is clicked.
	    if (!calendar) {

                calendar = new YAHOO.widget.Calendar("cal", {
                    iframe:false,
                    hide_blank_weeks:true
                });
                calendar.render(document.body);

	        calendar.selectEvent.subscribe(function() {
                if (calendar.getSelectedDates().length > 0) {

                    var selDate = calendar.getSelectedDates()[0];

                    // Pretty Date Output, using Calendar's Locale values: Friday, 8 February 2008
                    var dStr = selDate.getDate();
                    var mStr = selDate.getMonth() + 1;
                    var yStr = selDate.getFullYear();

                    //add leading zero
                    if(mStr.toString().length == 1)
                        mStr = "0" + mStr.toString();

                    if(dStr.toString().length == 1)
                        dStr = "0" + dStr.toString();

                    var dateString = yStr + "-" + mStr + "-" + dStr;

                    if(config.time)
                        dateString += " " + config.time;

                        Dom.get(config.dateTextFieldId).value = dateString;
                } else {
                    Dom.get(config.dateTextFieldId).value = "";
                }
                
                var item = Dom.get(config.dateTextFieldId);
                
                if ("fireEvent" in item)
                {
                    item.fireEvent("onchange"); 
                }
                else 
                { 
                    var evt = document.createEvent("HTMLEvents"); 
                    evt.initEvent("change", false, true); 
                    item.dispatchEvent(evt); 
                } 

		        dialog.hide();
		    });

		    calendar.renderEvent.subscribe(function() {
		        // Tell Dialog it's contents have changed, which allows
		        // container to redraw the underlay (for IE6/Safari2)
		        dialog.fireEvent("changeContent");
		    });
	    }

        var seldate = calendar.getSelectedDates();

	    if (seldate.length > 0) {
		    // Set the pagedate to show the selected date if it exists
		    calendar.cfg.setProperty("pagedate", seldate[0]);
		    calendar.render(document.body);
	    }

        dialog.show("none");
        dialog.focus();

    });

    return dialog;
}

// fills time dropdowns
function fillTimePicker(hour_control,minute_control) {
    for (var h=0; h<=23; h++) {
        var newHour = document.createElement('option');

        newHour.text = padDigit(h);
        newHour.value = padDigit(h);

        hour_control.appendChild(newHour);
    }

    for (var m=0; m<=59; m++) {
        var newMinute = document.createElement('option');

        newMinute.text = padDigit(m);
        newMinute.value = padDigit(m);

        minute_control.appendChild(newMinute);
    }
}

// sets time in time dropdowns
function setTimePicker(hour_field,minute_field,hour,minute) {
    if (!hour) hour = 0;
    if (!minute) minute = 0;

    for (var h=0; h<hour_field.length; h++) {
        if (hour == h) {
            hour_field[h].selected = true;
        } else {
            hour_field[h].selected = false;
        }
    }

    for (var m=0; m<minute_field.length; m++) {
        if (minute == m) {
            minute_field[m].selected = true;
        } else {
            minute_field[m].selected = false;
        }
    }
}

// pads single digits for time dropdowns
function padDigit(value) {
    if (value < 10) {value = "0" + value;}
    return value;
}

/* tooltips */
function getPanelIDFromElementID (element_id) {
    var parent_panel = YAHOO.util.Dom.getAncestorByClassName(element_id, 'yui-panel');
    var parent_id = null;
    if (parent_panel) {
        parent_id = parent_panel.id;
    }
    return parent_id;
}

var TooltipObject = {
    tooltip_next_id: 0, // This is the incrementer that creates the IDs if there are none.
    tooltip_ids: [], // this houses the elements if there are any
    tooltip_modal_ids: [],
    trys: 0, // variable to specify the number of trys the creation function has been called.
    MAX_TRYS: 5, // Set this to a number that allows a page to load the elements
    tooltipObject: '',
    tooltipModal: '',
    
    createTooltipID: function () {
        return "help_tooltip_" + TooltipObject.tooltip_next_id++;
    },
    
    createTooltips: function () {
        var tooltip_elements = YAHOO.util.Dom.getElementsByClassName('tooltip');
        
        if (TooltipObject.tooltipObject) {
            return;
        }
        
        /**
         *  Check to see if any elements are found that have the class name of tooltip
         *  If there are no elements found, set a timeout and re-run function this.MAX_TRYS
         */
        if (tooltip_elements.length == 0) {
            if (TooltipObject.trys++ < TooltipObject.MAX_TRYS) {
                setTimeout("TooltipObject.createTooltips()", 1000);
            }
        } else {
            /**
             *  Yay we found elements with tooltip as their class  lets do our job then.
             */
            for (var ctr = 0; ctr < tooltip_elements.length; ctr++) {
                var tt_ele = tooltip_elements[ctr];
                var ele_id = tt_ele.getAttribute('id');
                
                if (!ele_id) {
                    ele_id = TooltipObject.createTooltipID();
                    tt_ele.setAttribute('id', ele_id);
                }
                
                if (ele_id) {
                    switch (tt_ele.getAttribute('type')) {
                        case 'flash':
                            TooltipObject.initiateModalPopup(tt_ele, 'OBJECT');
                            break;
                        case 'image':
                            TooltipObject.initiateModalPopup(tt_ele, 'IMG');
                            break;
                        default:
                            TooltipObject.tooltip_ids.push(ele_id);
                            break;
                    }
                }
            }
            
            TooltipObject.tooltipObject = new YAHOO.widget.Tooltip("tooltip_object", {
                context: TooltipObject.tooltip_ids,
                xyoffset: [15, -15]
            });
            
            TooltipObject.tooltipObject.contextTriggerEvent.subscribe(TooltipObject.contextTriggerEvent);
            TooltipObject.tooltipObject.contextMouseOverEvent.subscribe(TooltipObject.onContextMouseOver);
            
            TooltipObject.tooltipModal = new YAHOO.widget.Panel("tooltip_flash_object", TooltipObject.modalcfg());
        }
    },
    modalcfg: function () {return {
        fixedcenter: true,
        constraintoviewport: false,
        underlay: "shadow",
        close: true,
        visible: false,
        modal: true
    }},
    
    onContextMouseOver: function (e, obj) {
        this.cfg.setProperty("xy", [obj[1].pageX, obj[1].pageY]);
    },
    
    setupTextTooltip: function (ele) {
        return ele.getAttribute('title');
    },
    
    setupImageTooltip: function (ele) {
        if (ele.nodeName == 'DIV' || ele.nodeName == 'IMG') {
            var image_element = ele;
            if (ele.nodeName == 'DIV') {
                var results = ele.getElementsByTagName('IMG');
                if (results.length == 0 && ele.getAttribute('title') == null) {
                    return null; // At this point we actually do not want to create a tooltip for this
                }
                image_element = results[0];
            }
            
            return '<div><img src="'+ image_element.src + '" /></div>';
        }
        return null;
    },
    
    getFlashObject: function (ele) {
        if (ele.nodeName == 'OBJECT') {
            return ele;
        }
        result = ele.parentNode.getElementsByTagName('OBJECT');
        if (result && result[0]) {
            return result[0];
        }
        return false;
    },
    
    initiateModalPopup: function (tt_ele, node_type) {
        var ele = tt_ele;
        
        if (!node_type) {
            node_type = 'OBJECT';
        }
        
        if (ele.nodeName == node_type) {
            ele = tt_ele.parendNode;
            if (ele.nodeName != 'DIV') {
                return false;
            }
        }
        
        button_finder = ele.parentNode.getElementsByTagName('INPUT');
        if (button_finder && button_finder[0]) {
            ele = button_finder[0];
        } else {
            ele = false;
            TooltipObject.tooltip_ids.push(tt_ele.id);
        }
        
        if (ele) {
            // Check to see if the button has an ID attached, and add one if not.
            if (!ele.getAttribute('id')) {
                ele.setAttribute('id', TooltipObject.createTooltipID());
            }
            YAHOO.util.Event.on(ele.id, "click", function (e) {
                tt      = TooltipObject;
                myparent  = this.parentNode;
                f_obj   = tt.getFlashObject(myparent);
                cfg     = TooltipObject.modalcfg();
                
                tt.tooltipModal.destroy();
                
                if (f_obj) {
                    cfg.width = f_obj.getAttribute('width');
                    cfg.height = f_obj.getAttribute('height') * 1 + 35;
                }
                
                tt.tooltipModal = new YAHOO.widget.Panel("tooltip_modal_object", cfg);
                
                if (myparent.getElementsByTagName('OBJECT').length) {
                    new_body = tt.setupFlashTooltip(myparent);
                } else {
                    new_body = tt.setupImageTooltip(myparent);
                }
                
                if (new_body) {
                    tt.tooltipModal.setBody(new_body);
                    tt.tooltipModal.render(document.body);
                    tt.tooltipModal.show();
                }
            });
        }
    },
    
    setupFlashTooltip: function (ele) {
        if (ele.nodeName == 'DIV' || ele.nodeName == 'OBJECT') {
            var flash_element = ele;
            if (ele.nodeName == 'DIV') {
                var results = ele.getElementsByTagName('OBJECT');
                if (results.length == 0 && ele.getAttribute('title') == null) {
                    return null; // At this point we actually do not want to create a tooltip for this
                }
                flash_element = results[0];
            }
            
            if (flash_element.nodeName == 'OBJECT') {
                var parent_obj = flash_element.parentNode;
                
                return '<div>'+ parent_obj.innerHTML + '</div>';
            }
        }
        return null;
    },
    
    contextTriggerEvent: function (type, args) {
        var context = args[0];
        var ele = YAHOO.util.Dom.get(context.id);
        var text = '';
        
        if (ele) {
            var type = ele.getAttribute('type');
            
            if (type) {
                switch (type) {
                    case 'image':
                        text = TooltipObject.setupImageTooltip(ele);
                        break;
                    case 'flash':
                        text = TooltipObject.setupFlashTooltip(ele);
                        break;
                }
            } else {
                text = TooltipObject.setupTextTooltip(ele);
            }
        }
        
        if (text) {
            this.cfg.setProperty("text", text);
        }
    }
}

function createTooltips() {
    if (TooltipObject.tooltipObject) {
        delete(TooltipObject.tooltipObject);
        TooltipObject.tooltipObject = '';
        TooltipObject.trys = 0;
        TooltipObject.tooltip_ids = [];
        TooltipObject.tooltip_modal_ids = [];
    }
    TooltipObject.createTooltips();
}

/**
 *  This object is to be used to clear any filters that might be created
 *  in order to search a datatable.
 *  
 *  To add functions to run when clear filter is called to reset to defaults so to speak
 *  just call subscribe() and pass in a reference or anonymous function to be called
 *  when clear filters is called. Like so:
 *  
 *  clearFilterEvent.subscribe(function () {
 *      // Lets set the dropdown to the first element of the dropdown
 *      // so that when loadTables() is called the field is defaulted first
 *      // and then the ajax call to retrieve data returns the correct set
 *      YAHOO.util.Dom.get('id_of_say_a_dropdown_field').selectedIndex = 0;
 *  });
 */
var clearFilterEvent = new function () {
    this._subscribe_list = [];
    
    this.subscribe = function (func) {
        this._subscribe_list.push(func);
    }
    
    this.fireEvent = function () {
        for (var i = 0; i < this._subscribe_list.length; i++) {
            (this._subscribe_list[i])();
        }
    }
}

/**
 *  Main function to clear out any fields so that the dataTable can be loaded
 *  with the initial values
 *  
 *  This function calls fireEvent() which is a function of clearFilterEvent
 *  THIS IS IN NO WAY A YAHOO CUSTOM EVENT
 *  
 *  If you want to be tricky and utilize this functionality to clear filters with any other form
 *  you can as it's not neccessarily tied to using "filter_form" or loadTables()
 */
function clearFilters() {
    var frm = YAHOO.util.Dom.get("filter_form");
    if (frm && typeof frm.filter_search != 'undefined') {
        frm.filter_search.value = "";
    }
    
    clearFilterEvent.fireEvent();
    
    if (typeof loadTable != 'undefined') {
        loadTable();
    }
}

function clearMassAction() {
    YAHOO.util.Dom.get("mass_action").value = '';
    found_elements = YAHOO.util.Dom.getElementsByClassName('mass_action');
    for (var i in found_elements) {
        found_elements[i].selectedIndex = 0;
    }
}

/**
 *
 * Ajax Loading Panel
 *
 */

function showLoadingPanel() {
    overlayManager.bringToTop(ajaxLoadingPanel);
    ajaxLoadingPanel.show();
}

function hideLoadingPanel() {
    ajaxLoadingPanel.hide();
}

function init() {
    ajaxLoadingPanel = new YAHOO.widget.Panel("ajaxLoadPanel", {
        width:"240px",
        fixedcenter:true,
        close:false,
        draggable:false,
        modal:true,
        visible:false
    });
    ajaxLoadingPanel.render(document.body);

    if (!overlayManager) createOverlayManager();
    overlayManager.register(ajaxLoadingPanel);
}

/**
 * Overlay Manager
 */
function createOverlayManager() {
    overlayManager = new YAHOO.widget.OverlayManager();
}

function delaySubmit(event,fcall) {
    window.limit = 1;
    
    window.specialSubmitCall = fcall;
    
    if (event && (event.keyCode == 8 || event.keyCode == 46)) {
        window.searchBufferCounter = 0;

        var check = function() {
            if (typeof window.searchBufferCounter != "undefined") {
                if (window.searchBufferCounter >= window.limit) {
                    window.specialSubmitCall();
                    delete window.searchBufferCounter;
                } else {
                    if (window.searchBufferCounter == 0 && typeof window.searchBufferTimer != "undefined") {
                        clearTimeout(window.searchBufferTimer);
                    }

                    window.searchBufferCounter++;
                    window.searchBufferTimer = setTimeout(check,1000);
                }
            }
        }

        check();
    } else if (checkEnterKey(event)) {
        window.specialSubmitCall();
    }
}

YAHOO.util.Event.onDOMReady(init);

function stripslashes (str) {
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Ates Goral (http://magnetiq.com)
    // +      fixed by: Mick@el
    // +   improved by: marrtins    // +   bugfixed by: Onno Marsman
    // +   improved by: rezna
    // +   input by: Rick Waldron
    // +   reimplemented by: Brett Zamir (http://brett-zamir.me)
    // +   input by: Brant Messenger (http://www.brantmessenger.com/)    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: stripslashes('Kevin\'s code');
    // *     returns 1: "Kevin's code"
    // *     example 2: stripslashes('Kevin\\\'s code');
    // *     returns 2: "Kevin\'s code"    
    return (str + '').replace(/\\(.?)/g, function (s, n1) {
        switch (n1) {
            case '\\':
                return '\\';
            case '0':return '\u0000';
            case '':
                return '';
            default:
                return n1;
        }
    });
}

