﻿// #########################################################################################################################
// #########################################################################################################################
// **************************                           Control Class                               ************************
// #########################################################################################################################
// #########################################################################################################################
function Control(id,isLabel)
{
    this.ClientID = id;
    this.IsLabel  = (isLabel != null)? isLabel: false;
    this.OriginalCSS = "";

    this.SetVisible = function(turnOn)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.style.display = (turnOn)? "inline": "none";
    }
    
    this.SetValue = function(val)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            if(this.IsLabel)
                ctrl.innerHTML = val;
            else
            {
                ctrl.value = val;
                if(ctrl.tagName.toLowerCase() == "table")
                {
                    var ctrlTxt = document.getElementById(this.ClientID+"_input")
                    if(ctrlTxt != null)
                        ctrlTxt.value = val;
                }
            }
    }
    
    this.SetImageSource = function(imgSource)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.src = imgSource;
    }

    this.GetValue = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (this.IsLabel)? ctrl.innerHTML: ctrl.value;
    }
    
    this.GetText = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            if(this.IsLabel)
                return ctrl.innerHTML;
            else
                return (ctrl.selectedIndex >= 0)? ctrl.options[ctrl.selectedIndex].text: "";
    }
    
    this.GetIndex = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (this.IsLabel)? -1: ctrl.selectedIndex;
    }
    
    this.GetItem = function(index)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (this.IsLabel)? null: ctrl.options[index];
    }
    
    this.GetItemByValue = function(val)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            for(i=0;i<ctrl.options.length;i++)
                if(ctrl.options[i].value == val)
                    return ctrl.options[i];
                    
        return null;
    }

    this.SetSelectedIndexByValue = function(val)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            for(i=0;i<ctrl.options.length;i++)
                if(ctrl.options[i].value == val)
                    ctrl.selectedIndex = i;
    }
    
    this.GetCount = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (this.IsLabel)? 0: ctrl.options.length;
    }
    
    this.GetSelectedItemsCount = function()
    {
        var count = 0;
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
        {
            for (i = ctrl.options.length - 1; i >= 0 ; i--)
		    {
		        var item = ctrl.options[i];
			    if (item.selected) count++;      
			}
        }
        return count;
    }
    
    this.AddItem = function(txt,val)
    {
        var ctrl = document.getElementById(this.ClientID);
        
        if(ctrl != null)
        {
            var newItem = document.createElement("option");
            newItem.text  = txt;
            newItem.value = val;
            ctrl.options.add(newItem);
            return newItem;
        }
    }
    
    this.RemoveItem = function(itemValue)
	{	
		var ctrl = document.getElementById(this.ClientID);
		if(ctrl != null)
        {
		    for (i = ctrl.options.length - 1; i >= 0 ; i--)
		    {
		        var item = ctrl.options[i];
			    if (item.value == itemValue)
			    {
				    ctrl.remove(i);
				    break;					
		        }
		    }
	    }		    
	}
    
    this.RemoveSelectedItem = function()
    {
        var ctrl = document.getElementById(this.ClientID);

        if(ctrl != null)
        {
            for(i=ctrl.options.length-1;i>=0;i--)
            {
                if(ctrl.options[i].selected)
                ctrl.remove(i);
            }
        }         
    }    
    
    this.ClearItems = function(withFirst)
    {
        var ctrl = document.getElementById(this.ClientID);
        
        if(ctrl != null)
        {
            for(i=ctrl.options.length-1;i>=0;i--)
                if(i == 0)
                {
                    if(withFirst == null || withFirst == true)
                        ctrl.remove(i);
                }
                else
                    ctrl.remove(i);
        }         
    }
    
    this.SetSelectedIndex = function(i)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            if(ctrl.options[i] != null)
                ctrl.selectedIndex = i;
    }
    
    this.SelectTopIndex = function(i)
    {
        this.SetSelectedIndex(0);
    }
    
    this.AppendItem = function(item)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null && !this.Contains(item))
            ctrl.appendChild(item);
    }
    
    this.Contains = function(item)
    {
        var ctrl = document.getElementById(this.ClientID);
        var found = false;
        // Loop over all the items in the list box and check if the text and value of this item exist
        for(i = ctrl.options.length-1; i >= 0; i--)
            if(ctrl.options[i].value == item.value && ctrl.options[i].text == item.text)
                return true;
        return found;
    }
    
    // Elie added to return the content of a list box using | as delimiter
    this.GetValuesItems = function()
    {   
        var ctrl = document.getElementById(this.ClientID);
        var strSelectedValues = "";
        
        if(ctrl != null)
            for(i = ctrl.options.length-1;i >= 0;i--)
               strSelectedValues += ctrl.options[i].value + "|";

        return strSelectedValues;     
    }
    
    // Layale added this function to be used in the Role form in order to get the selected items in a list box
    this.GetSelectedItemsValues = function()
    {   
        var ctrl = document.getElementById(this.ClientID);
        var strSelectedValues = "";
        
        if(ctrl != null)
            for(i = ctrl.options.length-1;i >= 0;i--)
                if(ctrl.options[i].selected)
                    strSelectedValues += ctrl.options[i].value + "|";

        return strSelectedValues;     
    }
    
    this.UnSelectSelectedItems = function()
    {
        var ctrl = document.getElementById(this.ClientID);

        if(ctrl != null)
        {
            for(i=ctrl.options.length-1;i>=0;i--)
            {
                if(ctrl.options[i].selected)
                    ctrl.options[i].selected = false;
            }
        }         
    }    
    
    this.GetRolesValuesItems = function()
    {   
        var ctrl = document.getElementById(this.ClientID);
        var strSelectedValues = "";
        
        if(ctrl != null)
            for(i=ctrl.options.length-1;i>=0;i--)
               strSelectedValues += ctrl.options[i].value.split("_")[0] + "|";

        return strSelectedValues;     
    }
    
    // This function will get the text and the value of the selected items in a certain list box, the items will be separated by | and _ between the value and the text
    this.GetValuesTextItems = function()
    {   
        var ctrl = document.getElementById(this.ClientID);
        var strSelectedValues = "";
        
        if(ctrl != null)
            for(i=ctrl.options.length-1;i>=0;i--)
               strSelectedValues += ctrl.options[i].value + "_" + ctrl.options[i].text + "|";

        return strSelectedValues;     
    }
    
    // Layale added to return the content of a list box using ; as delimiter
    this.GetTextItems = function()
    {   
        var ctrl = document.getElementById(this.ClientID);
        var strSelectedValues = "";
        
        if(ctrl != null)
            for(i = ctrl.options.length-1;i >= 0;i--)
               strSelectedValues += ctrl.options[i].text + "; ";

        return strSelectedValues;     
    }    
    
    this.IsEmpty = function()
    {
        if(this.GetValue() == "" || this.GetValue() == null)
            return true;
        else
            return false;
    }
    
    this.Focus = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.focus();
    }
    
    this.SetClass = function(cName)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
        {
            if(this.OriginalCSS == "")
                this.OriginalCSS = ctrl.className;
            
            if(cName == "" && this.OriginalCSS == "")           
                ctrl.className = ctrl.className;
            else if(this.OriginalCSS != "" && cName == "")
                ctrl.className = this.OriginalCSS;
            else
                ctrl.className = cName;
        }
    }
    
    this.SetEnabled = function(turnOn)
    {
        var ctrl = document.getElementById(this.ClientID);
            if(ctrl != null)
                ctrl.disabled = (turnOn)? false: true;
    }
    
    this.ToggleSave = function(isSaving)
    {
        if(!this.IsLabel)
        {
            var ctrl = document.getElementById(this.ClientID);
            
            if(ctrl != null)
            {
                if(isSaving)
                {
                    this.SetValue("Saving...");
                    this.SetEnabled(false);
                }
                else
                {
                    this.SetValue("Save");
                    this.SetEnabled(true);
                }
            }
        }
    }
    
    this.SetChecked = function(turnOn)
    {
        var ctrl = document.getElementById(this.ClientID);
        
        if(ctrl != null)
            ctrl.checked = turnOn;
    }
    
    this.GetChecked = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        
        if(ctrl != null)
            return ctrl.checked;
    }
    
    this.IsVisible = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (ctrl.style.display == "inline")? true: false;
    }
    
    this.IsHidden = function()
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            return (ctrl.style.display == "none")? true: false;
    }
    
    this.SetBackground = function(img)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.background = img;
    }
    
    this.SetWidth = function(w)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.style.width = w;
    }
    
    this.SetBottomPadding = function(p)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.style.paddingBottom = p;
    }
    
    this.SetHeight = function(h)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.style.height = h;
    }
    
    this.SetOpacity = function(op)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
        {
            ctrl.style.MozOpacity = op/100;
            ctrl.style.opacity = op/100;
            ctrl.style.filter = "alpha(opacity="+op+")";
        }
    }
    
    this.SetInnerHTML = function(str)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.innerHTML = str;
    }
    
    this.SetOuterHTML = function(str)
    {
        var ctrl = document.getElementById(this.ClientID);
        if(ctrl != null)
            ctrl.outerHTML = str;
    }
    
    this.isInteger = function()
    {
      var val = document.getElementById(this.ClientID).value;
      if(val==null)
        {
            return false;
        }
      if (val.length==0)
        {
            return false;
        }
      for (var i = 0; i < val.length; i++) {
            var ch = val.charAt(i)
            if (i == 0 && ch == "-") {
            continue
            }
      if (ch < "0" || ch > "9") {
            return false
      }
    }
    return true
    }
   
}



