// Fix IE5-Mac's lack of Array.push()
if (Array.prototype.push == null) {
    Array.prototype.push = function (obj) {
        this[this.length] = obj;
    }
}

if (window.org == null) window.org = {};
if (org.thevoterguide == null) org.thevoterguide = {};

(function (vgt) {
    var $ = jQuery;

    $.extend(vgt, {

mirrorBoxState: function(box, boxset) {
    if (boxset) {
        if (boxset.length) {
            for (var i = 0; i < boxset.length; i++) {
                boxset[i].checked = box.checked;
            }
        } else {
            boxset.checked = box.checked;
        }
    }
},

submitAsSubmitClick: function(form, imageName) {
    this.setFormValue(form, imageName, "submitted");
    form.submit();
},

setFormValue: function(form, name, value) {
    if (! form.elements[name]) {
        var input = document.createElement('input');
        input.type = "hidden";
        input.name = name;
        form.appendChild(input);
        input.value = value;
    } else {
        form.elements[name].value = value;
    }
},

setFormDirty: function() {
    this._formdirty = true;
},

_onAutoSave: function(strId) {
    if (this._formdirty) {
        var objForm = document.getElementById(strId);
        if (objForm)
            this.autoSaveForm(objForm);
    }
},

autoSaveForm: function(objForm) {
    if (this._formsaving) return;

    // Submit the page if an image is selected to upload.
    if (objForm.file && objForm.file.value != "") {
        objForm.submit();
        return;
    }

    // mimic negative look-behind
    var action = String(objForm.action).replace(/(:?!ajax)?\.do/g, function($0, $1){
    	return $1 ? $0 : '!ajax.do';
    });

    var options = {
        url: action,
        dataType: "xml",
        beforeSubmit: function(arrData) {
            for (var i = 0; i < arrData.length; i++) {
                var name = arrData[i].name;

                if (name == "file")
                    arrData.splice(i--, 1);
            }
        },
        success: function(xml) {
            org.thevoterguide._formdirty = false;
            org.thevoterguide._formsaving = false;

            var objStatus = document.getElementById("profile-form-status");
            objStatus.innerHTML = String(xml).indexOf("OK") >= 0 ?
                                  "Form auto-saved on " + new Date() :
                                  "Form auto-saved failed on " + new Date();
        }
    };

    this._formsaving = true;
    jQuery(objForm).ajaxSubmit(options);
},

onHelp: function(anchor) {
    var w = window.open("http://dp.thevoterguide.org/help/" + anchor, "vgtHelp");
    if (w)
        w.focus();
    else
        window.alert("Please disable your popup-blocker to view the help.");
    return false;
},

guardLeave: function(cb) {
    $("a.guarded").click(cb);
},
        
updateYouTubeAnswer: function(id) {
    $("#yth_" + id).val($("#ytu_" + id).val() + "``" + $("#ytt_" + id).val());
},

LimitedInput: function(elm) {
    this._elm = $(elm);
    var me = this;
    this._elm.focus(function(e) { me.focus(e); });
    this._elm.blur(function(e) { me.blur(e); });
    this._elm.keydown(function(e) { me.keydown(e); });
    this._elm.keyup(function(e) { me.keydown(e); });
    this._keyfct = function() { me._onkeypress(); };

    this._limit = parseInt(elm.className.substring(elm.className.indexOf("limit_") + 6));

    this._elm.after('<div style="display:none;" class="LimitedInput_status"></div>');
    this._status = $("~ div", this._elm).slice(0, 1);
},

ReorderableTable: function(elm) {
    this._elm = $(elm);
    var idRegex = /\breorderable_id_(\S+)\b/;

    String(elm.className).match(/\breorderable_form_(\S+)\b/);
    var formId = RegExp.$1;

    this._elm.tableDnD({
        dragHandle: "reorderable_drag",
        onDragClass: "dragging",
        onAllowDrop: function(dragRow, overRow) {
            return $(overRow).hasClass("reorderable_elm");
        },
        onDrop: function(table, row) {
            String(row.className).match(idRegex);
            var movedId = RegExp.$1;
            var nextSiblingId = null;

            if (row.nextSibling) {
                if (String(row.nextSibling.className).match(idRegex))
                    nextSiblingId = RegExp.$1;
            }

            if (movedId) {
                var form = document.getElementById(formId);
                form.entityId.value = movedId;
                form.beforeId.value = nextSiblingId;
                $(form).ajaxSubmit();
            }
        }
    });

    $(".reorderable_elm", elm).filter(function(e) { return $(this).parents(elm.nodeName)[0] == elm; }).each(function() {
        var tr = this;
        var handle = $(".reorderable_drag", $(this)).filter(function(e) { return $(this).parents(tr.nodeName)[0] == tr; });
        handle.mouseover(function(e) { handle.addClass("active"); });
        handle.mouseout(function(e) { handle.removeClass("active"); });
    });
},

Expander: function(elm) {
    this._elm = $(elm);
    this._open = false;
    var me = this;

    var handle = $("> :first", this._elm);
    handle.addClass("expander-handle-closed");
    handle.click(function(e) { me.toggle(e); });
}
        
    });
})(org.thevoterguide);

