
var __nonMSDOMBrowser_ = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);

var DundasTreeCB = {
    callBack  : function( result, context)
    {
        if ( result.indexOf("out:") == 0)
        {
            var node = context.node;
            var table = node.nodeContainer;
            var chunk = result.substring(4);            
            if ( chunk.length > 0 )
            {           
                if (__nonMSDOMBrowser_) {
                    var newDiv = document.createElement("div");
                    newDiv.innerHTML = chunk;
                    if ((typeof(table.nextSibling) == "undefined") || (table.nextSibling == null)) {
                        table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);
                    }
                    else {
                        table = table.nextSibling;
                        table.parentNode.insertBefore(newDiv.firstChild, table);
                    }
                }
                else {
                    table.insertAdjacentHTML("afterEnd", chunk);
                }
                node.expandImage.src = context.data.expanded;
            }
            else
            {
                node.expandImage.src = context.data.leaf;
                node.expandImage.style.width = "16px";
            }
            node.nodeLink.innerHTML = context.text;
            node.expandImage.onclick = null;
            var control = context.data.controlElement;
	        control.style.cursor = "auto";
            var input = DundasTree.getInputByName( "ExpandedNodes", control);
            input.value = input.value + "{" + node.getPath() + "};";
        }
    },

    createContext: function ( e, data)
    {
		 e = DundasTree.fixEvent(e);
		 var element = e.target;
		 var node = new DundasTreeNode( element);
		 var result = new Object();
		 result.node = node;
		 result.data = data;
		 result.element = element;
		 result.text = node.nodeLink.innerHTML;
		 node.nodeLink.innerHTML = node.nodeLink.innerHTML + "( Loading... )";
		 if ( !data.controlElement )
		 {
            data.controlElement = document.getElementById( data.control);
         }
		 data.controlElement.style.cursor = "wait";
		 return result;
    },

    error : function( result, context)
    {
	     var node = context.node;
         node.nodeLink.innerHTML = context.text;	     
	     context.data.controlElement.style.cursor = "auto";
         dundas_ShowErrorMessage( result);
    }
}