// #########################################################################################################################
// #########################################################################################################################
// ************************                           Cookie Functions                               ***********************
// #########################################################################################################################
// #########################################################################################################################
    function SetCookie(cookieName,value,expiredays)
    {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        var exp = ((expiredays == null)? "": ";expires=" + exdate.toGMTString());
        document.cookie = cookieName + "=" + escape(value) + exp;
    }
    
    
    function GetCookie(cookieName)
    {
        if (document.cookie.length > 0)
        {
           cStart = document.cookie.indexOf(cookieName + "=");
           
           if (cStart != -1)
           { 
             cStart = cStart + cookieName.length + 1; 
             cEnd = document.cookie.indexOf(";", cStart);
            
             if (cEnd == -1) 
                cEnd = document.cookie.length;
                
             return unescape(document.cookie.substring(cStart,cEnd));
           } 
        }
        
        return "";
    }
    
    
    function DeleteCookie(cookieName)
    {
        var currDate = new Date();
        currDate.setTime(currDate.getTime() - 1);
        document.cookie = cookieName += "=; expires=" + currDate.toGMTString();
    }

// #########################################################################################################################
// #########################################################################################################################
// ****************************                       Color Fading Functions                      **************************
// #########################################################################################################################
// #########################################################################################################################
function colorFade(id,element,start,end,steps,speed) 
{
  var startrgb,endrgb,er,eg,eb,step,rint,gint,bint,step;
  var target = document.getElementById(id);
  steps = steps || 20;
  speed = speed || 20;
  clearInterval(target.timer);
  endrgb = colorConv(end);
  er = endrgb[0];
  eg = endrgb[1];
  eb = endrgb[2];

  startrgb = colorConv(start);
  r = startrgb[0];
  g = startrgb[1];
  b = startrgb[2];
  target.r = r;
  target.g = g;
  target.b = b;

  rint = Math.round(Math.abs(target.r-er)/steps);
  gint = Math.round(Math.abs(target.g-eg)/steps);
  bint = Math.round(Math.abs(target.b-eb)/steps);
  if(rint == 0) { rint = 1 }
  if(gint == 0) { gint = 1 }
  if(bint == 0) { bint = 1 }
  target.step = 1;
  target.timer = setInterval( function() { animateColor(id,element,steps,er,eg,eb,rint,gint,bint) }, speed);
}