(function (LimitedInput) {
    var $ = jQuery;

    LimitedInput.init = function(elm) {
        var input = new LimitedInput(elm);
    };

    $.extend(LimitedInput.prototype, {

focus: function(e) {
    this._updateStatus();
    this._status.show();
},

blur: function(e) {
    this._status.hide();
},

keydown: function(e) {
    window.setTimeout(this._keyfct, 0);
},

_onkeypress: function(e) {
    var v = this._elm[0].value;
    if (v.length > this._limit)
        this._elm[0].value = v.substring(0, this._limit);
    this._updateStatus();
},

_updateStatus: function() {
    var length = this._elm[0].value.length;
    var ratio = length / this._limit;
    this._status.html((this._limit - length) + " of " + this._limit + " characters remaining");

    if (ratio < 0.95) {
        this._status.removeClass("warn").removeClass("error");
    } else if (ratio < 1.0) {
        this._status.addClass("warn").removeClass("error");
    } else {
        this._status.removeClass("warn").addClass("error");
    }
}

    });
})(org.thevoterguide.LimitedInput);

(function (ReorderableTable) {
    var $ = jQuery;

    ReorderableTable.init = function(elm) {
        var input = new ReorderableTable(elm);
    };

    $.extend(ReorderableTable.prototype, {
    });
})(org.thevoterguide.ReorderableTable);

(function (Expander) {
    var $ = jQuery;

    Expander.init = function(elm) {
        this._open = false;
        this._elm = new Expander(elm);
    };

    $.extend(Expander.prototype, {

toggle: function(e) {
    var handle = $("> :first", this._elm);
    var target = $(".expander-target", this._elm);
    
    this._open = !this._open;

    if (this._open) {
        target.show();
        handle.addClass("expander-handle-open").removeClass("expander-handle-closed");
    } else {
        target.hide();
        handle.addClass("expander-handle-closed").removeClass("expander-handle-open");
    }
}

    });
})(org.thevoterguide.Expander);

jQuery(document).ready(function() {
    $("form:not(.vgt-freesubmit):has(input:image, input:submit)").submit(function() {
        if (this._vgtsubmitted)
            return false;
        this._vgtsubmitted = true;

        $("input:image", this).addClass("submit-disabled");
        $("input:submit", this).addClass("submit-disabled");
    });

    $("a.vgt-clickonce").click(function() {
        if (org.thevoterguide._vgtclicked)
            return false;
        org.thevoterguide._vgtclicked = true;

        $("a.vgt-clickonce").addClass("submit-disabled");
    });
});

jQuery(document).ready(function() {
  jQuery("input.limited, textarea.limited").each(function() {
    org.thevoterguide.LimitedInput.init(this);
  });
});

jQuery(document).ready(function() {
  jQuery(".reorderable").each(function() {
    org.thevoterguide.ReorderableTable.init(this);
  });
});

jQuery(document).ready(function() {
  jQuery(".expander").each(function() {
    org.thevoterguide.Expander.init(this);
  });
});

/*
CSS Browser Selector v0.3.1
Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Contributors: http://rafael.adm.br/css_browser_selector#contributors
*/
function css_browser_selector(u){var ua = u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1;},g='gecko',w='webkit',s='safari',h=document.getElementsByTagName('html')[0],b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3')?g+' ff3':is('gecko/')?g:/opera(\s|\/)(\d+)/.test(ua)?'opera opera'+RegExp.$2:is('konqueror')?'konqueror':is('chrome')?w+' '+s+' chrome':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?'mobile':is('iphone')?'iphone':is('ipod')?'ipod':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win':is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);
