﻿/// <reference name="MicrosoftAjax.js"/>
/// <reference path="jquery-1.2.6.js"/>

/*  Update pane handling  */
var changesDisabled = false;
var changesMade = false;
var pendingNode = null;

/*  Cached values  */

var frame1DOM = null;
var frame1SC = null, treeAreaSC = null, contentAreaSC = null;

/*  Firebug  */

function whichBrs() {
    var agt = navigator.userAgent.toLowerCase();
    if (agt.indexOf("opera") != -1) return 'Opera';
    if (agt.indexOf("firefox") != -1) return 'Firefox';
    if (agt.indexOf("safari") != -1) return 'Safari';
    if (agt.indexOf("msie") != -1) return 'Internet Explorer';
    if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
    if (agt.indexOf('\/') != -1) {
        if (agt.substr(0, agt.indexOf('\/')) != 'mozilla') {
            return navigator.userAgent.substr(0, agt.indexOf('\/'));
        }
        else return 'Netscape';
    } else if (agt.indexOf(' ') != -1)
        return navigator.userAgent.substr(0, agt.indexOf(' '));
    else return navigator.userAgent;
}

function consoleLog(text) {
    var i = whichBrs();
    if (i == "Safari") {
        window.console.log(text);
        return;
    }
    if (i == "Firefox" && typeof (console) != 'undefined') {
        console.log(text);
        return;
    }
}

function consoleWarn(text) {
    var i = whichBrs();
    if (i == "Safari") {
        window.console.log(text);
        return;
    }
    if (i != "Firefox")
        return;
    if (typeof (console) != 'undefined') {
        console.warn(text);
    }
}

function consoleEnterDebug(name) {
    var i = whichBrs();
    if (i == "Safari") {
        window.console.log("enter " + name);
        return;
    }
    if (i != "Firefox")
        return;
    if (typeof (console) != 'undefined') {
        console.group(name);
        console.time(name);
    }
}

function consoleExitDebug(name) {
    var i = whichBrs();
    if (i == "Safari") {
        window.console.log("exit " + name);
        return;
    }
    if (i != "Firefox")
        return;
    if (typeof (console) != 'undefined') {
        console.timeEnd(name);
        console.groupEnd(name);
    }
}

function consoleTime(name) {
    if (whichBrs() != "Firefox")
        return;
    if (typeof (console) != 'undefined') {
        console.time(name);
    }
}

function consoleTimeEnd(name) {
    if (whichBrs() != "Firefox")
        return;
    if (typeof (console) != 'undefined') {
        console.timeEnd(name);
    }
}

/*  File Uploads  */

function clientFileSelected(radUpload, eventArgs) {
    if (changes() == true) {
        var tb = $find('ItemToolbar');
        tb.remove_buttonClicking(toolbarPostbackClick);
        tb.add_buttonClicking(toolbarPostbackClick);
    }
}

function toolbarPostbackClick(sender, args) {
    var item = args.get_item();
    if (item.get_commandName() == "Cancel")
        return;
    args.set_cancel(true);

    var b = $get('syncPoster');
    b.value = item.get_commandName() + "|" + item.get_commandArgument();
    b.click();
}

function prepostEnableElements()
{
//	$get("AdminToolbar_i0_i0_SortDrpDwn").disabled = false;
}


/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

/*  UI sizing  */

