Solved

Why don't my Spry panels work when I use a JavaScript sort function to order my xml data?

Posted on 2008-10-13
2
581 Views
Last Modified: 2013-11-18
I am using e-Text Editor to form an XSL stylesheet for my XML data, but when I started introducing "Spry Collapsible Panels" and "Spry Tabbed Panels" to certain sections, things started going haywire... I got all the spry stuff figured out (keep in mind, I am not using 'Adobe Dreamweaver') and decided to add a table that is sortable using 'JavaScript', inside one of the "Spry Collapsible Panels".

***The Problem***
When I click the table heading of a column to be 'sorted', the page refreshes and my "Spry Panels" no longer work??? If I refresh the page with the 'refresh btn' the "Spry" stuff works again, but now my sorting function no longer works...
I have put all my JavaScript files into one file called "common.js" and have attached the code snippet below. From what little I know about JavaScript, I assume grouping the files into one should not be causing the problem...right? Also, in the snippet below, I have also removed the comments that "Spry" puts in automatically, and the order of files in the common.js file are as follows:
First.  My function to load the xml data.
Second.  My function to sort the xml table.
Third.  The Spry Collapsible Panels JavaScript.
Forth.  The Spry Tabbed Panels JavaScript.

Please Help!!!

Thanks in advance for your time!!!
Levi
//This section loads the xml file
 

function loadXMLDoc(dname) {

				try { //Internet Explorer

					xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

				}

				catch(e) {

					try { //Firefox, Mozilla, Opera, etc.

						xmlDoc=document.implementation.createDocument("","",null);

				    }

					catch(e) {

						alert(e.message)

					}

				}

				try {

					xmlDoc.async=false;

					xmlDoc.load(dname);

					return(xmlDoc);

				}

				catch(e) {

					alert(e.message)

				}

				return(null);

			}
 
 

//This is for the sorting section
 

function sort(column){

	try{

		var s = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");

		var x = document.XMLDocument;

		if (x == null){

			x = navigator.XMLDocument;

			s.loadXML(navigator.XSLDocument.xml);

		}else{

			s.loadXML(document.XSLDocument.xml);

		}

		var tem = new ActiveXObject("MSXML2.XSLTemplate");

		tem.stylesheet = s;

		var proc = tem.createProcessor();

		proc.addParameter("column", column);

		proc.input = x;

		proc.transform();

		var str = proc.output;
 

		var newDoc = document.open("text/html");

		newDoc.write(str);

		navigator.XMLDocument = x;

		navigator.XSLDocument = s;

		newDoc.close();

	}catch(exception){

		debugger;

	}

}
 

//This is for the collapsible panels section
 
 

var Spry;

if (!Spry) Spry = {};

if (!Spry.Widget) Spry.Widget = {};
 

Spry.Widget.CollapsiblePanel = function(element, opts)

{

	this.init(element);
 

	Spry.Widget.CollapsiblePanel.setOptions(this, opts);
 

	this.attachBehaviors();

};
 

Spry.Widget.CollapsiblePanel.prototype.init = function(element)

{

	this.element = this.getElement(element);

	this.focusElement = null;

	this.hoverClass = "CollapsiblePanelTabHover";

	this.openClass = "CollapsiblePanelOpen";

	this.closedClass = "CollapsiblePanelClosed";

	this.focusedClass = "CollapsiblePanelFocused";

	this.enableAnimation = true;

	this.enableKeyboardNavigation = true;

	this.animator = null;

	this.hasFocus = false;

	this.contentIsOpen = true;

};
 

Spry.Widget.CollapsiblePanel.prototype.getElement = function(ele)

{

	if (ele && typeof ele == "string")

		return document.getElementById(ele);

	return ele;

};
 

Spry.Widget.CollapsiblePanel.prototype.addClassName = function(ele, className)

{

	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))

		return;

	ele.className += (ele.className ? " " : "") + className;

};
 

