/* Get an array of parameters in the query string, or a single value

    parameter   -   Optional. If specified, will return first 
        case-insenstive-matched value of that parameter instead of an array,
        or null if parameter doesn't exist in query string
*/
function getQuery(parameter) {
    var q = window.location.search.substring(1);
    var ret;
    if (typeof (parameter) === "undefined" || parameter === null) {
        var andSplit = q.split("&");
        var l = andSplit.length;

        ret = [];
        for (var i = 0; i < l; i++) {
            var s = andSplit[i].split("=");
            ret[s[0]] = s[1];
        }

        return ret;
    } else {
        ret = q.match(new RegExp(parameter + "=[^&]*", "i"));
        if(ret !== null) {
            return ret[0].split("=")[1];
        } else {
            return null;
        }
    }
}

function rewrite() {
    var o = $('span.email');
    var l = o.length;
    for (var i = 0; i < l; i++) {
        var e = reverse(o[i].id);
        o[i].innerHTML = ('<a href="mailto:' + e + '">' + e + ' </a>');
    }
}

function reverse(str) {
    var newStr = '';
    for (var i = str.length - 1; i >= 0; i--) {
        newStr += str.charAt(i);
    }
    return newStr;
}

function createHistBack() {
    var e = $(".hist_back");
    var l = e.length;

    for (var i = 0; i < l; i++) {
        $(e[i]).click(function() { history.back() });
    }
}

/* Styles selected objects as buttons, adds basic button functionality

    icon            -   class to use as an icon for the button
    maintainState   -   true if button should keep css state after being clicked
    callback        -   function to call when button is clicked
*/
$.fn.customButton = function (icon, maintainState, callback) {
    var l = this.length;

    for (var i = 0; i < l; i++) {
        var ele = $(this[i]);

        ele.removeClass("ui-state-active ui-state-hover ui-state-disabled").addClass("ui-state-default ui-corner-all");
        if (ele.text().search("[a-zA-Z0-9]") !== -1) {
            ele.html("<span class='icon_text'>" + ele.text() + "</span>");
        }

        if (ele.children("span.icon_image").length === 0) {
            ele.prepend("<span class='icon_image'>&nbsp;</span>");
        }

        if (icon !== null) {
            ele.children(".icon_image").removeClass().addClass("icon_image ui-icon " + icon);
        }
        else {
            ele.children(".icon_image").removeClass().addClass("icon_image ui-icon");
        }

        applyButtonStates(ele, maintainState);

        if (callback) {
            ele.click(callback);
        }
    }

    return this;
}

/* These next 3 functions should be removed and any buttons using them should
    just be replaced with jqueryui buttons */
function create_Buttons(selectString, iconName, stayClicked, clickFunction) {
    var e = $(selectString);
    var l = e.length;   

    for (var i = 0; i < l; i++) {
        var ele = $(e[i]);
        
        ele.removeClass("ui-state-active ui-state-hover ui-state-disabled").addClass("ui-state-default ui-corner-all");
        if (ele.text().search("[a-zA-Z0-9]") !== -1 ) {
            ele.html("<span class='icon_text'>" + ele.text() + "</span>");
        }

        if (ele.children("span.icon_image").length === 0) {
            ele.prepend("<span class='icon_image'>&nbsp;</span>");
        }

        if (iconName !== null) {
            ele.children(".icon_image").removeClass().addClass("icon_image ui-icon " + iconName);
        }
        else {
            ele.children(".icon_image").removeClass().addClass("icon_image ui-icon");
        }

        applyButtonStates(ele, stayClicked);
        
        if (clickFunction !== null) {
            ele.click(clickFunction);
        }
    }
  
    return e;
}

function create_Button_Toolbar(selectString) {
    var e = $(selectString);
    var l = e.length;

    for (var i = 0; i < l; i++) {
        var input = $(e[i]);
        var echild = input.children();
        var childl = echild.length;

        if (!input.hasClass("icon_toolbar")) {
            input.addClass("icon_toolbar");
        }

        for (var i2 = 0; i2 < childl; i2++) {
            var ele = $(echild[i2]);
            ele.removeClass("ui-corner-all");

            if (i2 === 0) {
                ele.addClass("ui-corner-left");
            }
            else if (i2 === childl - 1) {
                ele.addClass("ui-corner-right");
            }

            if (i2 > childl - 1) {
                ele.css("float", "left");
            }
        }
    }
}

