// from Trac's code, but heavily modified by Jacob
(function($){
    $.fn.addAnchor = function(title) {
        title = title || "Link here";
        return this.filter("*[@id]").each(function() {
            $("<a class='anchor'> \u00B6</a>").attr("href", "#" + this.id)
            .attr("title", title).appendTo(this);
        });
    }

    $.fn.checked = function(checked) {
        if (checked == undefined) { // getter
            if (!this.length) return false;
            return this.get(0).checked;
        } else { // setter
            return this.each(function() {
                this.checked = checked;
            });
        }
    }

    $.fn.enable = function(enabled) {
        if (enabled == undefined) enabled = true;
        return this.each(function() {
            this.disabled = !enabled;
            var label = $(this).parents("label");
            if (!label.length && this.id) {
                label = $("label[@for='" + this.id + "']");
            }
            if (!enabled) {
                label.addClass("disabled");
            } else {
                label.removeClass("disabled");
            }
        });
    }

    $.loadStyleSheet = function(href, type) {
        type = type || "text/css";
        $(document).ready(function() {
            if (document.createStyleSheet) { // MSIE
                document.createStyleSheet(href);
            } else {
                $("<link rel='stylesheet' type='" + type + "' href='" + href + "' />")
                .appendTo("head");
            }
        });
    }

    // Used for dynamically updating the height of a textarea
    window.resizeTextArea = function (id, rows) {
        var textarea = $("#" + id).get(0);
        if (!textarea || textarea.rows == undefined) return;
        textarea.rows = rows;
    }

    // The following are defined for backwards compatibility with releases prior
    // to Trac 0.11

    window.addEvent = function(elem, type, func) {
        $(elem).bind(type, func);
    }
    window.addHeadingLinks = function(container, title) {
        $.each(["h1", "h2", "h3", "h4", "h5", "h6"], function() {
            $(this, container).addAnchor(title);
        });
    }
    window.enableControl = function(id, enabled) {
        $("#" + id).enable(enabled);
    }
    window.getAncestorByTagName = function(elem, tagName) {
        return $(elem).parents(tagName).get(0);
    }

})(jQuery);