// incrementally close the gap between the two colors //
function animateColor(id,element,steps,er,eg,eb,rint,gint,bint) {
  var target = document.getElementById(id);
  var color;
  if(target.step <= steps) {
    var r = target.r;
    var g = target.g;
    var b = target.b;
    if(r >= er) {
      r = r - rint;
    } else {
      r = parseInt(r) + parseInt(rint);
    }
    if(g >= eg) {
      g = g - gint;
    } else {
      g = parseInt(g) + parseInt(gint);
    }
    if(b >= eb) {
      b = b - bint;
    } else {
      b = parseInt(b) + parseInt(bint);
    }
    color = 'rgb(' + r + ',' + g + ',' + b + ')';
    if(element == 'background') {
      target.style.backgroundColor = color;
    } else if(element == 'border') {
      target.style.borderColor = color;
    } else {
      target.style.color = color;
    }
    target.r = r;
    target.g = g;
    target.b = b;
    target.step = target.step + 1;
  } else {
    clearInterval(target.timer);
    color = 'rgb(' + er + ',' + eg + ',' + eb + ')';
    if(element == 'background') {
      target.style.backgroundColor = color;
    } else if(element == 'border') {
      target.style.borderColor = color;
    } else {
      target.style.color = color;
    }
  }
}

// convert the color to rgb from hex //
function colorConv(color) {
  var rgb = [parseInt(color.substring(0,2),16), 
    parseInt(color.substring(2,4),16), 
    parseInt(color.substring(4,6),16)];
  return rgb;
}



// #########################################################################################################################
// #########################################################################################################################
// ******************************                       Other Functions                      *******************************
// #########################################################################################################################
// #########################################################################################################################
function getDataProxy(dt)
{
	return dt.value;
}

function DelayRedirect(url,time)
{
    setTimeout("window.location = '"+url+"'",time);
}

var Url = {

	// public method for url encoding
	encode : function (string) {
		return escape(this._utf8_encode(string));
	},

	// public method for url decoding
	decode : function (string) {
		return this._utf8_decode(unescape(string));
	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return string;
	}
}

function getURLParameters() //Returns in a string the parameters of the page as a string to be added to the URL
{
	var sURL = window.document.URL.toString();
	
	if (sURL.indexOf("?") > 0)
	{
	    var strParams = "?";
		var arrParams = sURL.split("?");
			
		var arrURLParams = arrParams[1].split("&");
		
		var arrParamNames = new Array(arrURLParams.length);
		var arrParamValues = new Array(arrURLParams.length);
		
		var i = 0;
		for (i=0;i<arrURLParams.length;i++)
		{
			var sParam =  arrURLParams[i].split("=");
			arrParamNames[i] = sParam[0];
			if (sParam[1] != "")
				arrParamValues[i] = unescape(sParam[1]);
			else
				arrParamValues[i] = "No Value";
		}
		
		for (i=0;i<arrURLParams.length;i++)
		{
			//alert(arrParamNames[i]+" = "+ arrParamValues[i]);
			strParams = strParams + arrParamNames[i]+"="+ arrParamValues[i];
			if (i < arrURLParams.length - 1)
			{
			    strParams = strParams +"&";
			}
		}
		//alert(strParams);
		return strParams;
	}
	else
	{
		//alert("No parameters.");
		return "";
	}
}