function fixSize() {
    consoleEnterDebug("fixSize");
    var h, w;
	if (window.innerHeight != null) {
	    h = window.innerHeight;
	    w = window.innerWidth;
	}
	if (document.body.clientHeight != null) {
	    h = document.body.clientHeight;
	    w = document.body.clientWidth;
	}

	//  get stylesheet rule classes
	consoleTime("collect style classes");

	if (!frame1SC) {
	    var cssRules = (document.styleSheets[0].cssRules) ? 'cssRules' : 'rules';
	    var found = 0;
	    for (var s = 0; s < document.styleSheets.length; s++) {
	        for (var r = 0; r < document.styleSheets[s][cssRules].length; r++) {
	            if (found == 3)
	                break;
	            var rule = document.styleSheets[s][cssRules][r];
	            if (rule.selectorText == "#frame1") {
	                found++;
	                frame1SC = rule;
	                continue;
	            }
	            if (rule.selectorText == "#treeArea") {
	                found++;
	                treeAreaSC = rule;
	                continue;
	            }
	            if (rule.selectorText == "#contentArea") {
	                found++;
	                contentAreaSC = rule;
	                continue;
	            }
	        }
	    }
	}
	consoleTimeEnd("collect style classes");

	if (!frame1DOM)
	    frame1DOM = $get('frame1');
	var frameWidth = Sys.UI.DomElement.getBounds(frame1DOM).width;
	var treeWidth = Sys.UI.DomElement.getBounds($get('rpTree')).width;
	var splitWidth = Sys.UI.DomElement.getBounds($get('rsb2')).width;
	var width = frameWidth - treeWidth - splitWidth;
	var height = parseInt(h) - parseInt(frame1SC.style.top) - 4 - parseInt(frame1SC.style.bottom);

	if (typeof (console) != 'undefined') {
	    consoleLog("frameWidth = " + frameWidth + ", treeWidth = " + treeWidth + ", splitWidth = " + splitWidth);
	    consoleLog("calculated rightpane width = " + width);
	    consoleLog("calculated tree/rightpane height = " + height);
	}

	//  Toolbar height: 30px  Drop-down height: 23px.  Total: 53px.
	treeAreaSC.style.height = height - 57 + "px";
	var toolbarHeight = $('#ItemToolbar').height();
	if (toolbarHeight == null)
	    toolbarHeight = 0;
	var bottomOffset = 2;
	if ($telerik.isIE)
	    bottomOffset = 6;
	contentAreaSC.style.height = height - toolbarHeight - bottomOffset + "px";
	contentAreaSC.style.width = width - 2 + "px";

	consoleExitDebug("fixSize");
}

function EditorOnClientLoad(editor, args)
{
	var element = document.all ? editor.get_document().body : editor.get_document();
	$telerik.addExternalHandler(element, "change", function(e) { changes(); });
	$telerik.addExternalHandler(element, "paste", function(e) { changes(); });
	$telerik.addExternalHandler(element, "keypress", function(e) { changeskeyup(e); });
}

function enableElements(on) {
    consoleEnterDebug("enableElements(" + on + ")");

	var el = $find('FiscalYearFilter');
	if (el)
	{
		if (on)
			el.enable();
		else
			el.disable();
	}

	var toolbars = {0:$find('MainToolbar'), 1:$find('AdminToolbar'), 2:$find('filterToolbar')};

	for (el in toolbars) {
	    if (!toolbars[el]) {
	        continue;
	    }
		var items = toolbars[el].get_items();

		for(var i=0; i < items.get_count(); i++)
		{
		    var c = items.getItem(i);
		    if (c.get_value() == "comp" || c.get_text() == "Sort By:")
		        continue;
			if (on)
				c.enable();
			else
				c.disable();
            if (c.get_value() == "searchTerm")
                c.get_element().getElementsByTagName('input')[0].disabled = !on;
		}
	}

	$find('Tree').set_enabled(on);
	consoleExitDebug("enableElements(" + on + ")");
}

function nodeClicking(node, eventArgs) {
    consoleEnterDebug("nodeClicking");
    consoleExitDebug();
}

function keyCodeFor(e) {
	if ($telerik.isIE) {
		if (e.keyCode)
			return e.keyCode;
	}
	else {
		if (e.charCode)
			return e.charCode;
	}
	return 0;
}

function changeskeypress(e) {
	if (keyCodeFor(e))
		changes();
}

function changeskeyup(e)
{
	if (e.keyCode) {
		code = e.keyCode;
	} else if (e.which) {
		code = e.which;
	}
	//  Record as a change if Backspace (8) or Del (46) is detected
	if ( code == 8 || code == 46 )
		changes();
}

/*  Window management  */

