function multiselectSelectItems(id) {
    var selected = document.getElementById(id + "_selected");
    var unselected = document.getElementById(id + "_unselected");
    
    var options = selected.getElementsByTagName("option");
    for(var i = 0; i < options.length; i++) {
        if( options[i].selected ) {
            unselected.appendChild(options[i]);
            i--;
        }
    }
}
function multiselectUnselectItems(id) {
    var selected = document.getElementById(id + "_selected");
    var unselected = document.getElementById(id + "_unselected");
    
    var options = unselected.getElementsByTagName("option");
    for(var i = 0; i < options.length; i++) {
        if( options[i].selected ) {
            selected.appendChild(options[i]);
            i--;
        }
    }    
}
YAHOO.util.Event.onDOMReady(function() {    
    var inputs = YAHOO.util.Dom.getElementsByClassName("date", "input");
        
    if (inputs.length > 0) {        
        Loader.insertYUIScript("calendar/calendar-min.js");
        Loader.insertYUIStylesheet("calendar/assets/skins/sam/calendar.css");
        Loader.insertYUIStylesheet("calendar/assets/skins/sam/calendar-skin.css");
    }
    
    
    
    var options;
    for(var i = 0; i < inputs.length; i++) {
        options = {};
        if (YAHOO.util.Dom.hasClass(inputs[i], "previous")) {
            options.previousDatesOnly = true;
        }
        
        new DateInput(inputs[i], options);
    }        
});
/* date input fields */
var DateInput = function(el, options) {
    this.init(el, options);
}
DateInput.prototype = {
    
    focusHandler : function() {
        if( !this.overContainer ) {
            this.parent.style.position = "relative";
            if (!this.calendar) {
                this.initCalendar();
            }
            this.calendar.show();
        }
    },
    
    blurHandler : function(e) {        
        if( !this.overContainer ) {
            this.calendar.hide();
        }    
        else {
            this.el.focus();
        }
                
    },    
    
    changeHandler : function(e) {
        if( this.validateDate() ) {
            var dateArray = this.getDateArray();
            if( !dateArray ) {
                return false;
            }
            
            this.el.value = dateArray[0] + "/" + dateArray[1] + "/" + dateArray[2];
                        
            this.calendar.cfg.queueProperty("pagedate", dateArray[0] + "/" + dateArray[2], false); 
            this.calendar.cfg.queueProperty("selected", dateArray[0] + "/" + dateArray[1] + "/" + dateArray[2], false);
            this.calendar.cfg.fireQueue(); 
            this.calendar.render();
        }
    },
        
    clickHandler : function() {
        this.el.focus();
    },
    
    selectHandler : function (type, args) {
        this.el.value = args[0][0][1] + "/" + args[0][0][2] + "/" + args[0][0][0];
        this.calendar.hide();
        this.el.blur();
    },
    
    hideHandler : function () {
        this.overContainer = false;
        this.parent.style.position = "";
    },
    
    renderHandler : function() {
        YAHOO.util.Event.on(this.container, "mouseover", this.mouseoverHandler, this, true);
        YAHOO.util.Event.on(this.container, "mouseout", this.mouseoutHandler, this, true);        
    },
    
    mouseoverHandler : function() {
        this.overContainer = true;
    },
    mouseoutHandler : function() {
        this.overContainer = false;
    },
        
    getDateArray : function() {
        var dateArray;
        if (this.el.value.indexOf("/") != -1) {
            dateArray = this.el.value.split("/");
        }
        else if (this.el.value.indexOf("-") != -1) {
            dateArray = this.el.value.split("-");
        }
        else if (this.el.value.indexOf(".") != -1) {
            dateArray = this.el.value.split(".");
        }    
        else if (this.el.value.indexOf(",") != -1) {
            dateArray = this.el.value.split(",");
        }            
                
        if ( !(dateArray instanceof Array && dateArray.length == 3) ) {
            return null;
        }
        
        // convert to ints, return false if cannot convert
        for(var i = 0; i < dateArray.length; i++) {
            dateArray[i] = parseInt(dateArray[i], 10);
            
            if( !dateArray[i] ) {
                return null;
            }
        }        
        
        return dateArray;        
    },    
    
    validateDate : function() {                
        var dateArray = this.getDateArray();
        if( !dateArray ) {
            return false;
        }
                
        // is month valid
        if( !(dateArray[0] > 0 && dateArray[0] < 13) ) {
            return false;
        }
        
        // is date valid
        var daysInMonth;
        if( dateArray[0] == 4 || dateArray[0] == 6 || dateArray[0] ==  9 || dateArray[0] ==  11 ) {
            daysInMonth = 30;
        }
        else if( dateArray[0] == 2 ) {
            if( dateArray[2] % 4 == 0 ) {
                if( dateArray[2] % 100 == 0 && dateArray[2] % 400 != 0 ) {
                    daysInMonth = 28;
                }
                else {
                    daysInMonth = 29;
                }
            }
            else {            
                daysInMonth = 28;
            }
        }    
        else {
            daysInMonth = 31;
        }
        
        if( !(dateArray[1] > 0 && dateArray[1] <= daysInMonth ) ) {
            return false;
        }        
        
        return true;
    },
    
    init : function(el, options) {    
        this.el = YAHOO.util.Dom.get(el);
        this.el.style.cssFloat = "left";
        this.el.style.styleFloat = "left";
        YAHOO.util.Event.on(this.el, "focus", this.focusHandler, this, true);
        YAHOO.util.Event.on(this.el, "blur", this.blurHandler, this, true);
        YAHOO.util.Event.on(this.el, "change", this.changeHandler, this, true);
        
        this.options = options || {};
        
        // add skin class to body
        YAHOO.util.Dom.addClass(document.getElementsByTagName("body"), "yui-skin-sam");
                            
        var grandParent = this.el.parentNode;
        
        this.parent = document.createElement("div");
        this.parent.style.width = (this.el.offsetWidth + 25) + "px";
        this.parent.appendChild(this.el);
        grandParent.appendChild(this.parent);
                                
        this.container = document.createElement("div");
        this.container.id = this.el.id + "_cal_container";
        this.container.style.position = "absolute";
        this.container.style.display = "none";
        this.container.style.left = "0px";
        this.container.style.top = this.el.offsetHeight + "px";
        this.parent.appendChild(this.container);    
                
        this.overContainer = false;
    },
    
    initCalendar: function() {
        var calOptions = {close : true, title : "Choose Date:"};
        if (this.options.previousDatesOnly) {
            calOptions.maxdate = new Date();
        }
        
        this.calendar = new YAHOO.widget.Calendar(this.container, calOptions);
        this.calendar.selectEvent.subscribe(this.selectHandler, this, true);
        this.calendar.hideEvent.subscribe(this.hideHandler, this, true);
        this.calendar.renderEvent.subscribe(this.renderHandler, this, true);
        this.calendar.render();            
    }
    
};
/* date input fields */
var MultipleFilesInput = function(el) {
    this.init(el);
}
MultipleFilesInput.prototype = {
    
    inputs: [],
    count: 0,
    
    init: function(el) {
        var el = YAHOO.util.Dom.get(el);
        if (!el) {
            return;
        }
        
        var elId = el.id;
        
        var divEl = document.createElement("div");
        YAHOO.util.Dom.insertBefore(divEl, el);
        divEl.appendChild(el);
        
        this.getEl = function() {return divEl;};
        
        divEl.removeChild(el);
        this.createAddLink();
        this.addInput();
    },
    
    createAddLink: function() {
        var divEl = document.createElement("div");
        YAHOO.util.Dom.setStyle(divEl, "padding", "5px 0");
        YAHOO.util.Dom.setStyle(divEl, "clear", "both");
        this.getEl().appendChild(divEl);    
        this.getAddEl = function() {return divEl;};
        
        var linkEl = document.createElement("a");
        linkEl.href = "#";
        linkEl.innerHTML = lang.formMessages.addAttachmentTxt;
        divEl.appendChild(linkEl);
        this.getAddLinkEl = function() {return linkEl;};
        
        var that = this;
        YAHOO.util.Event.on(linkEl, "click", function(e) {
            YAHOO.util.Event.stopEvent(e);
            that.addInput();
        });    
    },
    
    updateAddLink: function() {
        this.getAddLinkEl().innerHTML = this.count == 0 ? lang.formMessages.addAttachmentTxt : lang.formMessages.addAnotherAttachmentTxt;
    },
    
    addInput: function() {    
        var divEl = document.createElement("div");
        YAHOO.util.Dom.generateId(divEl, "file_input_");
        YAHOO.util.Dom.setStyle(divEl, "clear", "both");
        YAHOO.util.Dom.insertBefore(divEl, this.getAddEl());
        
        var inputEl = document.createElement("input");
        inputEl.type = "file";
        inputEl.name = "attachments[]";
        YAHOO.util.Dom.addClass(inputEl, "file");
        YAHOO.util.Dom.setStyle(inputEl, "float", "none");
        divEl.appendChild(inputEl);
        
        var removeEl = document.createElement("a");
        removeEl.href = "#";
        removeEl.innerHTML = lang.formMessages.removeAttachmentTxt;
        YAHOO.util.Dom.setStyle(removeEl, "padding", "0 0 0 5px");
        divEl.appendChild(removeEl);
        
        var that = this;
        YAHOO.util.Event.on(removeEl, "click", function(e) {
            YAHOO.util.Event.stopEvent(e);
            that.removeInput(divEl.id);
        });
        
        this.count++;
        this.updateAddLink();
    },
    
    removeInput: function(id) {    
        var divEl = YAHOO.util.Dom.get(id);
        divEl.parentNode.removeChild(divEl);
        
        this.count--;
        this.updateAddLink();
    }
    
};
var Form = function(el) {
    this.init(el);
}
Form.prototype = {
    el: null,
    fields: [],
    
    init: function(el) {
        this.el = YAHOO.util.Dom.get(el);
        
        var that = this;
        YAHOO.util.Event.on(this.getEl(), "submit", function(e) {
            if(!that.validate()) {
                YAHOO.util.Event.stopEvent(e);
            }
            
        });
        
        this.initFields();
        
        var fields = this.getFields();
        var that = this;
        for(var i = 0; i < fields.length; i++) {
            YAHOO.util.Event.on(fields[i], "blur", function(e, field) {
                that.validateField(field);
            }, fields[i]);
        }        
    },
    
    initFields: function() {
    },
    
    getEl: function() {
        return this.el;
    },
    
    getFields: function() {
        return this.fields;
    },
    addField: function(field, assertions) {
        this.fields[this.fields.length] = [YAHOO.util.Dom.get(field), assertions];
    },
    validate: function() {
        var error = false;    
        var fields = this.getFields();
        
        for(var i = 0; i < fields.length; i++) {
            if (!this.validateField(fields[i])) {
                error = true;
            }
        }
                
        if (error) {
            return false;
        }
        
        return true;
    },
    
    getPreviousField: function(fieldEl) {        
        var cellEl, rowEl;
        
        cellEl = fieldEl.parentNode;
        if (!cellEl) {
            return null;
        }
        
        rowEl = cellEl.parentNode;
        if (!rowEl) {
            return null;
        }
        
        rowEl = YAHOO.util.Dom.getPreviousSibling(rowEl);
        if (!rowEl) {
            return null;
        }
        
        return rowEl.getElementsByTagName("input")[0];
    },
    
    validateField: function(field) {        
        var fieldEl = field[0];
        var cellEl = fieldEl.parentNode;
        var rowEl = cellEl.parentNode;
        
        this.removeErrorMessage(rowEl, cellEl);
        if (this.fieldHasAssertion(field, "not_empty") && (fieldEl.value == "" || (fieldEl.type == "checkbox" && !fieldEl.checked))) {            
            this.addErrorMessage(rowEl, cellEl, lang.formMessages.emptyTxt);            
            return false;
        }
        else if (this.fieldHasAssertion(field, "valid_email") && !this.validateEmailAddress(fieldEl.value)) {
            this.addErrorMessage(rowEl, cellEl, lang.formMessages.invalidEmailTxt);            
            return false;            
        }
        else if (this.fieldHasAssertion(field, "match_email") && !this.matchesPrevious(fieldEl)) {                
            this.addErrorMessage(rowEl, cellEl, lang.formMessages.nonMatchEmailTxt);            
            return false;
        }
                
        return true;
    },
    
    fieldHasAssertion: function(field, assertion) {
        for(var i = 0; i < field[1].length; i++) {
            if(field[1][i] == assertion) {
                return true;
            }
        }
        
        return false;
    },    
        
    validateEmailAddress: function(emailAddress) {
        var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
        if (!reg.test(emailAddress)) {
            return false;
        }
        
        return true;
    },
    
    matchesPrevious: function(fieldEl) {
        var previousEl = this.getPreviousField(fieldEl);        
        if (!previousEl) {
            return false;            
        }
        
        return fieldEl.value == previousEl.value;
    },
    
    addErrorMessage: function(rowEl, cellEl, message) {
        if (YAHOO.util.Dom.hasClass(rowEl, "error")) {            
            return;
        }
    
        YAHOO.util.Dom.addClass(YAHOO.util.Dom.getFirstChild(rowEl), "first");
        YAHOO.util.Dom.addClass(YAHOO.util.Dom.getLastChild(rowEl), "last");
        YAHOO.util.Dom.addClass(rowEl, "error");
    
        var errorEl = document.createElement("div");
        YAHOO.util.Dom.addClass(errorEl, "error");
        errorEl.innerHTML = "<span class=\"emphasis\">*</span> " + message;
    
        cellEl.appendChild(errorEl);
        
        // hack to fix firefox issue
        var tBodyEl = this.getEl().getElementsByTagName("tbody")[0];
        var rowEls = tBodyEl.getElementsByTagName("tr");
        var rowEl = document.createElement("tr");
        tBodyEl.insertBefore(rowEl, rowEls[0]);
        tBodyEl.removeChild(rowEl);
        
    },
    
    removeErrorMessage: function(rowEl, cellEl) {
        if (!YAHOO.util.Dom.hasClass(rowEl, "error")) {            
            return;
        }        
        
        YAHOO.util.Dom.removeClass(YAHOO.util.Dom.getFirstChild(rowEl), "first");
        YAHOO.util.Dom.removeClass(YAHOO.util.Dom.getLastChild(rowEl), "last");
        YAHOO.util.Dom.removeClass(rowEl, "error");
        
        var errorEl = cellEl.getElementsByTagName("div")[0];
        cellEl.removeChild(errorEl);
        
        // hack to fix firefox issue
        var tBodyEl = this.getEl().getElementsByTagName("tbody")[0];
        var rowEls = tBodyEl.getElementsByTagName("tr");
        var rowEl = document.createElement("tr");
        tBodyEl.insertBefore(rowEl, rowEls[0]);
        tBodyEl.removeChild(rowEl);
    }    
}