var isIE = document.all?true:false; 
var isNS = document.layers?true:false;

function onlyDigits(e) 
{  
	var _ret = true; 
	if (isIE) 
	{ 
		if (window.event.keyCode < 48 || window.event.keyCode > 57) 
		{ 
			window.event.keyCode = 0; 
			_ret = false; 
		} 
	} 

	if (isNS) 
	{ 
		if (e.which < 48 || e.which > 57) 
		{ 
			e.which = 0; 
			_ret = false; 
		} 
	} 
	return (_ret); 
}

function onlyStr(e) {

    var _ret = true;
    if (isIE) {
        if (window.event.keyCode < 65 || (window.event.keyCode > 90 && window.event.keyCode < 97) || window.event.keyCode > 122) {
            window.event.keyCode = 0;
            _ret = false;
        }
    }

    if (isNS) {
        if (e.which < 65 || (e.which > 90 && e.which < 97) || e.which > 122) {
            e.which = 0;
            _ret = false;
        }
    }
    return (_ret); 
}

function onlyDecimals(e) 
{ 
	var _ret = true; 
	if (isIE) 
	{ 
		if (window.event.keyCode < 46 || window.event.keyCode > 57 || window.event.keyCode==47) 
		{ 
			window.event.keyCode = 0; 
			_ret = false; 

		} 
		var splitDot = e.value.split('.');
		if (splitDot.length == 2 && window.event.keyCode==46)
		{
			window.event.keyCode = 0; 
			_ret = false; 
		}		
	} 

	if (isNS) 
	{ 
		if (e.which < 46 || e.which > 57 || e.which==47) 
		{ 
			e.which = 0; 
			_ret = false; 
		}
		var splitDot = e.value.split('.');
		if (splitDot.length == 2 && window.event.keyCode==46)
		{
			e.which = 0; 
			_ret = false; 
		}
	} 
	return (_ret); 
}

// #########################################################################################################################
// #########################################################################################################################
// ***************************                       Infragistics Tree Functions             *******************************
// #########################################################################################################################
// #########################################################################################################################

// This recursive function is used to generate the correct path to the selected node representative of the file's real physical path in the directory. 
function tracePath(n)
{
    // Build the path of the selected node by looping through its parents all the way to the root node...
    if(n.getParent() != null)
    {
	    // The detailed path that is going to be saved in a hidden field is used in order
	    // to tell which folders are new ones (don't have a data key value).
	    arrNode = n.getDataKey();
	    if (arrNode == null)
	    {
		    // Set the id of the folder to null since it's a new folder.
		    detailedPath = "\\" + n.getText() + "*null" + detailedPath;
	    }
	    else
	    {
		    // Set the id of the folder from the data key of the selected node.
		    arrNode = arrNode.split(',');
		    detailedPath = "\\" + n.getText() + "*" + arrNode[1] + detailedPath;
	    }
	    path = n.getParent().getText() + "\\" + path;
	    tracePath(n.getParent());
    }
    else
    {
	    // Generate full path from tree
	    detailedPath = n.getText() + detailedPath;
    }
    return path;
}

// This function is used to add a new node to the tree, in other terms to add a new folder created by the user.
function AddNode(tree, FormObject) 
{
	// Get the selected node.
	var node = tree.getSelectedNode();

	// Get datakey of selected node
	if (node)
	{
	    // Adding a new folder under a user created folder. It has a data key null since it's not yet saved into the database.
	    node.addChild("New Folder");
	    
	    // Call the function that will add the node server side
	    AddServerNode("-1", node.getTag(), "New Folder");
	}
	else
	{					
		// The folder is added by default under the root path when the user press on the add button without selecting any node.
		var nodes = tree.getNodes();
		if(nodes != null)
		{
			if(nodes[0] != null)
			{
				nodes[0].addChild("New Folder");
	            // Call the function that will add the node server side
	            AddServerNode("-1", nodes[0].getTag(), "New Folder");
				
				FormObject.Message.Success("Your folder is added below the root path!");
				
				return;
			}	
			else
			{
				FormObject.Message.Fail("You should select a node to create the folder under!");
				return;
			}
		}				
	}
}
	
// This function is used to delete a certain folder. Some restrictions were added
// where the user can't delete a view, nor the root folder/
function RemoveNode(tree, FormObject) 
{
	var nodes = tree.getNodes();
	var node = tree.getSelectedNode();
	if(node)
	{
		if (node == nodes[0])
			FormObject.Message.Fail("You can not delete the root folder!");
		else
		{
			nodeTag = node.getTag();
			if (nodeTag == null)
			{
				if(confirm("Are you sure you want to delete this folder?"))
				{
					node.remove();
					
	                // Call the function that will delete the node server side
	                DeleteNode(nodeTag);
			    }
		    }
			else
			{
				if (node.getChildNodes().length > 0)
					FormObject.Message.Fail("Selected folder has sub-folders, you can not delete it!");
				else
				{
					nodeTag = node.getTag();
					if (nodeTag != null)
					{
					    if (confirm("Are you sure you want to delete this Folder?"))
					    {
					    	node.remove();
					        
	                        // Call the function that will delete the node server side
	                        DeleteNode(nodeTag, node);
					    }
					}
				}
			}
		}
	}
	else
		FormObject.Message.Fail("You should select a folder to delete!");
}
	