function closeit()
{
	CloseOnReload();
	return true;
}
function GetRadWindow()
{
	var oWindow = null;
	if (window.radWindow) oWindow = window.radWindow; //Will work in Moz in all cases, including clasic dialog
	else if (window.frameElement.radWindow) oWindow = window.frameElement.radWindow;//IE (and Moz as well)
	return oWindow;
}
function CloseOnReload()
{
	GetRadWindow().Close();
}
function RefreshParentPage()
{
	GetRadWindow().BrowserWindow.location.reload();
}

function RefreshParentControl()
{
	GetRadWindow().BrowserWindow.SubmitPage();
}
function SubmitPage()
{
	changes();
	document.getElementById("Button1").click();
}

/*  Pop-up calendar placement  */

function CalendarPopupAbove(sender, eventArgs)
{   
	var picker = $find(sender.get_id()).Owner;
	var textBox = picker.get_textBox();
	var tbBounds = Sys.UI.DomElement.getBounds(textBox);
	var popupElement = picker.get_popupContainer();
	var dimensions = picker.getElementDimensions(popupElement);
	var position = picker.getElementPosition(textBox);
	picker.showPopup(tbBounds.x + tbBounds.width - dimensions.width, position.y + 24);
//	if (eventArgs != null)
//        eventArgs.set_cancel(true);
}

function CalendarHidePopup(id) {
    $find(id).hidePopup();
/*
    var picker = $find(sender.get_id()).Owner;
    if (picker.isPopupVisible() == true)
        picker.hidePopup();
*/
}

/*  Tree context menu  */

function ContextMenuClick(node, e)
{
	var menu = null;
	var i;
	menu = window["RadMenu1"];
	if (menu)
	{
		menu.Show(e);
		e.cancelBubble = true;
		if (e.stopPropagation)
		{
			e.stopPropagation();
		}
		e.returnValue = false;
		if (e.preventDefault)
		{
			e.preventDefault();
		}
		if ( e.Item.Text == "Expand all nodes" )
		{
			for(i=0; i<Tree.AllNodes.length; i++)
			{
				Tree.AllNodes[i].Expand();
			}
		}
		if ( e.Item.Text == "Collapse all nodes" )
		{
			for(i=0; i<Tree.AllNodes.length; i++)
			{
				Tree.AllNodes[i].Collapse();
			}			
		}
	}
}

/*  Toolbar handlers  */

function searchboxclick()
{
	var id = document.getElementById("AdminToolbar_i3_searchTerm");
	if ( !id )
		return;
	if ( id.value == "Search" )
	{
		id.value = "";
		id.className = "searchFocus";
	}
}
function searchboxleave()
{
	var id = document.getElementById("AdminToolbar_i3_searchTerm");
	if ( !id )
		return;
	if ( id.value == "" || id.value == "Search" )
	{
		id.value = "Search";
		id.className = "searchBlur";
	}
	else
	{
		id.className = "searchFocus";
	}
}

function searchboxkeyup(e)
{
    var code;
    if (e.keyCode) {
        code = e.keyCode;
    } else if (e.which) {
        code = e.which;
    }

    if (code == 27) {
        var sb = $find('AdminToolbar').findItemByValue("search");
		sb.value = "";
		sb.blur();
	}
}

function searchboxedit(e)
{
	var code;
	if (e.keyCode) {
	    code = e.keyCode;
	} else if (e.which) {
	    code = e.which;
	}
	
	if (code == 27) {
	    $find('AdminToolbar').findItemByValue("searchTerm").blur();
	}
	if (code == 13) {
	    $find('AdminToolbar').findItemByValue("search").click();
		return false;
	}
	else
		return true;
}

/*  Tab selector  */

var lastTabId, lastTabPos, tabTotal, tabContainer;

function setupTab(container,first,pos,total)
{
	lastTabId = "";
	lastTabPos = 0;
	tabTotal = total;
	tabContainer = container;
	selectTab(first,pos);
}