Spry.Widget.CollapsiblePanel.prototype.removeClassName = function(ele, className)

{

	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))

		return;

	ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");

};
 

Spry.Widget.CollapsiblePanel.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.CollapsiblePanel.prototype.setDisplay = function(ele, display)

{

	if( ele )

		ele.style.display = display;

};
 

Spry.Widget.CollapsiblePanel.setOptions = function(obj, optionsObj, ignoreUndefinedProps)

{

	if (!optionsObj)

		return;

	for (var optionName in optionsObj)

	{

		if (ignoreUndefinedProps && optionsObj[optionName] == undefined)

			continue;

		obj[optionName] = optionsObj[optionName];

	}

};
 

Spry.Widget.CollapsiblePanel.prototype.onTabMouseOver = function()

{

	this.addClassName(this.getTab(), this.hoverClass);

};
 

Spry.Widget.CollapsiblePanel.prototype.onTabMouseOut = function()

{

	this.removeClassName(this.getTab(), this.hoverClass);

};
 

Spry.Widget.CollapsiblePanel.prototype.open = function()

{

	this.contentIsOpen = true;

	if (this.enableAnimation)

	{

		if (this.animator)

			this.animator.stop();

		this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, true);

		this.animator.start();

	}

	else

		this.setDisplay(this.getContent(), "block");
 

	this.removeClassName(this.element, this.closedClass);

	this.addClassName(this.element, this.openClass);

};
 

Spry.Widget.CollapsiblePanel.prototype.close = function()

{

	this.contentIsOpen = false;

	if (this.enableAnimation)

	{

		if (this.animator)

			this.animator.stop();

		this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, false);

		this.animator.start();

	}

	else

		this.setDisplay(this.getContent(), "none");
 

	this.removeClassName(this.element, this.openClass);

	this.addClassName(this.element, this.closedClass);

};
 

Spry.Widget.CollapsiblePanel.prototype.onTabClick = function()

{

	if (this.isOpen())

		this.close();

	else

		this.open();

	this.focus();

};
 

Spry.Widget.CollapsiblePanel.prototype.onFocus = function(e)

{

	this.hasFocus = true;

	this.addClassName(this.element, this.focusedClass);

};
 

Spry.Widget.CollapsiblePanel.prototype.onBlur = function(e)

{

	this.hasFocus = false;

	this.removeClassName(this.element, this.focusedClass);

};
 

Spry.Widget.CollapsiblePanel.ENTER_KEY = 13;

Spry.Widget.CollapsiblePanel.SPACE_KEY = 32;
 

Spry.Widget.CollapsiblePanel.prototype.onKeyDown = function(e)

{

	var key = e.keyCode;

	if (!this.hasFocus || (key != Spry.Widget.CollapsiblePanel.ENTER_KEY && key != Spry.Widget.CollapsiblePanel.SPACE_KEY))

		return true;

	

	if (this.isOpen())

		this.close();

	else

		this.open();
 

	if (e.stopPropagation)

		e.stopPropagation();

	if (e.preventDefault)

		e.preventDefault();
 

	return false;

};
 

Spry.Widget.CollapsiblePanel.prototype.attachPanelHandlers = function()

{

	var tab = this.getTab();

	if (!tab)

		return;
 

	var self = this;

	Spry.Widget.CollapsiblePanel.addEventListener(tab, "click", function(e) { return self.onTabClick(); }, false);

	Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(); }, false);

	Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(); }, false);
 

	if (this.enableKeyboardNavigation)

	{

		

		var tabIndexEle = null;

		var tabAnchorEle = null;
 

		this.preorderTraversal(tab, function(node) {

			if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)

			{

				var tabIndexAttr = tab.attributes.getNamedItem("tabindex");

				if (tabIndexAttr)

				{

					tabIndexEle = node;

					return true;

				}

				if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")

					tabAnchorEle = node;

			}

			return false;

		});
 

		if (tabIndexEle)

			this.focusElement = tabIndexEle;

		else if (tabAnchorEle)

			this.focusElement = tabAnchorEle;
 

		if (this.focusElement)

		{

			Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "focus", function(e) { return self.onFocus(e); }, false);

			Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "blur", function(e) { return self.onBlur(e); }, false);

			Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "keydown", function(e) { return self.onKeyDown(e); }, false);

		}

	}

};
 