var DragDropCB = {

    callBack  : function( result, context)
    {
		// debugOut("ajax request complete success.");
        DragDropCB.hideMaskDiv();
        context.selects.enable();
		// debugOut("-selects and mask pocessed.");
        var s = result.substring( 1, result.length - 3)
        var items = s.split("!]].[");
        for( var itemPos = 0; itemPos < items.length; itemPos++)
        {
            var data = items[itemPos].split(":[!");
            if ( data.length == 2 )
            {
                if ( data[0].indexOf("bold:") == 0)
                {
                    var elementName = data[0].substring( 5);
                    var boldItems = data[1].split("||");
                    if ( DundasTree )
                    {
                        DundasTree.updateBoldItems( elementName, boldItems);
                    }
                }
                else if ( data[0] == "javascript")
                {
                    try
                    {
                        eval(data[1]);
                    }
                    catch(e){
                        alert( e.message);
                    }    
                }
                else 
                {
                    var element = document.getElementById( data[0]);
                    if ( element && data[1].length > 0) 
                    {
		                // debugOut("- proceed tag: " + element.tagName + "(" + element.id + ")");
                        if ( element.tagName == "TABLE")
                        {
                            DragDropCB.processTable( element, data[1]);
                        }
                        else if ( element.tagName == "IMG")
                        {
                            DragDropCB.processChart( element, data[1]);
                        }
                        else if ( element.tagName == "DIV")
                        {
                            DragDropCB.processDiv( element, data[1]);
                        }
                        else if ( element.tagName == "SELECT")
                        {
                            DragDropCB.processSelect( element, data[1]);
                        }
                    }
                }
            }
            else
            {
                // debugOut("- data is corrupted: " + items[itemPos]);
            }
        }
    },
 
    processSelect : function ( element, chunk)
    {
        if ( chunk.toLowerCase().indexOf("<option") != -1)
        {
          element.innerHTML = data[1];
        }
        else 
        {
          element.length = 0;
          
          var ops = chunk.split("~~");
          var selectedIndex = -1;
          for( var opsi = 0; opsi < ops.length; opsi ++)
          {
              var xsrt = ops[opsi].split("//");
              if ( xsrt.length == 3)
              {
                  var oOption = document.createElement("OPTION");
                  oOption.value = xsrt[0];
                  oOption.innerHTML  = xsrt[1];
                  if ( xsrt[2] == "true" )
                  {
                        oOption.selected  = true;
                        selectedIndex = opsi;
                  }
                  element.appendChild( oOption);
              }
          }
          element.selectedIndex = selectedIndex;
        }
    },

    processDiv :  function ( element, chunk)
    {
        var newDiv = document.createElement("div");
        newDiv.innerHTML = chunk;
        if ( newDiv.firstChild )
        {
            element.innerHTML = newDiv.firstChild.innerHTML;
        }
    },
       
    processChart :  function ( element, chunk)
    {
        var newDiv = document.createElement("div");
        newDiv.innerHTML = chunk;
        var img = newDiv.getElementsByTagName("IMG");
        if ( img )
        {
            img = img[0];
            element.src = img.src;
        }
        var map = newDiv.getElementsByTagName("MAP");
        if ( map && map.length > 0 )
        {
            map = map[0];
            element = document.getElementById(map.id);
            element.innerHTML = map.innerHTML;
        }
        
    },
    
    processTable :  function ( element, chunk)
    {
        var newDiv = document.createElement("div");
        newDiv.innerHTML = chunk;

        var srcElement = null;
        var elArr = newDiv.getElementsByTagName("TABLE");
        for( var arrPos = 0; arrPos < elArr.length; arrPos++)
        {
            if ( elArr[arrPos].id && elArr[arrPos].id == element.id )
            {
                srcElement = elArr[arrPos];
            }
        }
        if ( srcElement )
        {
            var rowCount = element.rows.length;
            for( var rowIndex = 0; rowIndex < rowCount; rowIndex++)
            {
                try
                {
                    element.deleteRow(0);
                }
                catch(e) {}
            }

            var tbody = element;
            var tbodies = element.getElementsByTagName("TBODY");
            
            if ( tbodies.length > 0 )
            {
                tbody = tbodies[0];
            }
            
            var tbodySrc = srcElement;
            var tbodiesSrc = srcElement.getElementsByTagName("TBODY");
            
            if ( tbodiesSrc.length > 0 )
            {
                tbodySrc = tbodiesSrc[0];
            }
            
            for( var i = 0; i < tbodySrc.childNodes.length; i++)
            {
                tbody.appendChild( tbodySrc.childNodes[i].cloneNode( true));
            }
        }
    },

    showMaskDiv : function ()
    {
        var mask = document.getElementById("dsCallbackMask");
        if ( mask )
        {
		    mask.style.cursor = "wait";
		    var fullHeight = DundasLib.getScreenHeight();
		    var fullWidth = DundasLib.getScreenWidth();

		    var scTop = parseInt(document.body.scrollTop,10);
		    var scLeft = parseInt(document.body.scrollLeft,10);

		    mask.style.height = fullHeight + "px";
		    mask.style.width = fullWidth + "px";
		    mask.style.top = scTop + "px";
		    mask.style.left = scLeft + "px";
	        mask.style.display = "block";
        }
		return mask;
    },
    
    hideMaskDiv : function ()
    {
        var mask = document.getElementById("dsCallbackMask");
        if ( mask )
        {
		    mask.style.cursor = "default";
	        mask.style.display = "none";
		    mask.style.height = "0px";
		    mask.style.width = "0px";
		    mask.style.top = "0px";
		    mask.style.left = "0px";
        }
		return mask;
    },
            
    context: function ()
    {
		 var result = new Object();
		 DragDropCB.showMaskDiv();
		 result.selects = new Dundas_DisableSelects();
		 result.selects.disable();
		 return result;
    },

    error : function( result, context)
    {
        DragDropCB.hideMaskDiv();
        context.selects.enable();
        dundas_ShowErrorMessage( result);
    }
}

function dundas_ShowErrorMessage( message)
{
    if ( message.indexOf( "session has expired") != -1) 
     {
        alert(message);
        document.location.replace( document.location.href);
     }
     else
     {
        alert(message);
     }        
}

function Dundas_DisableSelects()
{
    this.msieFlag = window.navigator.userAgent.indexOf("MSIE") > -1;
    this.selects = new Array();
    this.disable = function ()
    {
        if ( this.msieFlag )
        {
            var elements = document.body.getElementsByTagName("SELECT");
		    for(var i = 0; i < elements.length; i++) {
			    var elm = elements[i];
			    if ( !elm.disabled )
			    {
				    try
				    {
				        this.selects[this.selects.length] = elm;
				        elm.blur();
				        elm.disabled = true;
				    } 
				    catch(exc) {;}
			    }
		    }
        }
    }
    
    this.enable = function ()
    {
        if ( this.msieFlag )
        {
		    for(var i = 0; i < this.selects.length; i++) {
			    try
			    {
			        this.selects[i].disabled=false;
			    }
			    catch(exc) {;};
		    }
        }
    }
}