function applyButtonStates(element, stayClicked) {
    if (!stayClicked) {
        element.hover(
            function() { $(this).removeClass("ui-state-default").addClass("ui-state-hover"); },
            function() { $(this).removeClass("ui-state-active ui-state-hover").addClass("ui-state-default"); }
        );
    
        element.mousedown(function() {
            $(this).removeClass("ui-state-default ui-state-hover").addClass("ui-state-active");
        });

        element.mouseup(function() {
            $(this).removeClass("ui-state-active").addClass("ui-state-hover");
        });
    }
    else {
        element.hover(
            function() {
                var input = $(this);
                if (input.hasClass("ui-state-default")) {
                    input.removeClass("ui-state-default ui-state-active").addClass("ui-state-hover");
                }
            },
            function() {
                var input = $(this);
                if( input.hasClass("ui-state-hover") ){
                    $(this).removeClass("ui-state-hover ui-state-active").addClass("ui-state-default");
                }
            }
        );

        element.mousedown(function() {
            var input = $(this);
            if (input.hasClass("ui-state-active")) {
                
                input.removeClass("ui-state-active ui-state-default").addClass("ui-state-hover");
            }
            else {
                input.removeClass("ui-state-default ui-state-hover").addClass("ui-state-active");
            }
        });
    }
}
/* End delete button functions */

function createDatePickers() {
    var e = $("input.datePicker");
    var l = e.length;

    for (var i = 0; i < l; i++) {
        var input = $(e[i]);
        input.attr('readonly', 'readonly');
        input.datepicker({
            changeMonth: true,
            changeYear: true,
            onSelect: function (dateText, inst) {
                var img = document.createElement("img");
                if ($(this).next("img").length == 0) {
                    img.src = "/images/delete.png";
                    img.alt = "Clear Date";
                    img.title = "Clear Date";
                    $(this).after(img);
                    $(img).addClass("linkStyledButton").click(function () {
                        $(this).prev().val('');
                        $(this).remove();
                    });
                }
            }
        });
        if (input.val() != '') {
            var img = document.createElement("img");
            img.src = "/images/delete.png";
            img.alt = "Clear Date";
            img.title = "Clear Date";
            input.after(img);
            $(img).addClass("linkStyledButton").click(function () {
                $(this).prev().val('');
                $(this).remove();
            });
        }
        
    }
}

function createAccordion(selector, openlocid) {
    var e = $(selector);
    var l = e.length;

    for (var i = 0; i < l; i++) {
        var input = $(e[i]);
        input.accordion({
            autoHeight: false,
            collapsible: true,
            active: false,
            header: "h3",
            navigation: true
        });

        if (parseInt($(openlocid).val()) > -1) {
            input.accordion("activate", parseInt($(openlocid).val()));
        }
        else {
            input.accordion();
        }
    }
}

function bindDialogOpener(buttonName, dialogName) {
    $("#" + buttonName).click(function() { $("#" + dialogName).dialog("open"); });
}

function bindMultipleDialogOpeners(selectStr, editDialog, setTitle) {
    var e = $(selectStr);
    var l = e.length;

    for (var i = 0; i < l; i++) {
        $(e[i]).click(function() {
            var id_attributes = $(this).attr("id").split("_");

            if (typeof(editDialog.action) !== "undefined") {
                editDialog.action.val(id_attributes[0]);
            }

            if (typeof(editDialog.uniqueID) !== "undefined") {
                editDialog.uniqueID.val(id_attributes[1]);
            }

            if (setTitle !== null) {
                editDialog.dialog("option", "title", setTitle);
            }

            if (typeof(editDialog.fill) !== "undefined") {
                editDialog.fill();
            }
        });
    }
}

function createDialog(dialogName, box_height, box_width) {
    var input = $(dialogName);
    input.dialog({
        autoOpen: false,
        bgiframe: true,
        draggable: true,
        modal: false,
        resizable: false,
        height: box_height,
        width: box_width,
        buttons: { "Close": function() { input.dialog("close"); } }
    });

    return input;
}

function createModalDialog(selectStr, uniqueIDfield, actionField, box_height, box_width, button_collection, fill_function) {
    var input = $(selectStr);

    input.dialog({
        autoOpen: false,
        bgiframe: true,
        draggable: false,
        modal: true,
        resizable: false,
        height: box_height,
        width: box_width,
        buttons: button_collection
    });

    if (uniqueIDfield !== null) {
        input.uniqueID = $(uniqueIDfield);
    }
    if (actionField !== null) {
        input.action = $(actionField);
    }
    if (fill_function !== null) {
        input.fill = function() { fill_function(); }
    }

    return input;
}

