Description:-
What is Nested Gridview :-
Gridview Contain more than one other Gridview inside in it. It’s Called
a nested Gridview.this type of Facility is provided by asp.net and are very
useful to store All Detail in it.
For Example:-
Suppose we
have to Display student personal information and student Education Detail at
that time one gridview can not capable of Displaying All information of student
like personal and Education because of each contain more Field like Name,Age
etc .. in personal information and Degree,Year,Result etc.. in Educational
information so that type of information one Gridview can not Display in a
proper manner because of screen Width. Due to this problem we are create a
Nested Gridview in which parent Gridview contain student personal information
and Child Gridview contain Educational Detail so all different type of
information are store in proper way.
in this Example we use the JQuery for Expand and Collapse the Gridview.in which there are two image plus.png and minus.png when click on plus.png the Gridview row is Expand and when click on the minus.png the Gridview row is Collapse.this is the code for Jquery are as Follow
For Ex:-
So main Advantage of this Example is
that we can Display our data in a Proper way so our Website user can easily
Understand and we can make a user Friendlly Website through this type of
example.in this Example we use the JQuery for Expand and Collapse the Gridview.in which there are two image plus.png and minus.png when click on plus.png the Gridview row is Expand and when click on the minus.png the Gridview row is Collapse.this is the code for Jquery are as Follow
For Ex:-
<script src="MenuScript.js" type="text/javascript"></script>
<script type="text/javascript">
$("[src*=plus]").live("click", function () {
$(this).closest("tr").after("<tr><td></td><td
colspan = '999'>" + $(this).next().html() + "</td></tr>")
$(this).attr("src", "../0_Images/minus.png");
});
$("[src*=minus]").live("click", function () {
$(this).attr("src", "../0_Images/plus.png");
$(this).closest("tr").next().remove();
});
</script>
How to Create Nested gridview in MVC with Expand and Collapse please Click Here Nested Gridview in MVC
to show Example of How to Create a Paging in DataList click here Paging in DataList
to show Example of How to Export Gridview Data to PDF File Export Gridview Rows to PDF file
nested.aspx:-
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="nested.aspx.cs" Inherits="nested" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="MenuScript.js" type="text/javascript"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$("[src*=plus]").live("click", function () {
$(this).closest("tr").after("<tr><td></td><td
colspan = '999'>" + $(this).next().html() + "</td></tr>")
$(this).attr("src", "../0_Images/minus.png");
});
$("[src*=minus]").live("click", function () {
$(this).attr("src", "../0_Images/plus.png");
$(this).closest("tr").next().remove();
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gv_inwardgatepass" runat="server" AutoGenerateColumns="False" Width="100%"
AllowPaging="True" PageSize="5" BorderWidth="0px" DataKeyNames="pk_inwardgatepassid"
OnRowDataBound="gv_inwardgatepass_RowDataBound" GridLines="Horizontal" ShowHeader="False">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<img alt="" style="cursor: pointer" src="0_Images/plus.png" />
<asp:Panel ID="pnlOrders" runat="server" Style="display: none">
<asp:GridView ID="gvinwardlot" runat="server" AutoGenerateColumns="false" Width="100%"
HeaderStyle-BackColor="#80994B" HeaderStyle-ForeColor="Black">
<Columns>
<asp:BoundField DataField="inwardlotno" HeaderText="Inward Lot
No." ItemStyle-HorizontalAlign="Center"
ItemStyle-VerticalAlign="Middle" />
<asp:BoundField DataField="itemname" HeaderText="Item" ItemStyle-HorizontalAlign="Center"
ItemStyle-VerticalAlign="Middle" />
<asp:BoundField DataField="itemtypename" HeaderText="Item
Type" ItemStyle-HorizontalAlign="Center"
ItemStyle-VerticalAlign="Middle" />
<asp:BoundField DataField="quantityplusunit" HeaderText="Quantity" DataFormatString="{0:g}"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle" />
<asp:BoundField DataField="unit" HeaderText="Unit" ItemStyle-HorizontalAlign="Center"
ItemStyle-VerticalAlign="Middle" />
</Columns>
</asp:GridView>
</asp:Panel>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="5%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Sr. No.">
<ItemTemplate>
<%#Container.DataItemIndex+1 %>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="8%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Challan No.">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("challanno") %>'></asp:TextBox>
</EditItemTemplate>
<HeaderTemplate>
<asp:TextBox ID="txtbx_challanno" runat="server" Text='<%# Bind("challanno") %>'></asp:TextBox>
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("challanno") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="18%" />
</asp:TemplateField>
<asp:BoundField HeaderText="Inward
Date" DataField="inwarddate" DataFormatString="{0:d}">
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="13%" />
</asp:BoundField>
<asp:BoundField HeaderText="inwardgatepassno" DataField="inwardgatepassno">
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="16%" />
</asp:BoundField>
<asp:BoundField HeaderText="receivedby" DataField="receivedby">
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="16%" />
</asp:BoundField>
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/UserInterface/0_Images/view.png"
CommandName="eView" CommandArgument='<%# Eval("pk_inwardgatepassid") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="8%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Edit">
<ItemTemplate>
<asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/UserInterface/0_Images/edit.gif"
CommandName="eEdit" CommandArgument='<%# Eval("pk_inwardgatepassid") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="8%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Delete">
<ItemTemplate>
<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="~/UserInterface/0_Images/delete.png"
CommandName="eDelete" CommandArgument='<%# Eval("pk_inwardgatepassid") %>' />
<%--
<cc1:ConfirmButtonExtender ID="ConfirmButtonExtender1"
runat="server" TargetControlID="ImageButton3"
ConfirmText="You are about to delete the selected record, Are you
sure ?">
</cc1:ConfirmButtonExtender>--%>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="8%" />
</asp:TemplateField>
</Columns>
<PagerStyle HorizontalAlign="Left" />
</asp:GridView>
</div>
</form>
</body>
</html>
nested.aspx.cs:-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MINT.DBML;
public partial class nested : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
using (MINTDataClassesDataContext database = new
MINTDataClassesDataContext())
{
var inwardgatepasscoll = (from igp in database.InwardGatePasses
select new
{
igp.pk_inwardgatepassid,
igp.challanno,
igp.inwarddate,
igp.inwardgatepassno,
igp.receivedby
}).ToList();
gv_inwardgatepass.DataSource =
inwardgatepasscoll;
gv_inwardgatepass.DataBind();
}
}
protected void gv_inwardgatepass_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string inwardgatepassid =
gv_inwardgatepass.DataKeys[e.Row.RowIndex].Value.ToString();
GridView gvchild = e.Row.FindControl("gvinwardlot") as GridView;
using (MINTDataClassesDataContext database = new MINTDataClassesDataContext())
{
var coll1 = (from ilo in database.Inwardlots
where ilo.fk_inwardgatepassid == Convert.ToInt32(inwardgatepassid)
join itm in database.RawMaterials on ilo.fk_itemid equals
itm.pk_rawmaterialsid into ilo_itm
join itmtyp in
database.RawMaterialItemTypes on ilo.fk_itemtypesid equals itmtyp.pk_rawmaterialitemtypesid into ilo_itmtyp
join unt in database.Units on ilo.fk_unitid equals unt.pk_unitid into ilo_unt
from itm in ilo_itm.DefaultIfEmpty()
from itmtyp in ilo_itmtyp.DefaultIfEmpty()
from unt in ilo_unt.DefaultIfEmpty()
select new
{
pk_inwardlotid = ilo.pk_inwardlotid,
inwardlotno
= ilo.inwardlotno,
itemname =
itm.itemname,
itemtypename = itmtyp.itemtypename,
quantityplusunit = ilo.quantity,
unit =
unt.unitname
}).ToList();
if (coll1.Any())
{
gvchild.DataSource =
coll1;
gvchild.DataBind();
}
}
}
}
MenuScript.js:-
var Spry; if (!Spry) Spry = {}; if (!Spry.Widget) Spry.Widget = {};
Spry.BrowserSniff
= function()
{
var b = navigator.appName.toString();
var up = navigator.platform.toString();
var ua = navigator.userAgent.toString();
this.mozilla = this.ie = this.opera = this.safari = false;
var re_opera = /Opera.([0-9\.]*)/i;
var re_msie = /MSIE.([0-9\.]*)/i;
var re_gecko = /gecko/i;
var re_safari = /(applewebkit|safari)\/([\d\.]*)/i;
var r = false;
if ( (r = ua.match(re_opera))) {
this.opera = true;
this.version = parseFloat(r[1]);
} else if ( (r = ua.match(re_msie))) {
this.ie = true;
this.version = parseFloat(r[1]);
} else if ( (r = ua.match(re_safari))) {
this.safari = true;
this.version = parseFloat(r[2]);
} else if (ua.match(re_gecko)) {
var re_gecko_version = /rv:\s*([0-9\.]+)/i;
r = ua.match(re_gecko_version);
this.mozilla = true;
this.version = parseFloat(r[1]);
}
this.windows = this.mac = this.linux = false;
this.Platform = ua.match(/windows/i) ? "windows" :
(ua.match(/linux/i) ? "linux" :
(ua.match(/mac/i) ? "mac" :
ua.match(/unix/i)? "unix" : "unknown"));
this[this.Platform] = true;
this.v = this.version;
if (this.safari && this.mac && this.mozilla) {
this.mozilla = false;
}
};
Spry.is
= new
Spry.BrowserSniff();
//
Constructor for Menu Bar
//
element should be an ID of an unordered list (<ul> tag)
//
preloadImage1 and preloadImage2 are images for the rollover state of a menu
Spry.Widget.MenuBar
= function(element,
opts)
{
this.init(element, opts);
};
Spry.Widget.MenuBar.prototype.init
= function(element,
opts)
{
this.element = this.getElement(element);
//
represents the current (sub)menu we are operating on
this.currMenu = null;
this.showDelay = 250;
this.hideDelay = 600;
if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple
Computer, Inc.' && typeof
window.XMLHttpRequest == 'undefined') || (Spry.is.ie && typeof document.uniqueID == 'undefined'))
{
//
bail on older unsupported browsers
return;
}
// Fix
IE6 CSS images flicker
if (Spry.is.ie && Spry.is.version < 7){
try {
document.execCommand("BackgroundImageCache", false, true);
} catch(err) {}
}
this.upKeyCode = Spry.Widget.MenuBar.KEY_UP;
this.downKeyCode = Spry.Widget.MenuBar.KEY_DOWN;
this.leftKeyCode = Spry.Widget.MenuBar.KEY_LEFT;
this.rightKeyCode = Spry.Widget.MenuBar.KEY_RIGHT;
this.escKeyCode = Spry.Widget.MenuBar.KEY_ESC;
this.hoverClass = 'MenuBarItemHover';
this.subHoverClass = 'MenuBarItemSubmenuHover';
this.subVisibleClass ='MenuBarSubmenuVisible';
this.hasSubClass = 'MenuBarItemSubmenu';
this.activeClass = 'MenuBarActive';
this.isieClass = 'MenuBarItemIE';
this.verticalClass = 'MenuBarVertical';
this.horizontalClass = 'MenuBarHorizontal';
this.enableKeyboardNavigation = true;
this.hasFocus = false;
// load
hover images now
if(opts)
{
for(var k in opts)
{
if (typeof this[k] == 'undefined')
{
var rollover = new Image;
rollover.src =
opts[k];
}
}
Spry.Widget.MenuBar.setOptions(this, opts);
}
//
safari doesn't support tabindex
if (Spry.is.safari)
this.enableKeyboardNavigation = false;
if(this.element)
{
this.currMenu = this.element;
var items = this.element.getElementsByTagName('li');
for(var i=0; i<items.length; i++)
{
if (i > 0 && this.enableKeyboardNavigation)
items[i].getElementsByTagName('a')[0].tabIndex='-1';
this.initialize(items[i],
element);
if(Spry.is.ie)
{
this.addClassName(items[i], this.isieClass);
items[i].style.position
= "static";
}
}
if (this.enableKeyboardNavigation)
{
var self = this;
this.addEventListener(document, 'keydown', function(e){self.keyDown(e);
}, false);
}
if(Spry.is.ie)
{
if(this.hasClassName(this.element, this.verticalClass))
{
this.element.style.position = "relative";
}
var linkitems = this.element.getElementsByTagName('a');
for(var i=0; i<linkitems.length;
i++)
{
linkitems[i].style.position
= "relative";
}
}
}
};
Spry.Widget.MenuBar.KEY_ESC
= 27;
Spry.Widget.MenuBar.KEY_UP
= 38;
Spry.Widget.MenuBar.KEY_DOWN
= 40;
Spry.Widget.MenuBar.KEY_LEFT
= 37;
Spry.Widget.MenuBar.KEY_RIGHT
= 39;
Spry.Widget.MenuBar.prototype.getElement
= function(ele)
{
if (ele && typeof ele == "string")
return document.getElementById(ele);
return ele;
};
Spry.Widget.MenuBar.prototype.hasClassName
= function(ele,
className)
{
if (!ele || !className || !ele.className ||
ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)
{
return false;
}
return true;
};
Spry.Widget.MenuBar.prototype.addClassName
= function(ele,
className)
{
if (!ele || !className || this.hasClassName(ele, className))
return;
ele.className += (ele.className ? " " : "") +
className;
};
Spry.Widget.MenuBar.prototype.removeClassName
= function(ele,
className)
{
if (!ele || !className || !this.hasClassName(ele, className))
return;
ele.className = ele.className.replace(new RegExp("\\s*\\b" +
className + "\\b", "g"), "");
};
//
addEventListener for Menu Bar
//
attach an event to a tag without creating obtrusive HTML code
Spry.Widget.MenuBar.prototype.addEventListener
= function(element,
eventType, handler, capture)
{
try
{
if (element.addEventListener)
{
element.addEventListener(eventType,
handler, capture);
}
else if (element.attachEvent)
{
element.attachEvent('on' + eventType, handler);
}
}
catch (e) {}
};
//
createIframeLayer for Menu Bar
//
creates an IFRAME underneath a menu so that it will show above form controls
and ActiveX
Spry.Widget.MenuBar.prototype.createIframeLayer
= function(menu)
{
var layer = document.createElement('iframe');
layer.tabIndex = '-1';
layer.src = 'javascript:""';
layer.frameBorder = '0';
layer.scrolling = 'no';
menu.parentNode.appendChild(layer);
layer.style.left = menu.offsetLeft + 'px';
layer.style.top = menu.offsetTop + 'px';
layer.style.width = menu.offsetWidth + 'px';
layer.style.height = menu.offsetHeight + 'px';
};
//
removeIframeLayer for Menu Bar
//
removes an IFRAME underneath a menu to reveal any form controls and ActiveX
Spry.Widget.MenuBar.prototype.removeIframeLayer
= function(menu)
{
var layers = ((menu == this.element) ? menu : menu.parentNode).getElementsByTagName('iframe');
while(layers.length > 0)
{
layers[0].parentNode.removeChild(layers[0]);
}
};
//
clearMenus for Menu Bar
//
root is the top level unordered list (<ul> tag)
Spry.Widget.MenuBar.prototype.clearMenus
= function(root)
{
var menus = root.getElementsByTagName('ul');
for(var i=0; i<menus.length; i++)
this.hideSubmenu(menus[i]);
this.removeClassName(this.element, this.activeClass);
};
//
bubbledTextEvent for Menu Bar
//
identify bubbled up text events in Safari so we can ignore them
Spry.Widget.MenuBar.prototype.bubbledTextEvent
= function()
{
return Spry.is.safari && (event.target ==
event.relatedTarget.parentNode || (event.eventPhase == 3 &&
event.target.parentNode == event.relatedTarget));
};
//
showSubmenu for Menu Bar
//
set the proper CSS class on this menu to show it
Spry.Widget.MenuBar.prototype.showSubmenu
= function(menu)
{
if(this.currMenu)
{
this.clearMenus(this.currMenu);
this.currMenu = null;
}
if(menu)
{
this.addClassName(menu, this.subVisibleClass);
if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')
{
if(!this.hasClassName(this.element, this.horizontalClass) ||
menu.parentNode.parentNode != this.element)
{
menu.style.top =
menu.parentNode.offsetTop + 'px';
}
}
if(Spry.is.ie && Spry.is.version < 7)
{
this.createIframeLayer(menu);
}
}
this.addClassName(this.element, this.activeClass);
};
//
hideSubmenu for Menu Bar
//
remove the proper CSS class on this menu to hide it
Spry.Widget.MenuBar.prototype.hideSubmenu
= function(menu)
{
if(menu)
{
this.removeClassName(menu, this.subVisibleClass);
if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')
{
menu.style.top = '';
menu.style.left = '';
}
if(Spry.is.ie && Spry.is.version < 7)
this.removeIframeLayer(menu);
}
};
//
initialize for Menu Bar
//
create event listeners for the Menu Bar widget so we can properly
//
show and hide submenus
Spry.Widget.MenuBar.prototype.initialize
= function(listitem,
element)
{
var opentime, closetime;
var link = listitem.getElementsByTagName('a')[0];
var submenus = listitem.getElementsByTagName('ul');
var menu = (submenus.length > 0 ? submenus[0] : null);
if(menu)
this.addClassName(link, this.hasSubClass);
if(!Spry.is.ie)
{
//
define a simple function that comes standard in IE to determine
//
if a node is within another node
listitem.contains = function(testNode)
{
// this refers to the list item
if(testNode == null)
return false;
if(testNode == this)
return true;
else
return this.contains(testNode.parentNode);
};
}
// need
to save this for scope further down
var self = this;
this.addEventListener(listitem, 'mouseover', function(e){self.mouseOver(listitem, e);}, false);
this.addEventListener(listitem, 'mouseout', function(e){if (self.enableKeyboardNavigation) self.clearSelection();
self.mouseOut(listitem, e);}, false);
if (this.enableKeyboardNavigation)
{
this.addEventListener(link, 'blur', function(e){self.onBlur(listitem);}, false);
this.addEventListener(link, 'focus', function(e){self.keyFocus(listitem, e);}, false);
}
};
Spry.Widget.MenuBar.prototype.keyFocus
= function
(listitem, e)
{
this.lastOpen = listitem.getElementsByTagName('a')[0];
this.addClassName(this.lastOpen, listitem.getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);
this.hasFocus = true;
};
Spry.Widget.MenuBar.prototype.onBlur
= function
(listitem)
{
this.clearSelection(listitem);
};
Spry.Widget.MenuBar.prototype.clearSelection
= function(el){
//search
any intersection with the current open element
if (!this.lastOpen)
return;
if (el)
{
el = el.getElementsByTagName('a')[0];
//
check children
var item = this.lastOpen;
while (item != this.element)
{
var tmp = el;
while (tmp != this.element)
{
if (tmp == item)
return;
try{
tmp =
tmp.parentNode;
}catch(err){break;}
}
item = item.parentNode;
}
}
var item = this.lastOpen;
while (item != this.element)
{
this.hideSubmenu(item.parentNode);
var link = item.getElementsByTagName('a')[0];
this.removeClassName(link, this.hoverClass);
this.removeClassName(link, this.subHoverClass);
item = item.parentNode;
}
this.lastOpen = false;
};
Spry.Widget.MenuBar.prototype.keyDown
= function
(e)
{
if (!this.hasFocus)
return;
if (!this.lastOpen)
{
this.hasFocus = false;
return;
}
var e = e|| event;
var listitem = this.lastOpen.parentNode;
var link = this.lastOpen;
var submenus = listitem.getElementsByTagName('ul');
var menu = (submenus.length > 0 ? submenus[0] : null);
var hasSubMenu = (menu) ? true : false;
var opts = [listitem, menu, null, this.getSibling(listitem, 'previousSibling'), this.getSibling(listitem, 'nextSibling')];
if (!opts[3])
opts[2] =
(listitem.parentNode.parentNode.nodeName.toLowerCase() == 'li')?listitem.parentNode.parentNode:null;
var found = 0;
switch (e.keyCode){
case this.upKeyCode:
found = this.getElementForKey(opts, 'y', 1);
break;
case this.downKeyCode:
found = this.getElementForKey(opts, 'y', -1);
break;
case this.leftKeyCode:
found = this.getElementForKey(opts, 'x', 1);
break;
case this.rightKeyCode:
found = this.getElementForKey(opts, 'x', -1);
break;
case this.escKeyCode:
case 9:
this.clearSelection();
this.hasFocus = false;
default: return;
}
switch (found)
{
case 0: return;
case 1:
//subopts
this.mouseOver(listitem, e);
break;
case 2:
//parent
this.mouseOut(opts[2], e);
break;
case 3:
case 4:
// left - right
this.removeClassName(link,
hasSubMenu ? this.subHoverClass : this.hoverClass);
break;
}
var link = opts[found].getElementsByTagName('a')[0];
if (opts[found].nodeName.toLowerCase() == 'ul')
opts[found] =
opts[found].getElementsByTagName('li')[0];
this.addClassName(link, opts[found].getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);
this.lastOpen = link;
opts[found].getElementsByTagName('a')[0].focus();
//stop further event handling by the browser
return Spry.Widget.MenuBar.stopPropagation(e);
};
Spry.Widget.MenuBar.prototype.mouseOver
= function
(listitem, e)
{
var link = listitem.getElementsByTagName('a')[0];
var submenus = listitem.getElementsByTagName('ul');
var menu = (submenus.length > 0 ? submenus[0] : null);
var hasSubMenu = (menu) ? true : false;
if (this.enableKeyboardNavigation)
this.clearSelection(listitem);
if(this.bubbledTextEvent())
{
//
ignore bubbled text events
return;
}
if (listitem.closetime)
clearTimeout(listitem.closetime);
if(this.currMenu == listitem)
{
this.currMenu = null;
}
// move
the focus too
if (this.hasFocus)
link.focus();
// show
menu highlighting
this.addClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);
this.lastOpen = link;
if(menu && !this.hasClassName(menu, this.subHoverClass))
{
var self = this;
listitem.opentime =
window.setTimeout(function(){self.showSubmenu(menu);}, this.showDelay);
}
};
Spry.Widget.MenuBar.prototype.mouseOut
= function
(listitem, e)
{
var link = listitem.getElementsByTagName('a')[0];
var submenus = listitem.getElementsByTagName('ul');
var menu = (submenus.length > 0 ? submenus[0] : null);
var hasSubMenu = (menu) ? true : false;
if(this.bubbledTextEvent())
{
//
ignore bubbled text events
return;
}
var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement);
if(!listitem.contains(related))
{
if (listitem.opentime)
clearTimeout(listitem.opentime);
this.currMenu = listitem;
//
remove menu highlighting
this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);
if(menu)
{
var self = this;
listitem.closetime =
window.setTimeout(function(){self.hideSubmenu(menu);}, this.hideDelay);
}
if (this.hasFocus)
link.blur();
}
};
Spry.Widget.MenuBar.prototype.getSibling
= function(element,
sibling)
{
var child = element[sibling];
while (child && child.nodeName.toLowerCase() !='li')
child = child[sibling];
return child;
};
Spry.Widget.MenuBar.prototype.getElementForKey
= function(els,
prop, dir)
{
var found = 0;
var rect = Spry.Widget.MenuBar.getPosition;
var ref = rect(els[found]);
var hideSubmenu = false;
//make
the subelement visible to compute the position
if (els[1] && !this.hasClassName(els[1], this.MenuBarSubmenuVisible))
{
els[1].style.visibility = 'hidden';
this.showSubmenu(els[1]);
hideSubmenu = true;
}
var isVert = this.hasClassName(this.element, this.verticalClass);
var hasParent =
els[0].parentNode.parentNode.nodeName.toLowerCase() == 'li' ? true : false;
for (var i = 1; i < els.length; i++){
//when
navigating on the y axis in vertical menus, ignore children and parents
if(prop=='y' && isVert && (i==1 || i==2))
{
continue;
}
//when
navigationg on the x axis in the FIRST LEVEL of horizontal menus, ignore
children and parents
if(prop=='x' && !isVert && !hasParent && (i==1
|| i==2))
{
continue;
}
if (els[i])
{
var tmp = rect(els[i]);
if ( (dir * tmp[prop]) <
(dir * ref[prop]))
{
ref = tmp;
found = i;
}
}
}
// hide
back the submenu
if (els[1] && hideSubmenu){
this.hideSubmenu(els[1]);
els[1].style.visibility = '';
}
return found;
};
Spry.Widget.MenuBar.camelize
= function(str)
{
if (str.indexOf('-') == -1){
return str;
}
var oStringList = str.split('-');
var isFirstEntry = true;
var camelizedString = '';
for(var i=0; i < oStringList.length; i++)
{
if(oStringList[i].length>0)
{
if(isFirstEntry)
{
camelizedString =
oStringList[i];
isFirstEntry = false;
}
else
{
var s = oStringList[i];
camelizedString +=
s.charAt(0).toUpperCase() + s.substring(1);
}
}
}
return camelizedString;
};
Spry.Widget.MenuBar.getStyleProp
= function(element,
prop)
{
var value;
try
{
if (element.style)
value =
element.style[Spry.Widget.MenuBar.camelize(prop)];
if (!value)
if (document.defaultView
&& document.defaultView.getComputedStyle)
{
var css =
document.defaultView.getComputedStyle(element, null);
value = css ?
css.getPropertyValue(prop) : null;
}
else if (element.currentStyle)
{
value =
element.currentStyle[Spry.Widget.MenuBar.camelize(prop)];
}
}
catch (e) {}
return value == 'auto' ? null : value;
};
Spry.Widget.MenuBar.getIntProp
= function(element,
prop)
{
var a = parseInt(Spry.Widget.MenuBar.getStyleProp(element, prop),10);
if (isNaN(a))
return 0;
return a;
};
Spry.Widget.MenuBar.getPosition
= function(el,
doc)
{
doc = doc || document;
if (typeof(el) == 'string') {
el = doc.getElementById(el);
}
if (!el) {
return false;
}
if (el.parentNode === null || Spry.Widget.MenuBar.getStyleProp(el, 'display') == 'none') {
//element
must be visible to have a box
return false;
}
var ret = {x:0, y:0};
var parent = null;
var box;
if (el.getBoundingClientRect) { // IE
box = el.getBoundingClientRect();
var scrollTop = doc.documentElement.scrollTop ||
doc.body.scrollTop;
var scrollLeft = doc.documentElement.scrollLeft ||
doc.body.scrollLeft;
ret.x = box.left + scrollLeft;
ret.y = box.top + scrollTop;
} else if (doc.getBoxObjectFor) { //
gecko
box = doc.getBoxObjectFor(el);
ret.x = box.x;
ret.y = box.y;
} else { // safari/opera
ret.x = el.offsetLeft;
ret.y = el.offsetTop;
parent = el.offsetParent;
if (parent != el) {
while (parent) {
ret.x +=
parent.offsetLeft;
ret.y +=
parent.offsetTop;
parent =
parent.offsetParent;
}
}
//
opera & (safari absolute) incorrectly account for body offsetTop
if (Spry.is.opera || Spry.is.safari &&
Spry.Widget.MenuBar.getStyleProp(el, 'position') == 'absolute')
ret.y -=
doc.body.offsetTop;
}
if (el.parentNode)
parent = el.parentNode;
else
parent = null;
if (parent.nodeName){
var cas = parent.nodeName.toUpperCase();
while (parent && cas != 'BODY' && cas != 'HTML') {
cas =
parent.nodeName.toUpperCase();
ret.x -= parent.scrollLeft;
ret.y -= parent.scrollTop;
if (parent.parentNode)
parent =
parent.parentNode;
else
parent = null;
}
}
return ret;
};
Spry.Widget.MenuBar.stopPropagation
= function(ev)
{
if (ev.stopPropagation)
ev.stopPropagation();
else
ev.cancelBubble = true;
if (ev.preventDefault)
ev.preventDefault();
else
ev.returnValue = false;
};
Spry.Widget.MenuBar.setOptions
= function(obj,
optionsObj, ignoreUndefinedProps)
{
if (!optionsObj)
return;
for (var optionName in optionsObj)
{
if (ignoreUndefinedProps && optionsObj[optionName]
== undefined)
continue;
obj[optionName] =
optionsObj[optionName];
}
};
0 comments:
Post a Comment