// This function is used to rename a selected folder. The user can only rename the folders he just created in the same session.
function RenameNode(tree, FormObject)
{
	var nodes = tree.getNodes();	

	if (selectedNode) 
	{
		// The user can not rename the root folder.
		if (selectedNode == nodes[0])
			FormObject.Message.Fail("You can not rename the root folder!");
		else
		{
			arrNode = selectedNode.getDataKey();
			if (arrNode != null)
			{					
				arrNode = arrNode.split(',');
				var queryId = arrNode[2];
				var itemId = arrNode[1];
				// check if the user is trying to rename a folder created by him
				if (queryId == "")
					igtree_beginedit(treeId1, nodeId1);	
				else
				{
					if (arrNode[3] == "False")
						FormObject.Message.Fail("You can not rename a view from this form!");
					else if (arrNode[3] == "True" && arrNode[4] == "IsParent=1")
						FormObject.Message.Fail("You can not Modify the Default Folder!");					
				}
			}
			else
				igtree_beginedit(treeId1, nodeId1);
		}
	}
	// No folders were selected.
	else
		FormObject.Message.Fail("You should select a folder to rename!");
}		

// #########################################################################################################################
// #########################################################################################################################
// ***************************                       Security Functions                      *******************************
// #########################################################################################################################
// #########################################################################################################################

/* rijndael.js      Rijndael Reference Implementation
   Copyright (c) 2001 Fritz Schneider

 This software is provided as-is, without express or implied warranty.
 Permission to use, copy, modify, distribute or sell this software, with or
 without fee, for any purpose and by any individual or organization, is hereby
 granted, provided that the above copyright notice and this paragraph appear
 in all copies. Distribution as a part of an application or binary must
 include the above copyright notice in the documentation and/or other materials
 provided with the application or distribution.

 Note that the following code is a compressed version of Fritz's code
 and is only about one third the size of his original
 compressed version courtesy of Stephen Chapman http://javascript.about.com/
 
 For a sample of code usage: http://javascript.about.com/library/blencrypt.htm
 
 */