/*
Create validators on page. Validators are spans with class 'dialog_validator'. Format of their
    id tag is as follows: 
        
        'validator_<type>_<id>' 
        
    where <id> is the input to validate and <type> is from the following list:
        
    'required'      = will be invalid when input is blank
    'regex'         = check against a regular expression stored in element's 'data-regex' value
    'len'           = number of characters in field limited to element's 'data-len' value
    
    **Note: Attributes that start with 'data-' are valid under HTML5 validation rules!
*/
function create_validators() {
    var e = $("span.dialog_validator");
    var l = e.length;

    var bound = [];
    for (var i = 0; i < l; i++) {
        var id = $(e[i]).attr("id").split("_")[2];

        if (typeof (bound[id]) === "undefined") {
            bound[id] = true;
            var v_ele = $("#" + id);

            v_ele.bind("focus keydown", field_onFocus);
            v_ele.bind("blur change", function () { field_validate($(this)); });
        }
    }
}

/*
Removes error state from fields
*/
function field_onFocus() {
    $(this).removeClass("ui-state-error");
}

/*
Finds all inputs within the selector region and preforms validation checks

    selector = region to validate
*/
function validate_region(selector) {
    var e = $(selector).find("input, textarea, select, checkbox");
    var l = e.length;

    var valid = true;

    for (var i = 0; i < l; i++) {
        var ele = $(e[i]);
        if (!ele.hasClass("no_display")) {
            //If field is visible and valid, do nothing, else make region invalid
            field_validate(ele) ? true : valid = false;
        }
    }

    return valid;
}

/*
Returns true if field is falid according to its validators, false otherwise. Validator type
    checking is done here.

    input = field to validate
*/
function field_validate(input) {
    //Trim input to make sure no extra spaces
    if (input.attr("type") !== "file") {
        input.val(jQuery.trim(input.val()));
    }

    var iv = input.val();

    var v = $("span[id^='validator_'][id$='_" + input.attr("id") + "']");
    var l = v.length;

    var valid = true;
    //Loop through each validator for field
    for (var i = 0; i < l; i++) {
        var v_e = $(v[i]);
        var type = v_e.attr("id").split("_")[1];
        var name = v_e.attr("id").split("_")[2];
        //Make validators hidden so validators for now valid fields that were previously invalid don't show up
        v_e.css("display", "none");

        var re;

        if (typeof (v_e.attr("data-regex")) !== "undefined") {
            if (name !== "URL") {
                var raw = v_e.attr("data-regex").split("/");
                re = new RegExp(raw[1], raw[2]);
            } else {
                re = new RegExp(v_e.attr("data-regex"), "");
            }
        }

        //Fire only 1 validator at a time, if any case is matched, field is invalid
        if ((type === "required" && iv.replace(" ", "") === "")
            || (type === "regex" && typeof(re) !== "undefined" && !input.val().match(re))
            || (type === "len" && input.val().length > Number(v_e.attr("data-len")))) {
            input.addClass("ui-state-error");

            if (valid) {
                v_e.css("display", "inline");
                valid = false;
            }
        }
    }

    //Made it out of loop, field is valid
    if (valid) {
        input.removeClass("ui-state-error");
    }
    
    return valid;
}

function obfuscate() {
    var o = $('span.email');
    var l = o.length;
    for (var i = 0; i < l; i++) {
        var e = reverse(o[i].id).replace(':', '@');
        o[i].innerHTML = ('<a href="mailto:' + e + '">' + e + '</a>');
    }
}

function ckeditor() {
    var el = $('textarea.editor');
    var l = el.length;
    for (var i = 0; i < l; i++) {
        CKEDITOR.replace(el[i].id, { width: 400
        });
        CKEDITOR.on('instanceReady', function(ev) {
            ev.editor.dataProcessor.writer.setRules('p',
            {
                indent: false,
                breakBeforeOpen: false,
                breakAfterOpen: false,
                breakBeforeClose: false,
                breakAfterClose: false
            });
        });
    }
}

function ckeditorDestroy(name) {
    CKEDITOR.instances[name].destroy();
}
function setqtip(group, item,position) {
    var ele = $(group);
    var l = ele.length;
    for (var i = 0; i < l; i++) {
        var e = $(ele[i]);
        e.qtip({
            content: $(item + e.attr("id").split("_")[position]).html(),
            style: {
                name: "light",
                tip: "leftMiddle",
                "font-size": 11
            },
            position: {
                corner: {
                    target: "rightMiddle",
                    tooltip: "leftMiddle"
                }
            }
        });
    }
}

// Here is my section with form variables
function createFormObject(form){
    var input = $(form + ' :input:not(:button, :checkbox)');
    var l = input.length;
    var d = new Object();
    for (var i = 0; i < l; i++) {
        var p = input[i].id;
        d[p] = input[i].value;
    }
    return d;
}

function fillInBoxes(object) {
    for (var k in object) {
        if (document.getElementById(k)) {
            if (object[k] === true) {
                document.getElementById(k).checked = true;
            }
            else {
                document.getElementById(k).value = object[k];
            }
        }
    }
}