Spry.Widget.CollapsiblePanel.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) {}

};
 

Spry.Widget.CollapsiblePanel.prototype.preorderTraversal = function(root, func)

{

	var stopTraversal = false;

	if (root)

	{

		stopTraversal = func(root);

		if (root.hasChildNodes())

		{

			var child = root.firstChild;

			while (!stopTraversal && child)

			{

				stopTraversal = this.preorderTraversal(child, func);

				try { child = child.nextSibling; } catch (e) { child = null; }

			}

		}

	}

	return stopTraversal;

};
 

Spry.Widget.CollapsiblePanel.prototype.attachBehaviors = function()

{

	var panel = this.element;

	var tab = this.getTab();

	var content = this.getContent();
 

	if (this.contentIsOpen || this.hasClassName(panel, this.openClass))

	{

		this.removeClassName(panel, this.closedClass);

		this.setDisplay(content, "block");

		this.contentIsOpen = true;

	}

	else

	{

		this.removeClassName(panel, this.openClass);

		this.addClassName(panel, this.closedClass);

		this.setDisplay(content, "none");

		this.contentIsOpen = false;

	}
 

	this.attachPanelHandlers();

};
 

Spry.Widget.CollapsiblePanel.prototype.getTab = function()

{

	return this.getElementChildren(this.element)[0];

};
 

Spry.Widget.CollapsiblePanel.prototype.getContent = function()

{

	return this.getElementChildren(this.element)[1];

};
 

Spry.Widget.CollapsiblePanel.prototype.isOpen = function()

{

	return this.contentIsOpen;

};
 

Spry.Widget.CollapsiblePanel.prototype.getElementChildren = function(element)

{

	var children = [];

	var child = element.firstChild;

	while (child)

	{

		if (child.nodeType == 1 /* Node.ELEMENT_NODE */)

			children.push(child);

		child = child.nextSibling;

	}

	return children;

};
 

Spry.Widget.CollapsiblePanel.prototype.focus = function()

{

	if (this.focusElement && this.focusElement.focus)

		this.focusElement.focus();

};
 

/////////////////////////////////////////////////////
 

Spry.Widget.CollapsiblePanel.PanelAnimator = function(panel, doOpen, opts)

{

	this.timer = null;

	this.interval = 0;

	this.stepCount = 0;
 

	this.fps = 0;

	this.steps = 10;

	this.duration = 500;

	this.onComplete = null;
 

	this.panel = panel;

	this.content = panel.getContent();

	this.panelData = [];

	this.doOpen = doOpen;
 

	Spry.Widget.CollapsiblePanel.setOptions(this, opts);
 
 

	// If caller specified speed in terms of frames per second,

	// convert them into steps.
 

	if (this.fps > 0)

	{

		this.interval = Math.floor(1000 / this.fps);

		this.steps = parseInt((this.duration + (this.interval - 1)) / this.interval);

	}

	else if (this.steps > 0)

		this.interval = this.duration / this.steps;
 

	var c = this.content;
 

	var curHeight = c.offsetHeight ? c.offsetHeight : 0;

	

	if (doOpen && c.style.display == "none")

		this.fromHeight = 0;

	else

		this.fromHeight = curHeight;
 

	if (!doOpen)

		this.toHeight = 0;

	else

	{

		if (c.style.display == "none")

		{
 

			c.style.visibility = "hidden";

			c.style.display = "block";

		}
 

		c.style.height = "";

		this.toHeight = c.offsetHeight;
 

	}
 

	this.increment = (this.toHeight - this.fromHeight) / this.steps;

	this.overflow = c.style.overflow;
 

	c.style.height = this.fromHeight + "px";

	c.style.visibility = "visible";

	c.style.overflow = "hidden";

	c.style.display = "block";

};
 

Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.start = function()