function selectTab(newTabId,pos)
{
    var posCss, x;

    if (newTabId == lastTabId)
        return;

	if (lastTabId != "") {
	    $("#" + lastTabId).addClass("tabUnselected").removeClass("tabSelected");
		$("#page" + lastTabId).hide();
		//  grid support
		$('.gsel').removeClass('gsel').addClass('gnotsel');
    }

    lastTabId = newTabId;

    var c = findControl();
    if (c && c.TabChanging)
    	c.TabChanging();

	$("#" + newTabId).addClass("tabSelected").removeClass("tabUnselected");
	$("#page" + newTabId).show();

	x = $get(tabContainer + '_selectedTab');
	if (x)
	    x.value = pos;
		
    return false;
}

/*  Main  */

function atb_handler(sender, e)
{
	prepostEnableElements();
	if ( sender.CommandName == "Logout" )
	{
		window.document.location.href = "Logout.aspx";
		return false;
	}
	if ( sender.CommandName == "Search" )
	{
		var id = document.getElementById("AdminToolbar_searchTpl_ctl00_searchTerm");
		if ( (id.value == "Search" || id.value == "Rechercher") && id.className == "searchBlur" )
			return false;
		if ( id.value == "" )
		{
			id.blur();
			return false;
		}
	}
	return true;
}


/*  Tree  */

var lastTreeArgs = null;
var lastTreeCategory = "";
var lastTreeId = -1;


function findNodeByCategoryAndValueRecurse(nodes, category, id) {
    for (var i = 0; i < nodes.get_count(); i++) {
        var node = nodes.getNode(i);
        if (node.get_value() == id && categoryOf(node) == category)
            return node;
        if (node.get_nodes().get_count() > 0) {
            node = findNodeByCategoryAndValueRecurse(node.get_nodes(), category, id);
            if (node)
                return node;
        }
    }
    return null;
}

function findNodeByCategoryAndValue(category, id) {
    var t = $find('Tree');
    if (!t)
        return null;
    return findNodeByCategoryAndValueRecurse(t.get_nodes(), category, id);
}

function nodePopulating(sender, eventArgs) {
    var node = eventArgs.get_node();
    var context = eventArgs.get_context();
    context["Value"] = node.get_value();
    context["Category"] = categoryOf(node);
}

function nodePopulated(sender, eventArgs) {
	consoleEnterDebug("nodePopulated");
    
    if (lastTreeId > -1) {
        var node = eventArgs.get_node();
        if (node.get_value() == lastTreeId && categoryOf(node) == lastTreeCategory) {
            consoleLog("selecting node " + lastTreeCategory + " #" + lastTreeId);
            $find('Tree').set_enabled(true);
            node.select();
            lastTreeCategory = "";
            lastTreeId = -1;
        }
    }
    if (lastTreeId > -1) {
        var children = node.get_nodes();
        for (var i = 0; i < children.get_count(); i++) {
            var childNode = children.getNode(i);
            if (childNode.get_value() == lastTreeId && categoryOf(childNode) == lastTreeCategory) {
                consoleLog("selecting child node " + lastTreeCategory + " #" + lastTreeId);
                $find('Tree').set_enabled(true);
                childNode.select();
                lastTreeCategory = "";
                lastTreeId = -1;
                break;
            }
        }
    }
    consoleExitDebug("nodePopulated");
}

function categoryOf(node) {
    return node.get_category() == null ? node._attributes._data.Category : node.get_category()
}

function renameTreeNode(category, id, newName) {
    consoleEnterDebug("renameTreeNode(" + category + "," + id + "," + newName + ")");
    var node = findNodeByCategoryAndValue(category, id);
    if (!node) {
        consoleWarn("- node " + category + " #" + id + " is not on the tree; rename cannot be done.");
    }
    else {
    	$find('Tree').set_enabled(true);
    	// setting the internal property _text to an empty string is necessary
        // because of a bug with set_text().
        node._text = "";
        node.set_text(newName);
    }
    consoleExitDebug("renameTreeNode() done.");
}