var BS=128;var BB=128;var RA=[,,,,[,,,,10,,12,,14],,[,,,,12,,12,,14],,[,,,,14,,14,,14]];var SO=[,,,,[,1,2,3],,[,1,2,3],,[,1,3,4]];var RC=[0x01,0x02,0x04, 0x08,0x10,0x20,0x40,0x80,0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4,0xb3,0x7d,0xfa,0xef,0xc5,0x91];var SB=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];var SBI=[82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125];function cSL(TA,PO){var T=TA.slice(0,PO);TA=TA.slice(PO).concat(T);return TA;}var Nk=BS/32;var Nb=BB/32;var Nr=RA[Nk][Nb];function XT(P){P<<=1;return((P&0x100)?(P^0x11B):(P));}function GF(x,y){var B,R=0;for(B=1;B<256;B*=2,y=XT(y)){if(x&B)R^=y;}return R;}function bS(SE,DR){var S;if(DR=="e")S=SB;else S=SBI;for(var i=0;i<4;i++)for(var j=0;j<Nb;j++)SE[i][j]=S[SE[i][j]];}function sR(SE,DR){for(var i=1;i<4;i++)if(DR=="e")SE[i]=cSL(SE[i],SO[Nb][i]);else SE[i]=cSL(SE[i],Nb-SO[Nb][i]);}function mC(SE,DR){var b=[];for(var j=0;j<Nb;j++){for(var i=0;i<4;i++){if(DR=="e")b[i]=GF(SE[i][j],2)^GF(SE[(i+1)%4][j],3)^SE[(i+2)%4][j]^SE[(i+3)%4][j];else b[i]=GF(SE[i][j],0xE)^GF(SE[(i+1)%4][j],0xB)^GF(SE[(i+2)%4][j],0xD)^GF(SE[(i+3)%4][j],9);}for(var i=0;i<4;i++)SE[i][j]=b[i];}}function aRK(SE,RK){for(var j=0;j<Nb;j++){SE[0][j]^=(RK[j]&0xFF);SE[1][j]^=((RK[j]>>8)&0xFF);SE[2][j]^=((RK[j]>>16)&0xFF);SE[3][j]^=((RK[j]>>24) & 0xFF);}}function YE(Y){var EY=[];var T;Nk=BS/32;Nb=BB/32;Nr=RA[Nk][Nb];for(var j=0;j<Nk;j++)EY[j]=(Y[4*j])|(Y[4*j+1]<<8)|(Y[4*j+2]<<16)|(Y[4*j+3]<<24);for(j=Nk;j<Nb*(Nr+1);j++){T=EY[j-1];if(j%Nk==0)T=((SB[(T>>8)&0xFF])|(SB[(T>>16)&0xFF]<<8)|(SB[(T>>24)&0xFF]<<16)|(SB[T&0xFF]<<24))^RC[Math.floor(j/Nk)-1];else if(Nk>6&&j%Nk==4)T=(SB[(T>>24)&0xFF]<<24)|(SB[(T>>16)&0xFF]<<16)|(SB[(T>>8)&0xFF]<<8)|(SB[T&0xFF]);EY[j]=EY[j-Nk]^T;}return EY;}function Rd(SE,RK){bS(SE,"e");sR(SE,"e");mC(SE,"e");aRK(SE,RK);}function iRd(SE,RK){aRK(SE,RK);mC(SE,"d");sR(SE,"d");bS(SE, "d");}function FRd(SE,RK){bS(SE,"e");sR(SE,"e");aRK(SE,RK);}function iFRd(SE,RK){aRK(SE,RK);sR(SE,"d");bS(SE,"d");}function encrypt(bk,EY){var i;if(!bk||bk.length*8!=BB)return;if(!EY)return;bk=pB(bk);aRK(bk,EY);for(i=1;i<Nr;i++)Rd(bk,EY.slice(Nb*i,Nb*(i+1)));FRd(bk,EY.slice(Nb*Nr));return uPB(bk);}function decrypt(bk,EY){var i;if(!bk||bk.length*8!=BB)return;if(!EY)return;bk=pB(bk);iFRd(bk,EY.slice(Nb*Nr));for(i=Nr-1;i>0;i--)iRd(bk,EY.slice(Nb*i,Nb*(i+1)));aRK(bk,EY);return uPB(bk);}function byteArrayToString(bA){var R="";for(var i=0;i<bA.length; i++)if(bA[i]!=0)R+=String.fromCharCode(bA[i]);return R;}function byteArrayToHex(bA){var R="";if(!bA)return;for(var i=0;i<bA.length;i++)R+=((bA[i]<16)?"0":"")+bA[i].toString(16);return R;}function hexToByteArray(hS){var bA=[];if(hS.length%2)return;if(hS.indexOf("0x")==0||hS.indexOf("0X")==0)hS = hS.substring(2);for (var i=0;i<hS.length;i+=2)bA[Math.floor(i/2)]=parseInt(hS.slice(i,i+2),16);return bA;}function pB(OT){var SE = [];if(!OT||OT.length%4)return;SE[0]=[];SE[1]=[];SE[2]=[];SE[3]=[];for(var j=0;j<OT.length;j+=4){SE[0][j/4]=OT[j];SE[1][j/4]=OT[j+1];SE[2][j/4]=OT[j+2];SE[3][j/4]=OT[j+3];}return SE;}function uPB(PK){var R=[];for(var j=0;j<PK[0].length;j++){R[R.length]=PK[0][j];R[R.length]=PK[1][j];R[R.length]=PK[2][j];R[R.length]=PK[3][j];}return R;}function fPT(PT){var bpb=BB/8;var i;if(typeof PT=="string"||PT.indexOf){PT=PT.split("");for(i=0;i<PT.length;i++)PT[i]=PT[i].charCodeAt(0)&0xFF;}for(i=bpb-(PT.length%bpb);i>0&&i<bpb;i--) PT[PT.length]=0;return PT;}function gRB(hM){var i;var bt=[];for(i=0;i<hM;i++)bt[i]=Math.round(Math.random()*255);return bt;}function rijndaelEncrypt(PT,Y,M){var EY,i,abk;var bpb=BB/8;var ct;if(!PT||!Y)return;if(Y.length*8!=BS)return;if(M=="CBC")ct=gRB(bpb);else {M="ECB";ct=[];}PT=fPT(PT);EY=YE(Y);for (var bk=0; bk<PT.length/bpb;bk++){abk=PT.slice(bk*bpb,(bk+1)*bpb);if(M=="CBC")for (var i=0;i<bpb; i++)abk[i] ^= ct[bk*bpb+i];ct=ct.concat(encrypt(abk,EY));}return ct;}function rijndaelDecrypt(CT,Y,M){var EY;var bpb=BB/8;var pt=[];var abk;var bk;if(!CT||!Y||typeof CT=="string")return;if(Y.length*8!=BS)return;if(!M)M="ECB";EY=YE(Y);for(bk=(CT.length/bpb)-1;bk>0;bk--){abk=decrypt(CT.slice(bk*bpb,(bk+1)*bpb),EY);if(M=="CBC")for(vari=0;i<bpb;i++)pt[(bk-1)*bpb+i]=abk[i]^CT[(bk-1)*bpb+i];else pt=abk.concat(pt);}if(M=="ECB");pt=decrypt(CT.slice(0,bpb),EY).concat(pt);return pt;}function stringToByteArray(st){var bA=[];for(var i=0;i<st.length; i++)bA[i]=st.charCodeAt(i);return bA;}function genkey(){var j="";while(1){var i=Math.random().toString();j+=i.substring(i.lastIndexOf(".")+1);if(j.length>31)return j.substring(0, 32);}}