{

	var self = this;

	this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);

};
 

Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stop = function()

{

	if (this.timer)

	{

		clearTimeout(this.timer);
 

		if (this.stepCount < this.steps)

			this.content.style.overflow = this.overflow;

	}
 

	this.timer = null;

};
 

Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stepAnimation = function()

{

	++this.stepCount;
 

	this.animate();
 

	if (this.stepCount < this.steps)

		this.start();

	else if (this.onComplete)

		this.onComplete();

};
 

Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.animate = function()

{

	if (this.stepCount >= this.steps)

	{

		if (!this.doOpen)

			this.content.style.display = "none";

		this.content.style.overflow = this.overflow;

		this.content.style.height = this.toHeight + "px";

	}

	else

	{

		this.fromHeight += this.increment;

		this.content.style.height = this.fromHeight + "px";

	}

};
 

//This is for the tabbed panels section
 
 

var Spry;

if (!Spry) Spry = {};

if (!Spry.Widget) Spry.Widget = {};
 

Spry.Widget.TabbedPanels = function(element, opts)

{

	this.element = this.getElement(element);

	this.defaultTab = 0; // Show the first panel by default.

	this.bindings = [];

	this.tabSelectedClass = "TabbedPanelsTabSelected";

	this.tabHoverClass = "TabbedPanelsTabHover";

	this.tabFocusedClass = "TabbedPanelsTabFocused";

	this.panelVisibleClass = "TabbedPanelsContentVisible";

	this.focusElement = null;

	this.hasFocus = false;

	this.currentTabIndex = 0;

	this.enableKeyboardNavigation = true;
 

	Spry.Widget.TabbedPanels.setOptions(this, opts);
 

	if (typeof (this.defaultTab) == "number")

	{

		if (this.defaultTab < 0)

			this.defaultTab = 0;

		else

		{

			var count = this.getTabbedPanelCount();

			if (this.defaultTab >= count)

				this.defaultTab = (count > 1) ? (count - 1) : 0;

		}
 

		this.defaultTab = this.getTabs()[this.defaultTab];

	}
 

	if (this.defaultTab)

		this.defaultTab = this.getElement(this.defaultTab);
 

	this.attachBehaviors();

};
 

Spry.Widget.TabbedPanels.prototype.getElement = function(ele)

{

	if (ele && typeof ele == "string")

		return document.getElementById(ele);

	return ele;

}
 

Spry.Widget.TabbedPanels.prototype.getElementChildren = function(element)

{

	var children = [];

	var child = element.firstChild;

	while (child)

	{

		if (child.nodeType == 1 /* Node.ELEMENT_NODE */)

			children.push(child);

		child = child.nextSibling;

	}

	return children;

};
 

Spry.Widget.TabbedPanels.prototype.addClassName = function(ele, className)

{

	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))

		return;

	ele.className += (ele.className ? " " : "") + className;

};
 

Spry.Widget.TabbedPanels.prototype.removeClassName = function(ele, className)

{

	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))

		return;

	ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");

};
 

Spry.Widget.TabbedPanels.setOptions = function(obj, optionsObj, ignoreUndefinedProps)

{

	if (!optionsObj)

		return;

	for (var optionName in optionsObj)

	{

		if (ignoreUndefinedProps && optionsObj[optionName] == undefined)

			continue;

		obj[optionName] = optionsObj[optionName];

	}

};
 

Spry.Widget.TabbedPanels.prototype.getTabGroup = function()

{

	if (this.element)

	{

		var children = this.getElementChildren(this.element);

		if (children.length)

			return children[0];

	}

	return null;

};
 