function removeTreeNode(category, id) {
    consoleEnterDebug("removeTreeNode(" + category + "," + id + ")");
    var node = findNodeByCategoryAndValue(category, id);
    if (!node) {
        consoleWarn("- node " + category + " #" + id + " is not on the tree; remove cannot be done.");
        return;
    } else {
		$find('Tree').set_enabled(true);
		var rt = node.get_parent();
        if (rt) {
            rt.get_nodes().remove(node);
        }
    }
    consoleExitDebug();
}

function highlightTreeNode(category, id) {
    consoleEnterDebug("highlightTreeNode(" + category + "," + id + ")");
    var node = findNodeByCategoryAndValue(category, id);
    if (!node) {
        consoleWarn("- node " + category + " #" + id + " is not in the tree.");
    }
    else {
    	$find('Tree').set_enabled(true);
    	$find('Tree').unselectAllNodes();
        node.set_selected(true);
    }    
    consoleExitDebug();
}

function updateTreeBranch(category, id, selectCategory, selectId) {
    consoleEnterDebug("updateTreeBranch(" + category + "," + id + "," + selectCategory + "," + selectId + ")");
    var node = findNodeByCategoryAndValue(category, id);
    var show_children = false;
    if (!node) {
        consoleWarn("- node " + category + " #" + id + " is not in the tree.");
    }
    else if (node.get_expandMode() == 0) 
    {
        consoleLog("- node " + category + " #" + id + " is already expanded.");
        $find('Tree').set_enabled(true);
        show_children = true;
    }
    else {
		consoleLog("- node " + category + " #" + id + " is not expanded.");
		$find('Tree').set_enabled(true);
		$find('Tree').unselectAllNodes();
		node.select();
		if (selectCategory != category || selectId != id) {
			show_children = true;
		}
	}

	if (show_children) {
		consoleLog("- loading child nodes of " + category + " #" + id + " and selecting " + selectCategory + " #" + selectId + ".");
		lastTreeCategory = selectCategory ? selectCategory : category;
		lastTreeId = selectId ? selectId : id;
		node.set_expandMode(Telerik.Web.UI.TreeNodeExpandMode.WebService);
       	node.set_expanded(false);
       	node.get_nodes().clear();
       	//  This triggers a re-load of the tree items from the web service.
       	node.set_expanded(true);
	}
    consoleExitDebug("updateTreeBranch() done.");
}

function updateTreeNodeImageUrl(category, id, imageUrl) {
    consoleEnterDebug("updateTreeNodeImageUrl(" + category + "," + id + "," + imageUrl + ")");
    var node = findNodeByCategoryAndValue(category, id);
    if (!node) {
        consoleWarn("- node " + category + " #" + id + " is not in the tree.");
    }
    else {
    	$find('Tree').set_enabled(true);
    	node.set_imageUrl(imageUrl);
        node.set_disabledImageUrl(imageUrl);
        node.set_expandedImageUrl(imageUrl);
        node.set_selectedImageUrl(imageUrl);
        node.set_hoveredImageUrl(imageUrl);
        
    }
    consoleExitDebug();
}

/*  Tooltips  */

function closeActiveToolTip() {
    var tooltip = Telerik.Web.UI.RadToolTip.getCurrent();
    if (tooltip) {
        tooltip.hide();
        tooltip.remove_hide(hideToolTip);
    }
}
        
function hideToolTip(sender, args) {
    sender.dispose();
}

function showToolTip(category, id, text) {
    var nodeElem = findNodeByCategoryAndValue(category, id);
    if (!nodeElem)
        return;
    var node = nodeElem.get_textElement();

    var tooltipManager = $find("ttManager");
    if (!tooltipManager) 
        return;

    var tooltip = tooltipManager.getToolTipByElement(node);
    if (!tooltip)
        tooltip = tooltipManager.createToolTip(node);

    tooltip.remove_hide(hideToolTip);
    tooltip.set_text(text);
    tooltip.set_hideDelay(4000);
    tooltip.set_sticky(true);
    tooltip.show();
    tooltip.add_hide(hideToolTip);
}



if(typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

