var geekIT_miniCalendar = {
    calendar: null,
    url: "/",
    config: { LOCALE_WEEKDAYS: "1char", selected: "", STRINGS: { previousMonth:"", nextMonth: "", close: "" } },
    init: function() {
        if (geekIT_miniCalendar_config_selected) {
            geekIT_miniCalendar.config.selected = geekIT_miniCalendar_config_selected;
        }
        if (geekIT_miniCalendar_config_url) {
            geekIT_miniCalendar.url = geekIT_miniCalendar_config_url;
        }
        geekIT_miniCalendar.calendar = new YAHOO.widget.Calendar("cal1", "cal1Container", geekIT_miniCalendar.config);
        geekIT_miniCalendar.calendar.selectEvent.subscribe(geekIT_miniCalendar.selectEventHandler, geekIT_miniCalendar.calendar, true);
        geekIT_miniCalendar.calendar.render();
    },
    toISO8601: function(dt) {
        var buf = dt[0];
        buf += (dt[1] > 9) ? '' + dt[1] : '0' + dt[1];
        buf += (dt[2] > 9) ? '' + dt[2] : '0' + dt[2];
        return buf;
    },
    renderCellDefault: function(workingDate, cell) {
        cell.innerHTML = '<span class="' + this.Style.CSS_CELL_SELECTOR + '">' + this.buildDayLabel(workingDate) + "</span>";
    },
    selectEventHandler: function(type, args, obj) {
        var selectedISO = geekIT_miniCalendar.toISO8601(args[0][0]);
        var isredirect = false;
        for (var i = 0; i < this._selectedDates.length; i++) {
            var item = geekIT_miniCalendar.toISO8601(this._selectedDates[i]);
            isredirect = (item == selectedISO) ? true : false;
            if (isredirect) { break; }
        }
        geekIT_miniCalendar.calendar.reset();
        if (isredirect) {
            geekIT_miniCalendar.validateRedirection("?start=" + item);
        }
        else {
            geekIT_miniCalendar.validateRedirection("#");
        }
    },
    validateRedirection: function(querystring) {
        if (querystring) {
            location.href = geekIT_miniCalendar.url + querystring;
        }
    }
};

/* YUI MenuButton functions */
function onMenuItemClick(type, args, obj) {
    obj.parent.cfg.getProperty("button").set("label", obj.cfg.getProperty("text"));
    if(obj.parent.cfg.getProperty("inputContainer")) {
        obj.parent.cfg.getProperty("inputContainer").value = obj.value;
    }
}
 
function addEventHandlerToMenuItems(menuItems, onClickHandler) {
    for(var i=0; i<menuItems.length;i++) {
        if(onClickHandler) {
            menuItems[i].onclick = { fn: onClickHandler };
        }
        else {
            menuItems[i].onclick = { fn: onMenuItemClick };
        }
    }
}


/*
    entries is an array of MenuItems

    the 'name' should match the prefix of the ID of the DIV created to hold the menu.
    i.e. if the DIV ID is "locationDropdownMenu", name should be "location"
    
    titles is used in grouped menus to set the title of each group, and is an array of { title, index } elements holding the title for each index into the array of groups.
    should be null if not grouped.
*/
function createMenu(entries, name, titles, onClickHandler) {
    
    if(titles) {
        addEventHandlerToGroupedMenuItems(entries, onClickHandler);
    }
    else {
        addEventHandlerToMenuItems(entries, onClickHandler);
    }
    
    var menu = new YAHOO.widget.Menu(name+"DropdownMenuContainer", { itemdata: entries });
    
    if(titles) {
        for(var i=0; i<titles.length;i++) {
            menu.setItemGroupTitle(titles[i].title, titles[i].index);
        }
    }
    
    menu.cfg.addProperty("name", { value: name });
    menu.render(name+"DropdownMenu");
    return menu;
}

/*
    selectedValue and defaultValue are mutually exclusive.
    defaultValue should be used when you need to give the drop-down a label that doesn't actually appear in the list
    (i.e. Sort by Category)
    defaultValue will be ignored if selectedValue != null
*/
function createDropDown(name, defaultValue, menuEntries, menuName, inputContainer, onClickHandler) {
    var menu = createMenu(menuEntries, menuName, null, onClickHandler);
    var menuInputContainer = document.getElementById(inputContainer);
    var button;
    
    var selectedValue = (menuInputContainer) ? menuInputContainer.value : null;
    
    if (selectedValue) {
	    /* re-select the previously selected value if necessary */
        var selectedIndex = 0;
	    for(var i=0; i<menu.itemData.length;i++) {
	        if(menu.itemData[i].value == selectedValue) {
	            selectedIndex = i;
	            break;
	        }
	    }
	    button = new YAHOO.widget.Button({ type: "menu", label: menu.itemData[selectedIndex].text, name: name, menu: menu, container: name+"Container" });
    }
    else {
        button = new YAHOO.widget.Button({ type: "menu", label: defaultValue, name: name, menu: menu, container: name+"Container" }); 
    }
    
    menu.cfg.addProperty("button", { value: button });
    
    menu.cfg.addProperty("inputContainer", { value: menuInputContainer });
    
    return button;
}