Spry.Widget.TabbedPanels.prototype.getTabs = function()

{

	var tabs = [];

	var tg = this.getTabGroup();

	if (tg)

		tabs = this.getElementChildren(tg);

	return tabs;

};
 

Spry.Widget.TabbedPanels.prototype.getContentPanelGroup = function()

{

	if (this.element)

	{

		var children = this.getElementChildren(this.element);

		if (children.length > 1)

			return children[1];

	}

	return null;

};
 

Spry.Widget.TabbedPanels.prototype.getContentPanels = function()

{

	var panels = [];

	var pg = this.getContentPanelGroup();

	if (pg)

		panels = this.getElementChildren(pg);

	return panels;

};
 

Spry.Widget.TabbedPanels.prototype.getIndex = function(ele, arr)

{

	ele = this.getElement(ele);

	if (ele && arr && arr.length)

	{

		for (var i = 0; i < arr.length; i++)

		{

			if (ele == arr[i])

				return i;

		}

	}

	return -1;

};
 

Spry.Widget.TabbedPanels.prototype.getTabIndex = function(ele)

{

	var i = this.getIndex(ele, this.getTabs());

	if (i < 0)

		i = this.getIndex(ele, this.getContentPanels());

	return i;

};
 

Spry.Widget.TabbedPanels.prototype.getCurrentTabIndex = function()

{

	return this.currentTabIndex;

};
 

Spry.Widget.TabbedPanels.prototype.getTabbedPanelCount = function(ele)

{

	return Math.min(this.getTabs().length, this.getContentPanels().length);

};
 

Spry.Widget.TabbedPanels.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) {}

};
 

Spry.Widget.TabbedPanels.prototype.onTabClick = function(e, tab)

{

	this.showPanel(tab);

};
 

Spry.Widget.TabbedPanels.prototype.onTabMouseOver = function(e, tab)

{

	this.addClassName(tab, this.tabHoverClass);

};
 

Spry.Widget.TabbedPanels.prototype.onTabMouseOut = function(e, tab)

{

	this.removeClassName(tab, this.tabHoverClass);

};
 

Spry.Widget.TabbedPanels.prototype.onTabFocus = function(e, tab)

{

	this.hasFocus = true;

	this.addClassName(this.element, this.tabFocusedClass);

};
 

Spry.Widget.TabbedPanels.prototype.onTabBlur = function(e, tab)

{

	this.hasFocus = false;

	this.removeClassName(this.element, this.tabFocusedClass);

};
 

Spry.Widget.TabbedPanels.ENTER_KEY = 13;

Spry.Widget.TabbedPanels.SPACE_KEY = 32;
 

Spry.Widget.TabbedPanels.prototype.onTabKeyDown = function(e, tab)

{

	var key = e.keyCode;

	if (!this.hasFocus || (key != Spry.Widget.TabbedPanels.ENTER_KEY && key != Spry.Widget.TabbedPanels.SPACE_KEY))

		return true;
 

	this.showPanel(tab);
 

	if (e.stopPropagation)

		e.stopPropagation();

	if (e.preventDefault)

		e.preventDefault();
 

	return false;

};
 

Spry.Widget.TabbedPanels.prototype.preorderTraversal = function(root, func)

{

	var stopTraversal = false;

	if (root)

	{

		stopTraversal = func(root);

		if (root.hasChildNodes())

		{

			var child = root.firstChild;

			while (!stopTraversal && child)

			{

				stopTraversal = this.preorderTraversal(child, func);

				try { child = child.nextSibling; } catch (e) { child = null; }

			}

		}

	}

	return stopTraversal;

};
 

Spry.Widget.TabbedPanels.prototype.addPanelEventListeners = function(tab, panel)