// #########################################################################################################################
// #########################################################################################################################
// ***************************                       Grid View Functions                      *******************************
// #########################################################################################################################
// #########################################################################################################################
//variable that will store the id of the last clicked row
function ChangeRowColor(row,previousRows)
{
    try
    {    
        if (previousRows[0] == row)
        {
            document.getElementById(row).className = "GridSelectedRow";  
            return;
            }
        else if (previousRows[0] != null)
             if(document.getElementById(previousRows[0])!=null)
                document.getElementById(previousRows[0]).className = previousRows[1];
            
        previousRows[1] = document.getElementById(row).className;
        document.getElementById(row).className = "GridSelectedRow";            
        previousRows[0] = row;
    }
    catch(e){}
}

function CheckSelectedRows(tableID) 
{
    var chkAll = window.event.srcElement; 
    var tbl = document.all[tableID];
    var FoundSelected = false;
    if (tbl != null)
    {
        for(var i=1; i<tbl.rows.length; i++) 
        {
            try 
            {
                var chk = tbl.rows[i].cells[0].firstChild.firstChild;
                if (chk.checked) 
                {
                    FoundSelected=true; 
                    break;
                }
            }
            catch  (e)
            {}
        }
    }
    return FoundSelected;
}

function selectAllRows(tableID, columnIndex) 
{
    var chkAll = window.event.srcElement; 
    var tbl = document.all[tableID];

	  if (chkAll) {
        for(var i=1; i<tbl.rows.length; i++) {
            try {
	              var chk = tbl.rows[i].cells[columnIndex].firstChild;
	              if(chk == null)
	                chk = tbl.rows[i].cells[columnIndex].firstChild.firstChild;
                
                chk.checked = chkAll.checked;
            }
            catch  (e) {
            }
        }
    }
}