/* Grouped MenuButton functions */
function addEventHandlerToGroupedMenuItems(menuItems) {
    for(var i=0; i<menuItems.length;i++) {
        for(var j=0; j<menuItems[i].length;j++) {
            menuItems[i][j].onclick = { fn: onMenuItemClick };
        }
    }
}

/*
    selectedValue and defaultValue are mutually exclusive.
    defaultValue should be used when you need to give the drop-down a label that doesn't actually appear in the list
    (i.e. Sort by Category)
    defaultValue will be ignored if selectedValue != null
*/
function createGroupedDropDown(name, defaultValue, menuEntries, menuTitles, menuName, inputContainer, onClickHandler) {
    var menu = createMenu(menuEntries, menuName, menuTitles, onClickHandler);
    var menuInputContainer = document.getElementById(inputContainer);
    var button;
    
    var selectedValue = menuInputContainer.value;
    
    if (selectedValue) {
	    /* re-select the previously selected value if necessary */
	    var selectedGroup = 0;
        var selectedIndex = 0;
        for(var i=0; i<menu.itemData.length;i++) {
	        for(var j=0; j<menu.itemData[i].length;j++) {
	            if(menu.itemData[i][j].value == selectedValue) {
	                selectedGroup = i;
	                selectedIndex = j;
	                break;
	            }
	        }
	    }
	    button = new YAHOO.widget.Button({ type: "menu", label: menu.itemData[selectedGroup][selectedIndex].text, name: name, menu: menu, container: name+"Container" });
    }
    else {
        button = new YAHOO.widget.Button({ type: "menu", label: defaultValue, name: name, menu: menu, container: name+"Container" }); 
    }
    
    menu.cfg.addProperty("button", { value: button });
    
    menu.cfg.addProperty("inputContainer", { value: menuInputContainer });
    
    return button;
}

/*
* YUI TreeView functions
*/
function createTreeViewWithTaskNodes(container, treeItems, /*onTreeViewItemCheckChanged, */inputContainer) {

    var tree = new YAHOO.widget.TreeView(container, inputContainer);

    /*
    
    [ { text: "Tree Node 1", value: "Value", checked: false, children: [ 
        {text: "Child 1.1", value: "Value 1.1", checked: false, children:[]}, 
        {text: "Child 1.2", value: "Value 1.2", checked: false, children:[]} ]
    },
    { text: "Tree Node 2", value: "Value", checked: false, children: [ 
        {text: "Child 2.1", value: "Value 2.1", checked: false, children:[
            {text: "Child 2.1.1", value: "Value 2.1.1", checked: false, children:[]},
            {text: "Child 2.1.2", value: "Value 2.1.2", checked: false, children:[]} ]
        }, 
        {text: "Child 2.2", value: "Value 2", checked: false, children:[]} ]
    } 
    ]
    
    */

    for (var i = 0; i < treeItems.length; i++) {
        var treeNode = new YAHOO.widget.TaskNode(treeItems[i].text, tree.getRoot(), true, treeItems[i].checked, treeItems[i].value/*, onTreeViewItemCheckChanged*/);
        //console.log(i + " : " + treeItems[i].text + " = " + treeItems[i].value);
        if (treeItems[i].children != null) {
            for (var j = 0; j < treeItems[i].children.length; j++) {
                //console.log(i + "." + j + " : " + treeItems[i].children[j].text + " = " + treeItems[i].children[j].value);
                var childNode = new YAHOO.widget.TaskNode(treeItems[i].children[j].text, treeNode, true, treeItems[i].children[j].checked, treeItems[i].children[j].value);
            }
        }
    }

    tree.subscribe("checkClick", onTreeViewItemCheckChanged);/*function(node) {
        YAHOO.log(node.index + " check was clicked", "info", "example");
    });*/

    //tree.cfg.addProperty("inputContainer", { value: inputContainer });

    //alert("pre-draw()");
    
    tree.draw();

    return tree;
}

function getCheckedNodes(treeView, nodes) {
    // regenerate the CSV list of checked items and store it in geekIT_treeView.inputField
    nodes = nodes || treeView.getRoot().children;
    var checkedNodes = [];
    for (var i = 0, l = nodes.length; i < l; i++) {
        var n = nodes[i];
        //if (n.checkState > 0) { // if we were interested in the nodes that have some but not all children checked
        if (n.checkState === 2) {
            checkedNodes.push(n.nodeValue); // just using label for simplicity
        }

        if (n.hasChildren()) {
            checkedNodes = checkedNodes.concat(getCheckedNodes(treeView, n.children));
        }
    }
    return checkedNodes;
}

function onTreeViewItemCheckChanged(node) {
    var treeView = node.tree;
    var checkedNodeList = getCheckedNodes(treeView);

    if (treeView.inputContainer) {
        document.getElementById(treeView.inputContainer).value = checkedNodeList.join(",");
    }
}