{

	var self = this;

	Spry.Widget.TabbedPanels.addEventListener(tab, "click", function(e) { return self.onTabClick(e, tab); }, false);

	Spry.Widget.TabbedPanels.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(e, tab); }, false);

	Spry.Widget.TabbedPanels.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(e, tab); }, false);
 

	if (this.enableKeyboardNavigation)

	{

		

		var tabIndexEle = null;

		var tabAnchorEle = null;
 

		this.preorderTraversal(tab, function(node) {

			if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)

			{

				var tabIndexAttr = tab.attributes.getNamedItem("tabindex");

				if (tabIndexAttr)

				{

					tabIndexEle = node;

					return true;

				}

				if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")

					tabAnchorEle = node;

			}

			return false;

		});
 

		if (tabIndexEle)

			this.focusElement = tabIndexEle;

		else if (tabAnchorEle)

			this.focusElement = tabAnchorEle;
 

		if (this.focusElement)

		{

			Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "focus", function(e) { return self.onTabFocus(e, tab); }, false);

			Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "blur", function(e) { return self.onTabBlur(e, tab); }, false);

			Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "keydown", function(e) { return self.onTabKeyDown(e, tab); }, false);

		}

	}

};
 

Spry.Widget.TabbedPanels.prototype.showPanel = function(elementOrIndex)

{

	var tpIndex = -1;

	

	if (typeof elementOrIndex == "number")

		tpIndex = elementOrIndex;

	else // Must be the element for the tab or content panel.

		tpIndex = this.getTabIndex(elementOrIndex);

	

	if (!tpIndex < 0 || tpIndex >= this.getTabbedPanelCount())

		return;
 

	var tabs = this.getTabs();

	var panels = this.getContentPanels();
 

	var numTabbedPanels = Math.max(tabs.length, panels.length);
 

	for (var i = 0; i < numTabbedPanels; i++)

	{

		if (i != tpIndex)

		{

			if (tabs[i])

				this.removeClassName(tabs[i], this.tabSelectedClass);

			if (panels[i])

			{

				this.removeClassName(panels[i], this.panelVisibleClass);

				panels[i].style.display = "none";

			}

		}

	}
 

	this.addClassName(tabs[tpIndex], this.tabSelectedClass);

	this.addClassName(panels[tpIndex], this.panelVisibleClass);

	panels[tpIndex].style.display = "block";
 

	this.currentTabIndex = tpIndex;

};
 

Spry.Widget.TabbedPanels.prototype.attachBehaviors = function(element)

{

	var tabs = this.getTabs();

	var panels = this.getContentPanels();

	var panelCount = this.getTabbedPanelCount();
 

	for (var i = 0; i < panelCount; i++)

		this.addPanelEventListeners(tabs[i], panels[i]);
 

	this.showPanel(this.defaultTab);

};

Open in new window

0
Comment
Question by:levio
2 Comments
 
LVL 44

Accepted Solution

by:
scrathcyboy earned 500 total points
ID: 22747132
Since no one is helping you, the best advice I can give you is to DUMP SPRY for any one of a hundred DHTML menus that do indeed work cross browser --

www.dynamicdrive.com/
www.dynamicdrive.com/dynamicindex1/
dhtml-menu.com/
www.milonic.com/
www.dynarch.com/products/dhtml-menu/
www.likno.com/
www.coffeecup.com/free-dhtml/

Most people I have tried to help with SPRY cannot get it to work, it seems to be a flawed product.
0
 
LVL 1

Author Closing Comment

by:levio
ID: 31505632
Thanks for your help, I will give those a try...
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Preface In the first article: A Better Website Login System (http://www.experts-exchange.com/A_2902.html) I introduced the EE Collaborative Login System and its intended purpose. In this article I will discuss some of the design consideratio…
What is Node.js? Node.js is a server side scripting language much like PHP or ASP but is used to implement the complete package of HTTP webserver and application framework. The difference is that Node.js’s execution engine is asynchronous and event…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
The viewer will the learn the benefit of plain text editors and code an HTML5 based template for use in further tutorials.

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now