//***********************************************************************************************//
//***********************************************************************************************//
//********************************** Date Validation Function ***********************************//
//***********************************************************************************************//
//***********************************************************************************************//
//***********************************************************************************************//
    function Age(bDay)
    {
        now = new Date()
        bD = bDay.split('/');
        if(bD.length == 3)
        {
            born = new Date(bD[2], bD[0]*1-1, bD[1]);
            years = Math.floor((now.getTime() - born.getTime()) / (365.25 * 24 * 60 * 60 * 1000));
            return years;
        }
        return 0;
    }
    
    function IsAllowedToSubmit(bDay)
    {
        // People having an age greater than 18
        return Age(bDay) >= 18; 
    }
    
    function ShouldSubmitRiskAck(bDay)
    {
        // People having an age less than 21 or greater than 65.
        return Age(bDay) <= 21 || Age(bDay) >= 65; 
    }
    
    function daysInFebruary (year)
    {
	    // February has 29 days in any year evenly divisible by four,
        // EXCEPT for centurial years which are not also divisible by 400.
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        return (isleap ? 29 : 28 );
    }

    function DaysArray(n) 
    {
	    for (var i = 1; i <= n; i++) 
	    {
		    this[i] = 31
		    if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		    if (i==2) {this[i] = 29}
       } 
       return this
    }

    // Used for the format yyyy/mm/dd
    function isValidDate(controlClientID) 
    {
        var daysInMonth = DaysArray(12)

        // Checks for the following valid date formats:
        // MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
        // Also separates date into month, day, and year variables

        // To require a 4 digit year entry, use this line instead:
        var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;  
        
        // MM/DD/YYYY
        //  /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/  
        // MM/DD/YYYY or // MM-DD-YYYY
        //  /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/   
        // YYYY/MM/DD or // YYYY-MM-DD
        //  /^(\d{4})(\/|-)(\d{1,2})\2(\d{1,2})$/; 
        
        if (trim(document.all[controlClientID].value) != '') 
        {
            var dateStr = trim(document.all[controlClientID].value);

            var matchArray = dateStr.match(datePat); // is the format ok?
            if (matchArray == null)        
                return (false);
            
            // YYYY/MM/DD
            // month = matchArray[3]; // parse date into variables
            // day = matchArray[4];
            // year = matchArray[1];

            // MM/DD/YYYY            
            month = matchArray[1]; // parse date into variables
            day = matchArray[3];
            year = matchArray[4];
            
            if (month < 1 || month > 12) { // check month range
                return (false);
            }
            
            if (day < 1 || day > 31 || (month==2 && day > daysInFebruary(year)) || day > daysInMonth[month])
                return false;            
        }
        
        return true;    
    }
    
    function trim(value) {
        return trimEnd(trimStart(value)); 
    }
    
    function trimEnd(value, removingChar) 
    {
        var returnValue = '';
      
        if ((removingChar == undefined) || (removingChar == ''))
            removingChar = ' ';

        for (var i = value.length - 1; i > -1; i--) {
            if (value.charAt(i) != removingChar) {
                returnValue = value.substring(0, i + 1);
                break;
            }
        }

        return returnValue; 
    }

    function trimStart(value, removingChar) {
        var returnValue = '';
        
        if ((removingChar == undefined) || (removingChar == ''))
            removingChar = ' ';
      
        for (var i = 0; i < value.length; i++) {
            if (value.charAt(i) != removingChar) {
                returnValue = value.substring(i);
                break;
            }
        }

        return returnValue; 
    }
    
    function CreateExcelSheet(tableID)
    {
        var myTable = document.getElementById(tableID);
        var x = myTable.rows

        var xls = new ActiveXObject("Excel.Application")
        xls.visible = true
        xls.Workbooks.Add
        
        for (i = 0; i < x.length; i++)
        {
            var isTopHeader = (i==0)? true: false;

            var y = x[i].cells

            for (j = 1; j < y.length-1; j++)
            {                
                if(!isTopHeader)
                {
                    // Check if the row is selected for export
                    var chk = x[i].cells[0].firstChild.firstChild;
                    if(chk != null && !chk.checked)
                    {
                        exportedRow = false;
                        break;
                    }
                }
                xls.Cells( i+1, j+1).Value = y[j].innerText
            }
        }
    }

    function ExportToExcel(tableID)
    {
        var detailsTable = document.getElementById(tableID);
        var x = detailsTable.rows;
        
        var oExcel = new ActiveXObject("Excel.Application");
        oExcel.visible = true;
        var oBook = oExcel.Workbooks.Add;
        //var oSheet = oBook.Worksheets(1);

        var rowIndex = 0;
        var exportedRow = true;
        
        for (var i=0;i<x.length;i++)
        {
            var isTopHeader = (i==0)? true: false;
            var y = x[i].cells;

            for (var j=0;j<y.length-1;j++)
            {  
                var txt = "";
                
                if(!isTopHeader)
                {
                    // Check if the row is selected for export
                    var chk = detailsTable.rows[i].cells[0].firstChild.firstChild;
                    if(chk != null && !chk.checked)
                    {
                        exportedRow = false;
                        break;
                    }
                }
                
                         
//                if(detailsTable.rows(i).cells(j).firstChild.tagName != "INPUT")
//                    txt = detailsTable.rows(i).cells(j).innerText;
//                else
//                    txt = detailsTable.rows(i).cells(j).firstChild.value;
                txt = y[j].innerText;
                alert(txt)
                
                //if(oSheet.Cells( rowIndex+1, x).text == "" || oSheet.Cells( rowIndex+1, x).text == " ")
                oExcel.Cells( i+1, j+1).Value = txt;
                exportedRow = true;
            }
            if(exportedRow)
                rowIndex ++;
        }
       
        oExcel.UserControl = true;
        oExcel.columns.autofit;
    }
    
    function ValidateEnteredAccounts()
    {
        var txtbx = document.getElementsByTagName('input');

        for (i=0;i < txtbx.length;i++)
        {
            if ( txtbx[i].type == "text")
            {
                var tempacctno = txtbx[i].value;
                if(tempacctno == "" || tempacctno == " ")
                {
                    alert("Please enter all temporary account numbers!");
                    return false;
                }
            }
        }
        return true;
    }
    
    // Declaring valid date character, minimum year and maximum year
    var dtCh= "/";
    var minYear=1900;
    var maxYear=2100;

    function isInteger(s){
	    var i;
        for (i = 0; i < s.length; i++){   
            // Check that current character is number.
            var c = s.charAt(i);
            if (((c < "0") || (c > "9"))) return false;
        }
        // All characters are numbers.
        return true;
    }

    function stripCharsInBag(s, bag){
	    var i;
        var returnString = "";
        // Search through string's characters one by one.
        // If character is not in bag, append to returnString.
        for (i = 0; i < s.length; i++){   
            var c = s.charAt(i);
            if (bag.indexOf(c) == -1) returnString += c;
        }
        return returnString;
    }

    function daysInFebruary (year){
	    // February has 29 days in any year evenly divisible by four,
        // EXCEPT for centurial years which are not also divisible by 400.
        return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
    }
    
    function DaysArray(n) {
	    for (var i = 1; i <= n; i++) {
		    this[i] = 31
		    if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		    if (i==2) {this[i] = 29}
       } 
       return this
    }

    function isDate(dtStr){ // Format MM/dd/yyyy
	    var daysInMonth = DaysArray(12)
	    var pos1=dtStr.indexOf(dtCh)
	    var pos2=dtStr.indexOf(dtCh,pos1+1)
	    var strMonth=dtStr.substring(0,pos1)
	    var strDay=dtStr.substring(pos1+1,pos2)
	    var strYear=dtStr.substring(pos2+1)
	    strYr=strYear
	    if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	    if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	    for (var i = 1; i <= 3; i++) {
		    if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	    }
	    month=parseInt(strMonth)
	    day=parseInt(strDay)
	    year=parseInt(strYr)
    	
	    if (pos1==-1 || pos2==-1){
		    //alert("Please enter the date as such: mm/dd/yyyy")
		    return false
	    }
	    if (strMonth.length<1 || month<1 || month>12){
		    //alert("Please fix the Month")
		    return false
	    }
	    if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		    //alert("Please fix the Day")
		    return false
	    }
	    if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		    //alert("Please fix the year: It should consist of 4 digits")
		    return false
	    }
	    if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		    //alert("Please fix the Date")
		    return false
	    }
        return true
    }

    function CheckDate(d)
    {
	    var dt=d
	    if (isDate(dt.GetValue())==false){
		    return false
	    }
        return true
     }