(function($){

    window.initializeFilters = function() {
        // Bail early for Konqueror and IE5.2/Mac, which don't fully support dynamic
        // creation of form controls
        try {
            var test = document.createElement("input");
            test.type = "button";
            if (test.type != "button") throw Error();
        } catch (e) {
            return;
        }

        // Removes an existing row from the filters table
        function removeRow(button, propertyName) {
            var tr = getAncestorByTagName(button, "tr");

            var mode = null;
            var selects = tr.getElementsByTagName("select");
            for (var i = 0; i < selects.length; i++) {
                if (selects[i].name == propertyName + "_mode") {
                    mode = selects[i];
                    break;
                }
            }
            if (mode && (getAncestorByTagName(mode, "tr") == tr)) {
                // Check whether there are more 'or' rows for this filter
                var next = $(tr).next()[0];
                if (next && (next.className == propertyName)) {
                    function getChildElementAt(e, idx) {
                        e = e.firstChild;
                        var cur = 0;
                        while (cur <= idx) {
                            while (e && e.nodeType != 1) e = e.nextSibling;
                            if (cur++ == idx) break;
                            e = e.nextSibling;
                        }
                        return e;
                    }

                    var thisTh = getChildElementAt(tr, 0);
                    var nextTh = getChildElementAt(next, 0);
                    next.insertBefore(thisTh, nextTh);
                    nextTh.colSpan = 1;

                    thisTd = getChildElementAt(tr, 0);
                    nextTd = getChildElementAt(next, 1);
                    next.replaceChild(thisTd, nextTd);
                }
            }

            var tBody = tr.parentNode;
            tBody.deleteRow(tr.sectionRowIndex);
            if (!tBody.rows.length) {
                tBody.parentNode.removeChild(tBody);
            }

            if (propertyName) {
                var select = document.forms["query"].elements["add_filter"];
                for (var i = 0; i < select.options.length; i++) {
                    var option = select.options[i];
                    if (option.value == propertyName) option.disabled = false;
                }
            }
        }

        // Initializes a filter row, the 'input' parameter is the submit
        // button for removing the filter
        function initializeFilter(input) {
            var removeButton = document.createElement("input");
            removeButton.type = "button";
            removeButton.value = input.value;
            if (input.name.substr(0, 10) == "rm_filter_") {
                removeButton.onclick = function() {
                    var endIndex = input.name.search(/_\d+$/);
                    if (endIndex < 0) endIndex = input.name.length;
                    removeRow(removeButton, input.name.substring(10, endIndex));
                    return false;
                }
            } else {
                removeButton.onclick = function() {
                    removeRow(removeButton);
                    return false;
                }
            }
            input.parentNode.replaceChild(removeButton, input);
        }

        // Make the submit buttons for removing filters client-side triggers
        var filters = document.getElementById("filters");
        var inputs = filters.getElementsByTagName("input");
        for (var i = 0; i < inputs.length; i++) {
            var input = inputs[i];
            if (input.type == "submit" && input.name
                && input.name.match(/^rm_filter_/)) {
                initializeFilter(input);
            }
        }

        // Make the drop-down menu for adding a filter a client-side trigger
        var addButton = document.forms["query"].elements["add"];
        addButton.parentNode.removeChild(addButton);
        // alert(addButton);
        var select = document.getElementById("add_filter");
        var count = -1;
        // Convenience function for creating a <label>
        function createLabel(text, htmlFor) {
            var label = document.createElement("label");
            if (text) label.appendChild(document.createTextNode(text));
            if (htmlFor) label.htmlFor = htmlFor;
            return label;
        }

        // Convenience function for creating an <input type="checkbox">
        function createCheckbox(name, value, id, dvalue) {
            var input = document.createElement("input");
            input.type = "checkbox";
            if (name) input.name = name;
            if (value) input.value = value;
            if (dvalue) input.checked = true;
            if (id) input.id = id;
            return input;
        }

        // Convenience function for creating an <input type="radio">
        function createRadio(name, value, id) {
            var str = '<input type="radio"';
            if (name) str += ' name="' + name + '"';
            if (value) str += ' value="' + value + '"';
            if (id) str += ' id="' + id + '"';
            str += '/>';
            var span = document.createElement('span');
            // create radio button with innerHTML to avoid IE mangling it.
            span.innerHTML = str;
            return span;
        }

        // Convenience function for creating a <select>
        function createSelect(name, options, optional, value, multiple) {
            var e = document.createElement("select");
            
            if(value != undefined){
                if(!$.isArray(value)){
                    value = new Array(value);
                }
            }else{
                value = new Array();
            }
            if (name) e.name = name;
            if (optional) e.options[0] = new Option();
            options_count = 0;
            if(multiple != undefined && multiple == true){
                $(e, "select").attr('multiple', true);
                $(e, "select").attr('class', 'multiselect');
                if(typeof($(e, "select").multiSelect) == "function"){
                	$(e, "select").css('display', 'none');                }
            }
            if (options) {
                for (keyVar in options){
                    for (var skey in options[keyVar]) {
                        if(typeof(options[keyVar][skey]) == "object"){
                            options_count = options_count + 1;
                            var optgroup = $('<optgroup />').attr('label', skey);
                            for (var spkey in options[keyVar][skey]) {
                                if(jQuery.inArray(spkey, value) != -1){
                                    selected = true;
                                }else{
                                    selected = false;
                                }
                                options_count = options_count + 1;
                                var moption = $('<option />').val(spkey).attr('selected', selected).append(options[keyVar][skey][spkey]);
                                $(optgroup).append(moption);
                            }
                            $(e, "select").append(optgroup);
                        }else{
                            var option;
                            options_count = options_count + 1;
                            if(jQuery.inArray(skey, value) != -1){
                                selected = true;
                            }else{
                                selected = false;
                            }
                            var option = $('<option />').val(skey).attr('selected', selected).append(options[keyVar][skey]);

                            $(e, "select").append(option);
                        }
                    }

                }
            }
            if(multiple != undefined && multiple == true){
                $(e, "select").attr('size', Math.min('8', options_count));
            }
            return e;
        }
        if(default_filter != undefined){
            for ( var i=0, len=default_filter.length; i<len; ++i ){
                c = default_filter[i];
                handleProperty(c.field, c.mode, c.value);
            }
        }

        select.onchange = function() {
            if (select.selectedIndex < 1) return;

            if (select.options[select.selectedIndex].disabled) {
                // Neither IE nor Safari supported disabled options at the time this was
                // written, so alert the user
                alert("A filter already exists for that property");
                return;
            }


            var propertyName = select.options[select.selectedIndex].value;
            handleProperty(propertyName);
            var property = properties[propertyName];

            // Disable the add filter in the drop-down list
            if (property.type == "radio" || property.type == "checkbox") {
                select.options[select.selectedIndex].disabled = true;
            }
            select.selectedIndex = 0;
        }
        function handleProperty(propertyName, dmode, dvalue){
            count = count + 1;
            var property = properties[propertyName];
            originalPropertyName = propertyName;
            propertyName = "data[Query][filter]["+ count +"]";
            
            //["+ propertyName +"]
            var table = document.getElementById("filters").getElementsByTagName("table")[0];
            var tr = document.createElement("tr");
            tr.className = propertyName +' filter_item';
            // Add the add and remove buttons
            td = document.createElement("td");
            td.className = "actions";
            var removeButton = document.createElement("div");
            removeButton.title = "remove this filter";
            removeButton.className = "ui-corner-all ui-state-error remove_filter";
            removeButton.innerHTML = "<span class='ui-icon ui-icon-minusthick'></span>";
            removeButton.onclick = function() {
                removeRow(removeButton, propertyName)
            };
            td.appendChild(removeButton);
            tr.appendChild(td);

            // Add the row header
            var th = document.createElement("th");
            th.scope = "row";
            th.appendChild(createLabel(property.label));
            tr.appendChild(th);

			
            var td = document.createElement("td");

            var fieldname = document.createElement("input");
            fieldname.type = "hidden";
            fieldname.name = propertyName + "[field]";
            fieldname.value = originalPropertyName;
            td.appendChild(fieldname);
            
            if (property.type == "radio" || property.type == "checkbox") {
                td.colSpan = 2;
                td.className = "filter";
                if (property.type == "radio") {
                    for (var i = 0; i < property.options.length; i++) {
                        var option = property.options[i];
                        if (typeof(option) == "object") {
                            td.appendChild(createCheckbox(propertyName + "[]", option.value,
                                propertyName + "[" + option.value +"]"));
                            td.appendChild(createLabel(option.text ? option.text : "none", propertyName + "[" + option.value +"]"), null, dvalue);
                        }else{
                            td.appendChild(createCheckbox(propertyName, option,
                                propertyName + "[" + option +"]"));
                            td.appendChild(createLabel(option ? option : "none", propertyName + "[" + option +"]"));
                        }
                    }
                } else {
                    td.appendChild(createRadio(propertyName, "1", propertyName + "[on]"));
                    td.appendChild(document.createTextNode(" "));
                    td.appendChild(createLabel("Yes", propertyName + "[on]"));
                    td.appendChild(createRadio(propertyName, "0", propertyName + "[off]"));
                    td.appendChild(document.createTextNode(" "));
                    td.appendChild(createLabel("No", propertyName + "[off]"));
                }
                tr.appendChild(td);
            } else {
                td.className = "mode";
                var modeSelect = createSelect(propertyName + "[mode]",
                    modes[property.type], false, dmode);
                td.appendChild(modeSelect);
                tr.appendChild(td);

                // Add the selector or text input for the actual filter value
                td = document.createElement("td");
                td.className = "filter";
                if (property.type == "select") {
                    var element = createSelect(propertyName + "[value]", property.options, true, dvalue);
                } else if (property.type == "multiple") {
                    var element = createSelect(propertyName + "[value][]", property.options, false, dvalue, true);
                } else if (property.type == "special_multiple") {
                    
                    var aelement = createSelect(propertyName + "[value][]", [], false, [], true);
                    aelement.id = "filter_values_" + count;
                    
                    if(dvalue == undefined){
                        aelement.style.display = "none";
                        var belement = document.createElement("span");
                        belement.id = "filter_values_place_" + count;
                        belement.innerHTML = "No organizations selected";

                        td.appendChild(belement);
                    }else{
                        td.appendChild(aelement);
                        for (kV in dvalue){
                            option = $('<option />').val(kV).attr('selected', true).append(dvalue[kV]);
                            $(aelement).append(option);
                        }
                    }
                    

                    td.appendChild(aelement);
                    td.appendChild(document.createElement("br"));
                    element = document.createElement("input");
                    element.type = "text";
                    element.name = propertyName + "[search]";
                    element.id = "filter_search_" + count;
                    element.size = 42;

                    if(property.search_filter != undefined & property.search_filter != 'all'){
                        default_search_value = 'Search for '+ property.search_filter +'s to add...';
                        refineOption = '/'+ property.search_filter;
                    }else{
                        refineOption = '';
                        default_search_value = 'Search for organizations and individuals to add...';
                    }
                    $(element).val(default_search_value);
                    $(element).addClass('dimmed');
                    $(element).focus(function(){
                        if($(element).hasClass('dimmed')){
                            $(element).val('');
                            $(element).removeClass('dimmed');
                        }
                    });
                    $(element).blur(function(){
                        if($(element).val() == ''){
                            $(element).val(default_search_value);
                            $(element).addClass('dimmed');
                        }
                    });
                    
                    $(element).autocomplete("/dashboard/ajaxSearch"+refineOption, {
                        minChars: 3,
                        parse: function(data) {
                            return $.map(eval(data), function(row) {
                                return {
                                    data: row,
                                    value: row.id,
                                    url: "/" + row.type +"/"+ row.id
                                }
                            });
                        },
                        formatItem: function(r) {
                            return "<span class=\"" + r.type + "\">"+ r.name + " <br /><small>" + r.sub + "</small></span>";
                        },
                        scrollHeight: 265,
                        selectFirst: true,
                        max: 30
                        }).result(function(event, item) {
                            $(".ac_results").hide();
                            $("#" + "filter_values_place_" + count).hide();
                            $("#" + "filter_values_" + count).show();
                            $("#" + "filter_search_" + count).val('');
                            option = $('<option />').val(item.id).attr('selected', true).append(item.name);
                            $("#" + "filter_values_" + count).append(option);
                        });
                } else if (property.type == "hidden") {
                    var belement = document.createElement("span");
                    belement.innerHTML = property.hidden_label + '.';
                    td.appendChild(belement);
                    element = document.createElement("input");
                    element.type = "hidden";
                    element.name = propertyName + "[value]";
                    element.value = property.hidden_value;
                    
                } else if (property.type == "text" | property.type == "text_limited" | property.type == "number" | property.type == "csvlist") {
                    var element = document.createElement("input");
                    element.type = "text";
                    element.name = propertyName + "[value]";
                    element.size = 42;
                    if(dvalue != undefined){
                        element.value = dvalue;
                    }
                } else if (property.type == "date_rel") {
                    if(dvalue != undefined && dvalue.amount != undefined){
                        damount = dvalue.amount;
                    }else{
                        damount = '1';
                    }
                    var aelement = document.createElement("input");
                    aelement.type = "text";
                    aelement.name = propertyName + "[value][amount]";
                    aelement.size = 3;
                    if(damount != undefined){
                        aelement.value = damount;
                    }
                    td.appendChild(aelement);

                    if(dvalue != undefined && dvalue.unit != undefined){
                        dunit = dvalue.unit;
                    }else{
                        dunit = 'months';
                    }
                    
                    var element = createSelect(propertyName + "[value][unit]", [{
                        'days': 'Day(s)',
                        'months': 'Month(s)',
                        'years': 'Year(s)'
                    }], true, dunit);
                } else if (property.type == "date") {
                    var d = new Date();
                    if(dvalue != undefined && dvalue.month != undefined){
                        dmonth = dvalue.month;
                    }else{
                        dmonth = d.getMonth() + 1;
                    }
                    dmonth += '';
                    var month_element = createSelect(propertyName + "[value][month]", [{
                        '01': 'January',
                        '02': 'February',
                        '03': 'March',
                        '04': 'April',
                        '05': 'May',
                        '06': 'June',
                        '07': 'July',
                        '08': 'August',
                        '09': 'September',
                        '10': 'October',
                        '11': 'November',
                        '12': 'December'
                    }], true, dmonth);
                    td.appendChild(month_element);
                    var day_element = document.createElement("input");
                    day_element.type = "text";
                    day_element.name = propertyName + "[value][day]";
                    day_element.size = 2;
                    day_element.maxLength = 2;
                    if(dvalue != undefined && dvalue.day != undefined){
                        day_element.value = dvalue.day;
                    }else{
                        day_element.value = d.getDate();
                    }
                    td.appendChild(day_element);

                    var sep_element = document.createElement("span");
                    sep_element.innerHTML = ', ';
                    td.appendChild(sep_element);

                    var element = document.createElement("input");
                    element.type = "text";
                    element.name = propertyName + "[value][year]";
                    element.size = 4;
		    		element.maxLength = 4;
                    if(dvalue != undefined && dvalue.year != undefined){
                        element.value = dvalue.year;

                    }else{
                        element.value = d.getFullYear();
                    }
                } else if (property.type == "date_range") {
                    d = new Date();
                    months= [{
                        '01': 'January',
                        '02': 'February',
                        '03': 'March',
                        '04': 'April',
                        '05': 'May',
                        '06': 'June',
                        '07': 'July',
                        '08': 'August',
                        '09': 'September',
                        '10': 'October',
                        '11': 'November',
                        '12': 'December'
                    }];



                    if(dvalue != undefined && dvalue.date1.month != undefined){
                        dmonth = dvalue.date1.month;
                    }else{
                        dmonth = '07';
                    }
                    dmonth += '';
                    month_element = createSelect(propertyName + "[value][date1][month]", months, true, dmonth);
                    td.appendChild(month_element);
                    day_element = document.createElement("input");
                    day_element.type = "text";
                    day_element.name = propertyName + "[value][date1][day]";
                    day_element.size = 2;
                    day_element.maxLength = 2;
                    if(dvalue != undefined && dvalue.date1.day != undefined){
                        day_element.value = dvalue.date1.day;
                    }else{
                        day_element.value = '01';
                    }
                    td.appendChild(day_element);

                    sep_element = document.createElement("span");
                    sep_element.innerHTML = ', ';
                    td.appendChild(sep_element);

                    yelement = document.createElement("input");
                    yelement.type = "text";
                    yelement.name = propertyName + "[value][date1][year]";
                    yelement.size = 4;
                    yelement.maxLength = 4;
                    if(dvalue != undefined && dvalue.date1.year != undefined){
                        yelement.value = dvalue.date1.year;
                    }else{
                        yelement.value = d.getFullYear() - 1;
                    }
                    td.appendChild(yelement);


                    sep2_element = document.createElement("span");
                    sep2_element.innerHTML = ' <strong>to</strong> ';
                    td.appendChild(sep2_element);

                    if(dvalue != undefined && dvalue.date2.month != undefined){
                        dmonth = dvalue.date2.month;
                    }else{
                        dmonth = '06';
                    }
                    month_element2 = createSelect(propertyName + "[value][date2][month]", months, true, dmonth);
                    td.appendChild(month_element2);
                    day_element2 = document.createElement("input");
                    day_element2.type = "text";
                    day_element2.name = propertyName + "[value][date2][day]";
                    day_element2.size = 2;
                    day_element2.maxLength = 2;
		    if(dvalue != undefined && dvalue.date2.day != undefined){
                        day_element2.value = dvalue.date2.day;
                    }else{
                        day_element2.value = '30';
                    }
                    td.appendChild(day_element2);

                    sep3_element = document.createElement("span");
                    sep3_element.innerHTML = ', ';
                    td.appendChild(sep3_element);

                    element = document.createElement("input");
                    element.type = "text";
                    element.name = propertyName + "[value][date2][year]";
                    element.size = 4;
                    element.maxLength = 4;
                    if(dvalue != undefined && dvalue.date2.year != undefined){
                        element.value = dvalue.date2.year;
                    }else{
                        element.value = d.getFullYear();
                    }
                }
                td.appendChild(element);
                element.focus();
                tr.appendChild(td);
            }

                        alreadyPresent = false;
            if (alreadyPresent) {
                existingTBody.appendChild(tr);
            } else {
                // Find the insertion point for the new row. We try to keep the filter rows
                // in the same order as the options in the 'Add filter' drop-down, because
                // that's the order they'll appear in when submitted.
                var insertionPoint = getAncestorByTagName(select, "tbody");
        
                // Finally add the new row to the table
                var tbody = document.createElement("tbody");
                tbody.appendChild(tr);
                insertionPoint.parentNode.insertBefore(tbody, insertionPoint);
            }

        }
    }

})(jQuery);

