function externalLinks() {
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++) {
		var anchor = anchors[i];
		anchor.onfocus = function() { this.blur(); }
		if (anchor.getAttribute("href") &&
			anchor.getAttribute("rel") == "external")
			anchor.target = "_blank";
	}
}

function setAll(func) {
	if (!document.getElementsByTagName) return;
	var selects = document.getElementsByTagName("select");
	for (var i=0; i<selects.length; i++ ) {
		var select = selects[i];
		var value = select.selectedIndex;
		if (func == 'increase') {
			select.selectedIndex = value + 1;
		}

		if ((func == 'decrease') && (select.selectedIndex != 0)) {
			select.selectedIndex = value - 1;
		}

		if (func == 'reset') {
			select.selectedIndex = 0;
		}
	}
}

function confirmDel(url) {
	if (confirm('Please confirm Deletion')) {
		window.location=url;
	}
}

function toggleDisp(div) {
	var element = document.getElementById(div);

	if (element.style.display == 'none') {
		Effect.SlideDown(div,{duration:.5}); return false;
	}
	else {
		Effect.SlideUp(div,{duration:.5}); return false;
	}
}

function show(what) {
	document.getElementById(what).style.display = 'block';
}

function numItems(num, which, whichArray, dropDownArray) {
	var container = document.getElementById(which + 'Items');

	num = parseInt(num);

	while (container.firstChild) container.removeChild(container.firstChild);

	if (!num) { return false; }
		if ((whichArray) && (which != 'image') && (which != 'input')) {
			if ((num > 0) && (num <= 4)) {
				for (var i=0; i<num; i++) {
					container.innerHTML = container.innerHTML + "<label for='" + which + "Item" + (i + 1) + "' class='smaller'>" + which + " " + (i + 1) + " Name</label><input type='text' name='" + which + "Name_" + (i + 1) + "' value='" + whichArray[i] + "' id='" + which + "Item" + (i + 1) + "' size='30'><br>";
					if (dropDownArray)
					{
						var dropDownChecked = "";
						if (dropDownArray[i])
						{
							dropDownChecked = "CHECKED";
						}
						var dropdownCheckBox = "<label for='" + which + "ItemCheckBox" + (i + 1) + "' class='smaller'> dropdown </label><input type='checkbox' name='" + which + "DropDown_" + (i + 1) + "' value='1' id='" + which + "ItemCheckBox" + (i + 1) + "' "+dropDownChecked+"\><br>";
						container.innerHTML = container.innerHTML + dropdownCheckBox;

					}
				}
			}
			else { 
				alert('An integer between 1 and 4 is required'); this.value='';
			}
		}

		if ((whichArray) && (which == 'image')) {
			if ((num > 0) && (num <= 10)) {
				for (var i=0; i<num; i++) {
					container.innerHTML = container.innerHTML + "<div class='item'><label for='" + which + "_name" + (i + 1) + "' class='caps'>" + which + " " + (i + 1) + " Name</label><input type='text' name='" + which + "_name" + (i + 1) + "' value='" + whichArray[i] + "' id='" + which + "_name" + (i + 1) + "' size='30'><br><label for='" + which + "_file" + (i + 1) + "' class='caps'>" + which + " " + (i + 1) + " File</label><input type='file' name='" + which + "_file" + (i + 1) + "' id='" + which + "_file" + (i + 1) + "'><br><label for='" + which + "_desc" + (i + 1) + "' class='caps'>" + which + " " + (i + 1) + " Desc</label><textarea name='" + which + "_desc" + (i + 1) + "' id='" + which + "_desc" + (i + 1) + "'></textarea><br></div>"
				}
			}
			else {
				alert('An integer between 1 and 10 is required'); this.value='';
			}
		}

		if ((whichArray) && (which == 'input')) {
			if ((num > 0) && (num <= 15)) {
				for (var i=0; i<num; i++) {
					container.innerHTML = container.innerHTML + "<label for='" + which + "Item" + (i + 1) + "' class='smaller'>" + which + " " + (i + 1) + " Name</label><input type='text' name='" + which + "Name_" + (i + 1) + "' value='" + whichArray[i] + "' id='" + which + "Item" + (i + 1) + "' size='30'><br>";
				}
			}
			else { 
				alert('An integer between 1 and 15 is required'); this.value='';
			}
		}
	}

window.onload = function() { externalLinks(); }

function duplicateInput(from, to) {
	document.getElementById(to).value=from.value;
}

/*
        TableSort revisited v0.1 by frequency-decoder.com (10/09/2006)

        Released under a creative commons Attribution-NoDerivs 2.5 license (http://creativecommons.org/licenses/by-nd/2.5/)
*/

var fdTableSort = {

        regExp_Currency:        /^[?$???]/,
        regExp_Number:          /^(\-)?[0-9]+(\.[0-9]*)?$/,
        pos:                    -1,
        uniqueHash:             1,
        thNode:                 null,
        tableCache:             {},
        tableId:                null,
        
        addEvent: function(obj, type, fn) {
                if( obj.attachEvent ) {
                        obj["e"+type+fn] = fn;
                        obj[type+fn] = function(){obj["e"+type+fn]( window.event );}
                        obj.attachEvent( "on"+type, obj[type+fn] );
                } else
                        obj.addEventListener( type, fn, false );
        },

        stopEvent: function(e) {
                e = e || window.event;

                if(e.stopPropagation) {
                        e.stopPropagation();
                        e.preventDefault();
                }
                /*@cc_on@*/
                /*@if(@_win32)
                e.cancelBubble = true;
                e.returnValue = false;
                /*@end@*/
                return false;
        },

        init: function() {
                if (!document.getElementsByTagName) return;

                var tables = document.getElementsByTagName('table');
                var sortable, headers, thtext, aclone, a, span, columnNum, noArrow;

                a               = document.createElement("a");
                a.href          = "#";
                a.onkeypress    = fdTableSort.keyWrapper;

                span            = document.createElement("span");
                
                for(var t = 0, tbl; tbl = tables[t]; t++) {

                        headers   = tbl.getElementsByTagName('th');
                        sortable  = false;
                        columnNum = tbl.className.search(/sortable-onload-([0-9]+)/) != -1 ? parseInt(tbl.className.match(/sortable-onload-([0-9]+)/)[1]) - 1 : -1;
                        showArrow = tbl.className.search(/no-arrow/) == -1;
                        
                        // Remove any old dataObj for this table (tables created from an ajax callback require this)
                        if(tbl.id && tbl.id in fdTableSort.tableCache) delete fdTableSort.tableCache[tbl.id];
                        
                        for (var z=0, th; th = headers[z]; z++) {
                        
                                // Remove previously applied classes for the ajaxers also
                                th.className = th.className.replace(/forwardSort|reverseSort/, "");
                                
                                if(th.className.match('sortable')) {
                                        if(z == columnNum) sortable = th;
                                        thtext = fdTableSort.getInnerText(th);

                                        while(th.firstChild) th.removeChild(th.firstChild);

                                        // Create the link
                                        aclone = a.cloneNode(true);
                                        aclone.appendChild(document.createTextNode(thtext));
                                        aclone.title = "Sort on " + thtext;
                                        a.onclick = th.onclick = fdTableSort.clickWrapper;
                                        th.appendChild(aclone);
                                        
                                        // Add the span if needs be
                                        if(showArrow) th.appendChild(span.cloneNode(false));
                                        
                                        var cn = "fd-column-" + z;
                                        th.className = th.className.replace(/fd-identical|fd-not-identical/, "").replace(cn, "") + " " + cn;
                                };
                        };

                        if(sortable) {
                                fdTableSort.thNode = sortable;
                                fdTableSort.initSort();
                        };
                };
        },

        clickWrapper: function(e) {
                e = e || window.event;
                if(fdTableSort.thNode == null) {
                        fdTableSort.thNode = this;
                        fdTableSort.addSortActiveClass();
                        setTimeout("fdTableSort.initSort()",5);

                };
                return fdTableSort.stopEvent(e);
        },

        keyWrapper: function(e) {
                e = e || window.event;
                var kc = e.keyCode != null ? e.keyCode : e.charCode;
                if(kc == 13) {
                        var targ = this;
                        while(targ.tagName.toLowerCase() != "th") targ = targ.parentNode;

                        fdTableSort.thNode = targ;
                        fdTableSort.addSortActiveClass();
                        setTimeout("fdTableSort.initSort()",5);

                        return fdTableSort.stopEvent(e);
                };
                return true;
        },

        jsWrapper: function(tableid, colNum) {
                var table = document.getElementById(tableid);
                var node  = table.getElementsByTagName('th')[colNum];
                if(!node || node.className.search(/fd-column/) == -1) return false;
                fdTableSort.thNode = node;
                fdTableSort.addSortActiveClass();
                setTimeout("fdTableSort.initSort()",5);
        },
        
        addSortActiveClass: function() {
                if(fdTableSort.thNode == null) return;
                var body = document.getElementsByTagName('body')[0];
                fdTableSort.thNode.className = fdTableSort.thNode.className + " sort-active";
                body.className = body.className + " sort-active";
                if("sortInitiatedCallback" in window) sortInitiatedCallback();
        },
        
        removeSortActiveClass: function() {
                var body = document.getElementsByTagName('body')[0];
                fdTableSort.thNode.className = fdTableSort.thNode.className.replace("sort-active", "");
                body.className = body.className.replace("sort-active", "");
                if("sortCompleteCallback" in window) sortCompleteCallback();
        },
        
        prepareTableData: function(table) {
                // Create a table id if needs be
                if(!table.id) table.id = "fd-table-" + fdTableSort.uniqueHash++;

                var data = [];
                
                var start = table.getElementsByTagName('tbody');
                start = start.length ? start[0] : table;

                var trs = start.getElementsByTagName('tr');
                var ths = table.getElementsByTagName('th');

                var numberOfRows = trs.length;
                var numberOfCols = ths.length;
                
                var data = [];
                var identical = new Array(numberOfCols);
                var identVal  = new Array(numberOfCols);
                
                var tr, td, th, txt, tds, col, row;
                
                var rowCnt = 0;
                
                // Start to create the 2D matrix of data
                for(row = 0; row < numberOfRows; row++) {
                
                        tr              = trs[row];
                        
                        // Have we any th tags or are we in a tfoot ?
                        if(tr.getElementsByTagName('th').length > 0 || (tr.parentNode && tr.parentNode.tagName == "TFOOT")) continue;

                        data[rowCnt]    = [];
                        tds             = tr.getElementsByTagName('td');
                        
                        for(col = 0; col < numberOfCols; col++) {
                                th = ths[col];

                                if(th.className.search(/sortable/) == -1) continue;
                                
                                td  = tds[col];
                                txt = fdTableSort.getInnerText(td) + " ";
                                txt = txt.replace(/^\s+/,'').replace(/\s+$/,'');
                                
                                if(th.className.search(/sortable-date/) != -1) {
                                        txt = fdTableSort.dateFormat(txt);
                                } else if(th.className.search(/sortable-numeric|sortable-currency/) != -1) {
                                        txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
                                        if(isNaN(txt)) txt = "";
                                } else if(th.className.search(/sortable-text/) != -1) {
                                        txt = txt.toLowerCase();
                                } else if(th.className.search(/sortable-([a-zA-Z\_]+)/) != -1) {
                                        if((th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData") in window) {
                                                txt = window[th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData"](td, txt);
                                        };
                                } else {
                                        if(txt != "") {
                                                th.className = th.className.replace(/sortable/, "");
                                                if(fdTableSort.dateFormat(txt) != 0) {
                                                        th.className = th.className + " sortable-date";
                                                        txt = fdTableSort.dateFormat(txt);
                                                } else if(txt.search(fdTableSort.regExp_Number) != -1 || txt.search(fdTableSort.regExp_Currency) != -1) {
                                                        th.className = th.className + " sortable-numeric";
                                                        txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
                                                        if(isNaN(txt)) txt = "";
                                                } else {
                                                        th.className = th.className + " sortable-text";
                                                        txt = txt.toLowerCase();
                                                };
                                        };
                                };
                                
                                if(rowCnt > 0 && identVal[col] != txt) {
                                        identical[col] = false;
                                };
                                
                                identVal[col]     = txt;
                                data[rowCnt][col] = txt;
                        };

                        // Add the tr for this row
                        data[rowCnt][numberOfCols] = tr;

                        // Increment the row count
                        rowCnt++;
                }

                // Get the row and column styles
                var colStyle = table.className.search(/colstyle-([\S]+)/) != -1 ? table.className.match(/colstyle-([\S]+)/)[1] : false;
                var rowStyle = table.className.search(/rowstyle-([\S]+)/) != -1 ? table.className.match(/rowstyle-([\S]+)/)[1] : false;

                // Cache the data object for this table
                fdTableSort.tableCache[table.id] = { data:data, pos:-1, identical:identical, colStyle:colStyle, rowStyle:rowStyle, noArrow:table.className.search(/no-arrow/) != -1 };
        },
        
        initSort: function() {
                var span;
                var thNode      = fdTableSort.thNode;

                // Get the table
                var tableElem   = fdTableSort.thNode;
                while(tableElem.tagName.toLowerCase() != 'table' && tableElem.parentNode) {
                        tableElem = tableElem.parentNode;
                };

                // If this is the first time that this table has been sorted, create the data object
                if(!tableElem.id || !(tableElem.id in fdTableSort.tableCache)) {
                        fdTableSort.prepareTableData(tableElem);
                };

                // Cache the table id
                fdTableSort.tableId = tableElem.id;

                // Get the column position using the className added earlier
                fdTableSort.pos = thNode.className.match(/fd-column-([0-9]+)/)[1];

                // Grab the data object for this table
                var dataObj     = fdTableSort.tableCache[tableElem.id];
                
                // Get the position of the last column that was sorted
                var lastPos     = dataObj.pos;
                
                // Get the stored data object for this table
                var data        = dataObj.data;
                var colStyle    = dataObj.colStyle;
                var rowStyle    = dataObj.rowStyle;
                var len1        = data.length;
                var len2        = data[0].length - 1;
                var identical   = dataObj.identical[fdTableSort.pos] == false ? false : true;
                var noArrow     = dataObj.noArrow;
                
                if(lastPos != fdTableSort.pos && lastPos != -1) {
                        var th = thNode.parentNode.getElementsByTagName('th')[lastPos];
                        th.className = th.className.replace(/forwardSort|reverseSort/g,'');
                        if(!noArrow) {
                                // Remove arrow
                                span = th.getElementsByTagName('span')[0];
                                while(span.firstChild) span.removeChild(span.firstChild);
                                // span.appendChild(document.createTextNode("\u00a0\u00a0"));
                        };
                };

                // If the same column is being sorted then just reverse the data object contents.
                if(lastPos == fdTableSort.pos && !identical) {
                        data.reverse();
                        var classToAdd = thNode.className.search(/reverseSort/) != -1 ? "forwardSort" : "reverseSort";
                        thNode.className = thNode.className.replace(/forwardSort|reverseSort/g,'') + " " + classToAdd;
                } else {
                        fdTableSort.tableCache[tableElem.id].pos = fdTableSort.pos;
                        if(!identical) {
                                if(thNode.className.match(/sortable-numeric|sortable-currency|sortable-date/)) {
                                        data.sort(fdTableSort.sortNumeric);
                                } else if(thNode.className.match('sortable-text')) {
                                        data.sort(fdTableSort.sortText);
                                } else if(thNode.className.search(/sortable-([a-zA-Z\_]+)/) != -1 && thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1] in window) {
                                        data.sort(window[thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1]]);
                                };
                        };
                        thNode.className = thNode.className.replace(/forwardSort|reverseSort/g,'') + " forwardSort";
                };
                
                if(!rowStyle && !colStyle && identical) {
                        fdTableSort.removeSortActiveClass();
                        fdTableSort.thNode = null;
                        return;
                }
                
                var hook = tableElem.getElementsByTagName('tbody');
                hook = hook.length ? hook[0] : tableElem;

                var td, tr;
                
                for(var i = 0; i < len1; i++) {
                        tr = data[i][len2];
                        if(colStyle) {
                                if(lastPos != -1) {
                                        td = tr.getElementsByTagName('td')[lastPos];
                                        td.className = td.className.replace(colStyle, "");
                                }
                                td = tr.getElementsByTagName('td')[fdTableSort.pos];
                                td.className = (typeof td.className != "undefined" ? td.className  : "") + " " + colStyle;
                        };
                        if(!identical) {
                                if(rowStyle) {
                                        tr.className = tr.className.replace(rowStyle);
                                        if(i % 2) tr.className = (typeof tr.className != "undefined" ? tr.className : "") + " " + rowStyle;
                                };
                                hook.appendChild(tr);
                        };
                };
                fdTableSort.removeSortActiveClass();
                fdTableSort.thNode = null;
        },

        getInnerText: function(el) {
                if (typeof el == "string" || typeof el == "undefined") return el;
                if(el.innerText) return el.innerText;

                var txt = '', i;
                for (i = el.firstChild; i; i = i.nextSibling) {
                        if (i.nodeType == 3)            txt += i.nodeValue;
                        else if (i.nodeType == 1)       txt += fdTableSort.getInnerText(i);
                };

                return txt;
        },

        dateFormat: function(dateIn) {
                var y, m, d, res;

                // mm-dd-yyyy
                if(dateIn.match(/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/)) {
                        res = dateIn.match(/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/);
                        y = res[5];
                        m = res[1];
                        d = res[3];
                // dd-mm-yyyy
                } else if(dateIn.match(/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/)) {
                        res = dateIn.match(/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/);
                        y = res[5];
                        m = res[3];
                        d = res[1];
                // yyyy-mm-dd
                } else if(dateIn.match(/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/)) {
                        res = dateIn.match(/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/);
                        y = res[1];
                        m = res[3];
                        d = res[5];
                } else return 0;

                if(m.length == 1) m = "0" + m;
                if(d.length == 1) d = "0" + d;
                if(y.length == 1) y = '0' + y;
                if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y;

                return y+m+d;
        },

        sortDate: function(a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];

                return aa - bb;
        },

        sortNumeric:function (a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];

                if(aa === "" && !isNaN(bb)) return -1;
                else if(bb === "" && !isNaN(aa)) return 1;
                else if(aa == bb) return 0;

                return aa - bb;
        },

        sortText:function (a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];
                
                if(aa == bb) return 0;
                if(aa < bb)  return -1;

                return 1;
        }
};

fdTableSort.addEvent(window, "load", fdTableSort.init);


/*******************************

NEW CONTENT MANAGEMENT AREA 

*******************************/

function contentSelect(which) {
	var contentEls = getElementsByClassName(document, "div", "contentStyle");

	for (var i=0; i<contentEls.length; i++) {
		contentEls[i].style.display = 'none';
	}

	toggleDisp('content' + which);
}

function colSelect(which) {
	document.getElementById('column1').style.display = 'none';
	document.getElementById('column2').style.display = 'none';
	document.getElementById('orientSelect').style.display = 'none';

	if (which == 'col1') {
		toggleDisp('column1');
	}

	if (which == 'col2') {
		toggleDisp('column1');
		toggleDisp('column2');
		toggleDisp('orientSelect');
	}
}

function updateTitle(which,what) {
	document.getElementById(which).innerHTML = what;
}

function toggleEditor(id) {
	var elm = document.getElementById(id);

	if (tinyMCE.getInstanceById(id) == null)
		tinyMCE.execCommand('mceAddControl', false, id);
	else
		tinyMCE.execCommand('mceRemoveControl', false, id);
}


function addTabs(num) {
	var tabArea = document.getElementById('tabList');
	tabArea.innerHTML = '';

	for (var i=1; i<=num; i++){
		tabArea.innerHTML = tabArea.innerHTML + "<li class='component' id='t1_tab"+i+"'><strong id='tab"+i+"Title' onMouseDown=toggleEditor('longDesc"+i+"'); onMouseUp=toggleEditor('longDesc"+i+"');>Tab "+i+"</strong><a href='javascript:void(0);' onClick=toggleDisp('component"+i+"') class='collapse'>Collapse</a><ol id='component"+i+"'><li><label for='param_title"+i+"'>Title of tab</label><input type='text' name='title"+i+"' id='param_title"+i+"' size='30' onKeyUp=updateTitle('tab"+i+"Title',this.value) /></li><li><label for='param_tab"+i+"'>Section heading</label><input type='text' name='tab"+i+"' id='param_tab"+i+"' size='50' /></li><li><label for='param_longDesc"+i+"'>Content</label><div class='rteHolder'><textarea name='tabText"+i+"' id='longDesc"+i+"' class='mce' cols='80' rows='10' style='width: 600px; height: 300px;'></textarea></div></li></ol></li>";
		}
	for (var i=1; i<=num; i++){
		tinyMCE.execCommand('mceAddControl', false, "longDesc" + i);
	}
	Sortable.create('tabList', {tree:false,scroll:window});
	
	}


/********************************************************************************************************************

				 	COMMON FUNCTIONS AREA
				
********************************************************************************************************************/



/*******************************************************************************************************************/
//*** Cross browser attach event function. For 'evt' pass a string value with the leading "on" omitted
//*** e.g. AttachEvent(window,'load',MyFunctionNameWithoutParenthesis,false);
/*******************************************************************************************************************/

function AttachEvent(obj,evt,fnc,useCapture){
	if (!useCapture) useCapture=false;
	if (obj.addEventListener){
		obj.addEventListener(evt,fnc,useCapture);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
	else{
		MyAttachEvent(obj,evt,fnc);
		obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
	}
} 

//The following are for browsers like NS4 or IE5Mac which don't support either
//attachEvent or addEventListener
function MyAttachEvent(obj,evt,fnc){
	if (!obj.myEvents) obj.myEvents={};
	if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
	var evts = obj.myEvents[evt];
	evts[evts.length]=fnc;
}

function MyFireEvent(obj,evt){
	if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
	var evts = obj.myEvents[evt];
	for (var i=0,len=evts.length;i<len;i++) evts[i]();
}	



function DetachEvent(obj, evt, fnc, useCapture)
{
	if (!useCapture) useCapture=false;
	
	if (obj.removeEventListener)
	{
		obj.removeEventListener(evt, fnc, useCapture);
	}
	else
	{
		obj.detachEvent("on"+evt,fnc);	
	}
}

/*******************************************************************************************************************/
//*** Name: 	addLoadEvent
//*** Params:	func - function to add to window onload
//*** Purpose: 	Adds a function to window.onload which will be executed when the page has fully loaded.  This 
//***			function takes into account if another function has already been set and adds to it rather than
//***			overwrite it.
//*** Return:   Array of elements
/*******************************************************************************************************************/

function AddLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}


/*******************************************************************************************************************/
//*** Name: 	getElementsByClassName
//*** Params:	oElm = root elemet, strTagName = check these elements, strClassname = elements with classname of
//*** Purpose: 	Gets elements by class name
//*** Return:   Array of elements
/*******************************************************************************************************************/

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}


/*******************************************************************************************************************/
//***   Name: getDomain
//*** 	Purpose: Gets domain of site
//***   Params: none
//***   Return: none
/*******************************************************************************************************************/

function getDomain()
{
	var url = window.location.href;
	url = url.replace("http://", "");
	var domain = domain = url.indexOf("/") == -1 ? url : url.substring(0, url.indexOf("/"));
	
	return "http://" + domain;
}


/*******************************************************************************************************************/
//*** Set of functions related to css classes
//*** 	AddClass - adds class to an element
//***	RemoveClass - removes class from an element
//***	HasClass - checks if an element has that class
/*******************************************************************************************************************/

//***Adds a new class to an object, preserving existing classes
function AddClass(obj,cName){ RemoveClass(obj,cName); return obj && (obj.className+=(obj.className.length>0?' ':'')+cName); }

//***Removes a particular class from an object, preserving other existing classes.
function RemoveClass(obj,cName){ return obj && (obj.className=obj.className.replace(new RegExp("^"+cName+"\\b\\s*|\\s*\\b"+cName+"\\b",'g'),'')); }

//***Returns true if the object has the class assigned, false otherwise.
function HasClass(obj,cName){ return (!obj || !obj.className)?false:(new RegExp("\\b"+cName+"\\b")).test(obj.className) }


/** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08        **
 ** Code licensed under Creative Commons Attribution-ShareAlike License      **
 ** http://creativecommons.org/licenses/by-sa/2.0/                           **/
function XHConn()
{
  var xmlhttp, bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    try {
      if (sMethod == "GET")
      {
        xmlhttp.open(sMethod, sURL+"?"+sVars, true);
        sVars = "";
      }
      else
      {
        xmlhttp.open(sMethod, sURL, true);
        xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }
      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && !bComplete)
        {
          bComplete = true;
          fnDone(xmlhttp);
        }};
      xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
  };
  return this;
}


/********************************************************************************************************************

				 	END COMMON FUNCTIONS AREA
				
********************************************************************************************************************/













/********************************************************************************************************************

				 	ADD EDIT PRODUCTS PAGE CODE
				
********************************************************************************************************************/

// What number component we are on adding
var componentIdentifier = 0


/*******************************************************************************************************************/
//*** Name: 	addColumnControls
//*** Params:	none
//*** Purpose: 	Adds controls like "addContent" to the screen"
//*** Return:   none
/*******************************************************************************************************************/


function addColumnControls()
{
	
	if (document.getElementById("add-content") || document.getElementById("edit-content"))
	{
		// Get columns
		var arrColumns = getElementsByClassName(document, "div", "column");

		// Add controls to each column	
		for (var i=0; i<arrColumns.length; i++)
		{

			// Create Add content links		
			var objAddContent = document.createElement("button");
			var objTextNode = document.createTextNode("Insert Content Element");
			objAddContent.appendChild(objTextNode);
			objAddContent.setAttribute("type", "button");
			AddClass(objAddContent, "addContent");
			AddClass(objAddContent, "blue");
			AddClass(objAddContent, "indented");
			AttachEvent(objAddContent, "click", displayColumnAddContentMenu );

			// Create order textbox
			var objOrder = document.createElement("input");
			objOrder.type = "hidden";
			objOrder.id = objOrder.name = arrColumns[i].id + "_order";

			arrColumns[i].appendChild(objOrder);			
			arrColumns[i].appendChild(objAddContent);

			AttachEvent(arrColumns[i], "click", hideColumnContentMenu );
		}
	}
	
	
	if (document.getElementById("edit-content"))
	{
		// Get columns
		var arrColumns = getElementsByClassName(document, "div", "column");

		// Add controls to each column	
		for (var i=0; i<arrColumns.length; i++)
		{
			var addEls = getElementsByClassName(document, "*", "component");
			
			for (var k=0; k<addEls.length; k++)
			{
				var componentID = addEls[k].id;
				
				if (componentID.indexOf("featuredlisting")>-1)
				{
					addComponent(null, new FeaturedProductListingComponent({ column:arrColumns[i], componentID: componentID }));
				}
				else if (componentID.indexOf("productlisting")>-1)
				{
					addComponent(null, new ProductListingComponent({ column:arrColumns[i], componentID: componentID }));
				}
				else if (componentID.indexOf("news")>-1)
				{
					var numberID = componentID.replace("news","");
					
					var numItems = document.getElementById("param_numItems" + numberID).value;
					var listAll = document.getElementById("param_listAll" + numberID).value;
					
					if (listAll == "checked") { listAll = true; }
					else { listAll = false; }
					
					addComponent(null, new NewsComponent({ column:arrColumns[i], componentID: componentID, numItems: numItems, listAll: listAll }));
				}
				else if (componentID.indexOf("rte")>-1)
				{
					var numberID = componentID.replace("rte","");

					var customText = document.getElementById("customText" + numberID).value;
					
					addComponent(null, new CustomTextComponent({ column:arrColumns[i], componentID: componentID, numItems: numItems, customText: customText }));
				}
				
				addEls[k].parentNode.removeChild(addEls[k]);
				
			}
		}
						
		// Need to reupdate now that we removed the original elements we used to generate new components from
		// Since it used the component class, duplicate ids would show in the ordering (the original for editing
		// + the newly generated component so it needs to be reordered when done)
		// Issue with all cols, easiest just to update at the end of this all
		updateAllColOrder();
	}
}

AddLoadEvent(addColumnControls);



/*******************************************************************************************************************/
//*** Name: 	displayAddContentMenu
//*** Params:	e - event
//*** Purpose: 	Displays add content menu
//*** Return:   none
/*******************************************************************************************************************/

function displayColumnAddContentMenu(e)
{
	// Get element event relates too
	var el = e.target || e.srcElement;
	
	// Get column
	var objCol = el.parentNode;
	
	// Don't show if menu is already showing
	if (!getElementsByClassName(objCol, "*", "addContentMenu")[0])
	{
		var objList = document.createElement("ul");
		
		// Add News
		var objAddNews = document.createElement("li");
		var objAnchor = document.createElement("a");
		var objTextNode = document.createTextNode("News");
		objAnchor.appendChild(objTextNode);
		objAnchor.title = "Inserts a quick list of all your site news";
		AttachEvent(objAnchor, "click", function(e) { addComponent(e, new NewsComponent()); });
		objAddNews.appendChild(objAnchor);

		// Add Custom Text
		var objCustomText = document.createElement("li");
		objAnchor = document.createElement("a");
		objTextNode = document.createTextNode("Custom Text");
		objAnchor.appendChild(objTextNode);
		objAnchor.title = "Allows you to enter text using a Rich Text Editor";
		AttachEvent(objAnchor, "click", function(e) { addComponent(e, new CustomTextComponent()); });
		objCustomText.appendChild(objAnchor);


		var objProductListing = document.createElement("li");
		objAnchor = document.createElement("a");
		objTextNode = document.createTextNode("Product Category List");
		objAnchor.appendChild(objTextNode);
		objAnchor.title = "Inserts a list of your current product categories";
		AttachEvent(objAnchor, "click", function(e) { addComponent(e, new ProductListingComponent()); });
		objProductListing.appendChild(objAnchor);

		// Add Featured Product Listing
		var objFeatured = document.createElement("li");
		objAnchor = document.createElement("a");
		objTextNode = document.createTextNode("Featured Product List");
		objAnchor.appendChild(objTextNode);
		objAnchor.title = "Lists all the featured products";
		AttachEvent(objAnchor, "click", function(e) { addComponent(e, new FeaturedProductListingComponent()); });
		objFeatured.appendChild(objAnchor);

		// Add items to list
		objList.appendChild(objAddNews);
		objList.appendChild(objCustomText);

// removed for arentals
		objList.appendChild(objProductListing);
		objList.appendChild(objFeatured);

		// Add class to element
		AddClass(objList, "addContentMenu");

		// Append list to bottom of the column
		el.parentNode.appendChild(objList);
	}
}


/*******************************************************************************************************************/
//*** Name: 	hideColumnContentMenu
//*** Params:	objCol - column element
//*** Purpose: 	Displays add content menu
//*** Return:   none
/*******************************************************************************************************************/

function hideColumnContentMenu(e)
{
	// Stop bubbling so this is only called once
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	
	// Get element event relates too (need to make sure it wasnt when we clicked add content element)
	var el = e.target || e.srcElement;
	
	
	// Get column
	var objCol = el;
	
	while (!HasClass(objCol, "column"))
	{
		objCol = objCol.parentNode;
	}
	
	
	// Get menu
	// Assumption - Only one menu per column
	var objAddContentMenu = getElementsByClassName(objCol, "*", "addContentMenu")[0];
	
	
	// Make sure a) column exists  b) menu exists  c) an add content element was not pressed
	if (objCol && objAddContentMenu && !HasClass(el,"addContent"))
	{
		objCol.removeChild(objAddContentMenu);
	}
}


/*******************************************************************************************************************/
//*** Name: 	addComponent
//*** Params:	e - event, objComponent - gui component
//*** Purpose: 	Adds component to proper column
//*** Return:   none
/*******************************************************************************************************************/

function addComponent(e, objComponent)
{

	componentProperties = objComponent.getProperties();
	
	// No column specified, find out what one it came from
	// Add has no column yet onclick but edit will
	if (e && !componentProperties)
	{
		// Incremement component counter
		componentIdentifier++;

		// Get element event relates too (need to make sure it wasnt when we clicked add content element)
		var el = e.target || e.srcElement;


		// Get column
		var objCol = el;

		while (!HasClass(objCol, "column"))
		{
			objCol = objCol.parentNode;
		}
		
	}
	else
	{
		objCol = componentProperties["column"];	
	}
	
	// Render component
	var objComponentRendered = objComponent.render();
	
	AddClass(objComponentRendered, objCol.id);
	
	// Get add content element, adding component before that
	var objAddContent = getElementsByClassName(objCol, "*", "addContent")[0];
	
	// Add to column as last item
	objCol.insertBefore(objComponentRendered, objAddContent);
	
	Sortable.create(objCol.id, { tag:'div', hoverclass: 'drophover', onChange: function(element) { updateColOrder(objCol) } });
	
	// Update column order
	updateColOrder(objCol);
	

}


/*******************************************************************************************************************/
//*** Name: 	removeComponent
//*** Params:	e - event
//*** Purpose: 	Removes component
//*** Return:   none
/*******************************************************************************************************************/

function removeComponent(e)
{
	
	// Get element event relates too (need to make sure it wasnt when we clicked add content element)
	var el = e.target || e.srcElement;
	
	while(!HasClass(el, "component"))
	{
		el = el.parentNode;
	}
	
	// Get column
	var objCol = el;
	
	while (!HasClass(objCol, "column"))
	{
		objCol = objCol.parentNode;
	}
	
	if (confirm("Please confirm deletion"))
	{
		objCol.removeChild(el);

		// Update column order
		updateColOrder(objCol);
	}
	
}



/*******************************************************************************************************************/
//*** Name: 	updateColOrder
//*** Params:	objCol - column element
//*** Purpose: 	Reorders column after a component has been added or moved
//*** Return:   none
/*******************************************************************************************************************/

function updateColOrder(objCol)
{
	var strOrd = "";
	var objComponents = getElementsByClassName(objCol, "div", "component");
	
	for (var i=0; i<objComponents.length; i++)
	{
		strOrd += objComponents[i].id + ",";
	}
	
	strOrd = strOrd.substr(0, strOrd.length-1);
	
	document.getElementById(objCol.id + "_order").value = strOrd;
}

/*******************************************************************************************************************/
//*** Name: 	updateAllColOrder
//*** Params:	none
//*** Purpose: 	Reorders all columns
//*** Return:   none
/*******************************************************************************************************************/

function updateAllColOrder()
{
	var strOrd = "";
	var objCols = getElementsByClassName(document, "div", "column");
	
	for (var i=0; i<objCols.length; i++)
	{
		updateColOrder(objCols[i]);
	}
	
}




/*******************************************************************************************************************/
//*** COMPONENT CLASSES AND COMPONENT STATIC METHODS
/*******************************************************************************************************************/


/*******************************************************************************************************************/
//*** Class: 	NewsComponent
//*** Params:	none
//*** Purpose: 	News component object
//*** Return:   none
/*******************************************************************************************************************/

function NewsComponent(newComponentProperties)
{
	var componentProperties = newComponentProperties;
	
	this.setProperties = function(newComponentProperties)
	{
		componentProperties = newComponentProperties;
	}
	
	this.getProperties = function()
	{
		return componentProperties;
	}
}

NewsComponent.prototype.render = function() 
{ 
	
	// Set up div
	var objEl = document.createElement("div");
	AddClass(objEl, "component");
	
	if (componentProperties && componentProperties["componentID"])
	{
		objEl.id = componentProperties["componentID"];
	}
	else
	{
		while(document.getElementById("news" + componentIdentifier))
		{
			componentIdentifier++;
		}

		objEl.id = "news" + componentIdentifier;
	}

	// Add Strong
	var objStrong = document.createElement("strong");
	var objTextNode = document.createTextNode("Site News");
	objStrong.appendChild(objTextNode);
	objEl.appendChild(objStrong);

	// Add paragraph
	var objParagraph = document.createElement("p");
	objTextNode = document.createTextNode("Lists all the news which are managed in the Site News area. This will display an abbreviated list of x amount of news items with an option to click for more information. The List All function allows your users to view all previous news posts.");
	objParagraph.appendChild(objTextNode);
	objEl.appendChild(objParagraph);

	var numItemsID;
	var numItemsValue;

	// Set up labels and text fields
	if (componentProperties && componentProperties["componentID"] && componentProperties["numItems"])
	{
		var numID = componentProperties["componentID"].replace("news","");
		numItemsID = "param_numItems" + numID;
		numItemsValue = componentProperties["numItems"];
	}
	else
	{
		numItemsID = "param_numItems" + componentIdentifier;
		numItemsValue = "";
	}
	
	var objLabel = document.createElement("label");
	var objInput = document.createElement("input");
	
	objTextNode = document.createTextNode("Number of items");
	objLabel.htmlFor = objInput.id = objInput.name = numItemsID;
	objInput.value = numItemsValue;
	objLabel.appendChild(objTextNode);
	objInput.type = "text";
	
	objEl.appendChild(objLabel);
	objEl.appendChild(objInput);
	objEl.appendChild(document.createElement("br"));
	
	
	var listAllId;
	
	// Set up labels and text fields
	if (componentProperties && componentProperties["componentID"] && componentProperties["listAll"])
	{
		var numID = componentProperties["componentID"].replace("news","");
		listAllId = "param_listAll" + numID;
		listAllValue = componentProperties["listAll"];
	}
	else
	{
		listAllId = "param_listAll" + componentIdentifier;
		listAllValue = false;
	}

	var objInput = document.createElement("input");
	var objLabel = document.createElement("label");
	
	objTextNode = document.createTextNode("Show list all button");
	objLabel.htmlFor = objInput.id = objInput.name = listAllId;
	objLabel.appendChild(objTextNode);
	objInput.type = "checkbox";
	objInput.checked = listAllValue;

	objEl.appendChild(objLabel);
	objEl.appendChild(objInput);
	objEl.appendChild(document.createElement("br"));

	// Create spans and links
	var objSpan = document.createElement("span");

	var objClose = document.createElement("a");
	AddClass(objClose, "button");
	AddClass(objClose, "del");
	AttachEvent(objClose, "click", removeComponent);
	objTextNode = document.createTextNode("Delete");
	objClose.appendChild(objTextNode);
	objClose.title="Delete this content element";
	objSpan.appendChild(objClose);
	objEl.appendChild(objSpan);
	

	return objEl;
	
};


/*******************************************************************************************************************/
//*** Class: 	ProductListingComponent
//*** Params:	none
//*** Purpose: 	Product listing component object
//*** Return:   none
/*******************************************************************************************************************/

function ProductListingComponent(newComponentProperties)
{
	var componentProperties = newComponentProperties;
	
	this.setProperties = function(newComponentProperties)
	{
		componentProperties = newComponentProperties;
	}
	
	this.getProperties = function()
	{
		return componentProperties;
	}
}

ProductListingComponent.prototype.render = function() { 

	var objEl = document.createElement("div");
	AddClass(objEl, "component");
	
	if (componentProperties && componentProperties["componentID"])
	{
		objEl.id = componentProperties["componentID"];
	}
	else
	{
		while(document.getElementById("productlisting" + componentIdentifier))
		{
			componentIdentifier++;
		}

		objEl.id = "productlisting" + componentIdentifier;
	}
	
	// Add Strong
	var objStrong = document.createElement("strong");
	var objTextNode = document.createTextNode("Product Listing");
	objStrong.appendChild(objTextNode);
	objEl.appendChild(objStrong);

	// Add paragraph
	var objParagraph = document.createElement("p");
	objTextNode = document.createTextNode("This item lists all the categories which are in the E-Commerce Module. These categories will lead to browsing of products inside them.");
	objParagraph.appendChild(objTextNode);
	objEl.appendChild(objParagraph);

	// Create spans and links
	var objSpan = document.createElement("span");

	var objClose = document.createElement("a");
	AddClass(objClose, "button");
	AddClass(objClose, "del");
	AttachEvent(objClose, "click", removeComponent);
	objTextNode = document.createTextNode("Delete");
	objClose.appendChild(objTextNode);
	objClose.title="Delete this content element";
	objSpan.appendChild(objClose);
	objEl.appendChild(objSpan);
	
	return objEl;

};


/*******************************************************************************************************************/
//*** Class: 	FeaturedProductListingComponent
//*** Params:	none
//*** Purpose: 	Featured product listing component object
//*** Return:   none
/*******************************************************************************************************************/

function FeaturedProductListingComponent(newComponentProperties)
{
	var componentProperties = newComponentProperties;
	
	this.setProperties = function(newComponentProperties)
	{
		componentProperties = newComponentProperties;
	}

	this.getProperties = function()
	{
		return componentProperties;
	}
}

FeaturedProductListingComponent.prototype.render = function() { 

	var objEl = document.createElement("div");
	AddClass(objEl, "component");
	
	if (componentProperties && componentProperties["componentID"])
	{
		objEl.id = componentProperties["componentID"];
	}
	else
	{
		while(document.getElementById("featuredlisting" + componentIdentifier))
		{
			componentIdentifier++;
		}
		
		objEl.id = "featuredlisting" + componentIdentifier;
	}
	
	// Add Strong
	var objStrong = document.createElement("strong");
	var objTextNode = document.createTextNode("Featured Product Listing");
	objStrong.appendChild(objTextNode);
	objEl.appendChild(objStrong);

	// Add paragraph
	var objParagraph = document.createElement("p");
	objTextNode = document.createTextNode("Lists the products which are marked as featured in the E-Commerce Module.");
	objParagraph.appendChild(objTextNode);
	objEl.appendChild(objParagraph);

	// Create spans and links
	var objSpan = document.createElement("span");

	var objClose = document.createElement("a");
	AddClass(objClose, "button");
	AddClass(objClose, "del");
	AttachEvent(objClose, "click", removeComponent);
	objTextNode = document.createTextNode("Delete");
	objClose.appendChild(objTextNode);
	objClose.title="Delete this content element";
	objSpan.appendChild(objClose);
	objEl.appendChild(objSpan);
	
	return objEl;

};


/*******************************************************************************************************************/
//*** Class: 	CustomTextComponent
//*** Params:	none
//*** Purpose: 	RTE component object
//*** Return:   none
/*******************************************************************************************************************/

function CustomTextComponent(componentProperties)
{
	var html = "";

	
	this.setProperties = function(newComponentProperties)
	{
		componentProperties = newComponentProperties;
	}
	
	this.getProperties = function()
	{
		return componentProperties;
	}
	
	var getRTEHolder = function(rteHolder)
	{
		return function (e) { toggleDisp(rteHolder) };
	}
	
	var getRTEIFrame = function(frameName, rteHolder, html)
	{
		var iFrame = document.createElement("iframe");
		
		html = html || "";
		
		iFrame.name = frameName;
		iFrame.style.width = "630px";
		iFrame.style.height = "415px";
		iFrame.style.borderWidth = "0";
		iFrame.setAttribute("src", getDomain() + "/css/test.php");
		
		iFrame.onload = function() { window.frames[frameName].insertHTML(html); } 
		iFrame.onunload = function() { alert("HERE"); }
		
		return iFrame;
	
	}
	
	this.render = function() { 
	
		var objEl = document.createElement("div");
		AddClass(objEl, "component");
		
		if (componentProperties && componentProperties["componentID"])
		{
			objEl.id = componentProperties["componentID"];
		}
		else
		{
			while(document.getElementById("rte" + componentIdentifier))
			{
				componentIdentifier++;
			}
	
			objEl.id = "rte" + componentIdentifier;
		}
		
		// Rte holder
	 	rteHolder = document.createElement("div");
		AddClass(rteHolder, "rteHolder");
		var iFrame = getRTEIFrame("customText" + componentIdentifier, rteHolder);
		rteHolder.appendChild(iFrame);
		
		var textArea = document.createElement("textarea");
		textArea.id = textArea.name = "customText" + componentIdentifier;
		textArea.style.display = "none";
		rteHolder.appendChild(textArea);
		
		
		// Add Strong
		var objStrong = document.createElement("strong");
		var objTextNode = document.createTextNode("Custom Text");
		objStrong.appendChild(objTextNode);
		objEl.appendChild(objStrong);
	
		// Add paragraph
		var objParagraph = document.createElement("p");
		objTextNode = document.createTextNode("Any custom text can be entered here. Use the rich text editor provided to style your content.");
		objParagraph.appendChild(objTextNode);
		objEl.appendChild(objParagraph);
		
		// Create spans and links
		var objSpan = document.createElement("span");
	
		var objEdit = document.createElement("a");
		AddClass(objEdit, "button");
		AddClass(objEdit, "edit");
		AttachEvent(objEdit, "click", getRTEHolder(rteHolder));
		objTextNode = document.createTextNode("Edit");
		objEdit.appendChild(objTextNode);
		objEdit.title="Edit the custom text";
	
		objSpan.appendChild(objEdit);
		objEl.appendChild(rteHolder);
	
		var objClose = document.createElement("a");
		AddClass(objClose, "button");
		AddClass(objClose, "del");
		AttachEvent(objClose, "click", removeComponent);
		objTextNode = document.createTextNode("Delete");
		objClose.appendChild(objTextNode);
		objClose.title="Delete this content element";
		objSpan.appendChild(objClose);
		objEl.appendChild(objSpan);
	
		return objEl;
	
	};

}
 


function loadRTEs()
{
	var iFrames = document.getElementsByTagName("iframe");
	
	for (var i=0; i<iFrames.length; i++)
	{
		window.frames[iFrames[i].name].updateRTEs();
		document.getElementById(iFrames[i].name).value = window.frames[iFrames[i].name].document.getElementById("hdncontent").value;
	}
	
	return false;
}



/********************************************************************************************************************

				    END ADD EDIT PRODUCTS PAGE CODE
				
********************************************************************************************************************/












/********************************************************************************************************************

					EDIT PRODUCTS ECOMMERCE
				
********************************************************************************************************************/


var totalVariations = 0;
var editingVariation;
var suffix = "_new_";

/*******************************************************************************************************************/
//*** Name: 	addVariationBehaviours
//*** Params:	none
//*** Purpose: 	Add element behaviours for variations area
//*** Return:   none
/*******************************************************************************************************************/

function addVariationBehaviours()
{	
	if (document.getElementById("variation_fields") && document.getElementById("current-variations"))
	{		
		var showVariationForm = document.getElementById("show_variation_form");
		var addVariationBtn = document.getElementById("add_variation");
		var cancelVariationBtn = document.getElementById("cancel_variation");

		AttachEvent(showVariationForm, "click", function() { document.getElementById("variation_fields").style.display="block"; });
		AttachEvent(addVariationBtn, "click", addVariation); 
		AttachEvent(cancelVariationBtn, "click", resetVariationForm);
		
		// Add behaviours to items already in table
		addItemBehaviours();
	}
}

AddLoadEvent(addVariationBehaviours);


/*******************************************************************************************************************/
//*** Name: 	addsItemBehaviours
//*** Params:	none
//*** Purpose: 	Adds behaviours to items already in the table (ie delete/edit)
//*** Return:   none
/*******************************************************************************************************************/

function addItemBehaviours()
{
	var tableData = document.getElementById("current-variations");
	var deletes = getElementsByClassName(document.getElementById("current-variations"), "*", "del");
	
	for (var i=0; i<deletes.length; i++)
	{
		var el = deletes[i];
		
		while (el.tagName != "TR")
		{
			el = el.parentNode;
		}
		
		fieldID = el.id.replace("row","");

		AttachEvent(deletes[i], "click", getRemoveVariationFnc(fieldID));
	}
	
	var edits = getElementsByClassName(tableData, "*", "edit");
	
	for (var i=0; i<edits.length; i++)
	{
		AttachEvent(edits[i], "click", editVariation);
	}
}

/*******************************************************************************************************************/
//*** Name: 	addVariation
//*** Params:	none
//*** Purpose: 	Add new variation
//*** Return:   none
/*******************************************************************************************************************/

function addVariation()
{
	
	var fields = document.getElementById("variation_fields");
	var newFields = fields.cloneNode(true);

	
	// Set new id of container
	newFields.id = "variation_fields" + suffix + totalVariations;
	
	// Hide labels
	var labels = newFields.getElementsByTagName("label");
	var labelsLength = labels.length;
	for (var i=0; i < labelsLength; i++) 
	{ 
		labels[0].parentNode.removeChild(labels[0]);
	}
	
	// Set new ids/values for textfields	
	var newInp;
	var inputs = newFields.getElementsByTagName("input");
	for (var i=0; i < inputs.length; i++) 
	{ 
		if (inputs[i].getAttribute("type") == "file")
		{
			newInp = document.createElement("input");
			newInp.setAttribute("type","text");
			newInp.id = newInp.name = inputs[i].id + "_path" + suffix + totalVariations; 
			newInp.value = inputs[i].value;
		}
		
		inputs[i].id = inputs[i].name = inputs[i].id + suffix + totalVariations; 	
		
	}
	
	if (newInp)
	{
		newFields.appendChild(newInp);	
	}
	
	// Set new ids/values for textareas	
	var textareas = newFields.getElementsByTagName("textarea");
	for (var i=0; i < textareas.length; i++) 
	{ 
		textareas[i].innerHTML = document.getElementById(textareas[i].id).value;
		textareas[i].id = textareas[i].name = textareas[i].id + suffix + totalVariations; 

	}
	
	// Remove all buttons
	var buttons = newFields.getElementsByTagName("button");
	var buttonsLength = buttons.length;
	for (var i=0; i<buttonsLength; i++)
	{
		buttons[0].parentNode.removeChild(buttons[0]);
	}
	
	// Hide new fields
	newFields.style.display="none";
	
	var addEditProductForm = document.getElementById("addEditProductForm");
	addEditProductForm.appendChild(newFields);
	
	// Add record to variations table
	addToVariationsTable(newFields);
	
	// Clear variations form
	resetVariationForm();
	
	// Rehide variation form
	fields.style.display = "none";
	
	// Increase # of variations
	totalVariations++;
	document.getElementById("total-variations").value = totalVariations;

}



/*******************************************************************************************************************/
//*** Name:	addToVariationsTable
//*** Params:	none
//*** Purpose: 	Add new variation to variations table
//*** Return:   none
/*******************************************************************************************************************/

function addToVariationsTable()
{
	var variationsTable = document.getElementById("current-variations");
	
	// Add data record
	var fields = new Array();
	
	// Get variations fields area
	var inputFieldLabels = document.getElementById("variation_fields").getElementsByTagName("label");

	for (var i=0; i<inputFieldLabels.length; i++)
	{
		fields.push(document.getElementById(inputFieldLabels[i].htmlFor).value);
	}
	
	var tableRow = document.createElement("tr");
	
	for (var i=0; i<fields.length; i++)
	{
		var td = document.createElement("td");
		var objTextNode = document.createTextNode(fields[i]);
		td.appendChild(objTextNode);
		tableRow.appendChild(td);
	}
	
	// Add links as they are "special"
	var td = document.createElement("td");
	
	var removeLink = document.createElement("a");
	var objTextNode = document.createTextNode("delete");
	AddClass(removeLink, "button");
	AddClass(removeLink, "del");
	removeLink.appendChild(objTextNode);
	AttachEvent(removeLink, "click", getRemoveVariationFnc(suffix + totalVariations));
	
	var editLink = document.createElement("a");
	var objTextNode = document.createTextNode("edit");
	AddClass(editLink, "button");
	AddClass(editLink, "edit");
	editLink.appendChild(objTextNode);
	AttachEvent(editLink, "click", editVariation);

	td.appendChild(removeLink);
	td.appendChild(editLink);
	tableRow.id = "row" + suffix + totalVariations;
	
	tableRow.appendChild(td);
	
	variationsTable.getElementsByTagName("tbody")[0].appendChild(tableRow);
	
}

function getRemoveVariationFnc(fieldID)
{
	return function(e) { removeVariation(e, fieldID);  };
}


/*******************************************************************************************************************/
//*** Name: 	resetVariationForm
//*** Params:	none
//*** Purpose: 	Clear variatoin form values
//*** Return:   none
/*******************************************************************************************************************/

function resetVariationForm()
{
	// Get variations fields area
	var inputFieldLabels = document.getElementById("variation_fields").getElementsByTagName("label");

	for (var i=0; i<inputFieldLabels.length; i++)
	{
		document.getElementById(inputFieldLabels[i].htmlFor).value = "";
	}
}


/*******************************************************************************************************************/
//*** Name: 	removeVariation
//*** Params:	none
//*** Purpose: 	Removes variation
//*** Return:   none
/*******************************************************************************************************************/

function removeVariation(e, fieldIndex)
{
	// Get element event relates to
	var el = e.target || e.srcElement;
	
	if (confirm("Please confirm deletion"))
	{
		// Remove the actual element
		var fields = document.getElementById("variation_fields" + fieldIndex);
		fields.parentNode.removeChild(fields);

		// Remove table entry
		var tr = el;

		while (tr.tagName.toUpperCase()!="TR")
		{
			tr = tr.parentNode;
		}

		tr.parentNode.removeChild(tr);
		
		var reg = new RegExp("new");
		if (!reg.test(fieldIndex))
		{
			var deleteElement = document.createElement("input");
			deleteElement.type = "hidden";
			deleteElement.name = "variation_delete"+fieldIndex;
			deleteElement.value = 1;		
			var addEditProductForm = document.getElementById("addEditProductForm");
			addEditProductForm.appendChild(deleteElement);
		}
	}
	
}

// Event when edit link is pressed
function editVariation(e)
{
	// Get element event relates to
	var el = e.target || e.srcElement;
	
	while (el.tagName!="TR")
	{
		el = el.parentNode;
	}
	
	editingVariation = el.id.replace("row", "");

	var addVariationBtn = document.getElementById("add_variation");
	var cancelVariationBtn = document.getElementById("cancel_variation");

	DetachEvent(addVariationBtn, "click", addVariation); 
	DetachEvent(cancelVariationBtn, "click", resetVariationForm);
	
	// remove old events
	AttachEvent(addVariationBtn, "click", updateVariationValues);
	AttachEvent(cancelVariationBtn, "click", restoreAdd);
	
	loadVariation();
	
	addVariationBtn.innerHTML = "Update";
}

function loadVariation()
{
	// Get variations fields area
	var fieldsArea = document.getElementById("variation_fields");
	var inputFieldLabels = fieldsArea.getElementsByTagName("label");
	
	fieldsArea.style.display = "block";

	for (var i=0; i<inputFieldLabels.length; i++)
	{
		var orig = document.getElementById(inputFieldLabels[i].htmlFor);
	
		if (orig.getAttribute("type")!="file")
		{
			orig.value = document.getElementById(inputFieldLabels[i].htmlFor + editingVariation).value;
		}
		else
		{
			var imagePath = document.getElementById(inputFieldLabels[i].htmlFor + "_path" + editingVariation).value;
			
			if (imagePath!="")
			{
				var addVariationBtn = document.getElementById("add_variation");
				
				var span = document.createElement("span");
				span.id = "uploaded-image";
				AddClass(span, "indented");
				var objTextNode = document.createTextNode("Current Image: " + imagePath );
				span.appendChild(objTextNode);
				span.style.display="block";
				addVariationBtn.parentNode.insertBefore(span, addVariationBtn);
			}
		}
	}
	
}

// Need to update the values in the form
function updateVariationValues()
{	
	// Get variations fields area
	var inputFieldLabels = document.getElementById("variation_fields").getElementsByTagName("label");
	
	for (var i=0; i<inputFieldLabels.length; i++)
	{
		var el = document.getElementById(inputFieldLabels[i].htmlFor + editingVariation);		
		
		if (el.getAttribute("type")!="file")
		{
			el.value = document.getElementById(inputFieldLabels[i].htmlFor).value;
		}
		else
		{		
			var newInp = document.getElementById(inputFieldLabels[i].htmlFor).cloneNode(true);
			
			newInp.id = newInp.name = inputFieldLabels[i].htmlFor + editingVariation;
			
			el.parentNode.appendChild(newInp);
			el.parentNode.removeChild(el);
			
			el = document.getElementById(inputFieldLabels[i].htmlFor + "_path" + editingVariation);
			el.value = document.getElementById(inputFieldLabels[i].htmlFor).value;
			
		}
	}
	
	updateTableEntry();
	restoreAdd();	
}

function restoreAdd()
{
	var fieldsArea = document.getElementById("variation_fields");
	var addVariationBtn = document.getElementById("add_variation");
	var cancelVariationBtn = document.getElementById("cancel_variation");
	var imagePath = document.getElementById("uploaded-image");

	DetachEvent(addVariationBtn, "click", updateVariationValues);
	DetachEvent(cancelVariationBtn, "click", restoreAdd);

	// Add old events
	AttachEvent(addVariationBtn, "click", addVariation); 
	AttachEvent(cancelVariationBtn, "click", resetVariationForm);
	
	addVariationBtn.innerHTML = "Save";
	
	resetVariationForm();
	editingVariation = "";
	
	if (imagePath)
	{
		imagePath.parentNode.removeChild(imagePath);
	}
	
	fieldsArea.style.display = "none";
	
}

function updateTableEntry()
{
	var row = document.getElementById("row" + editingVariation);
	var tds = row.getElementsByTagName("td");
	
	// Get variations fields area
	var inputFieldLabels = document.getElementById("variation_fields").getElementsByTagName("label");

	for (var i=0; i<inputFieldLabels.length; i++)
	{
		var el = document.getElementById(inputFieldLabels[i].htmlFor + editingVariation);
			
		if (el.getAttribute("type")!="file")
		{
			tds[i].innerHTML = document.getElementById(inputFieldLabels[i].htmlFor).value;
		}
		else
		{
			el = document.getElementById(inputFieldLabels[i].htmlFor + "_path" + editingVariation);
			tds[i].innerHTML = document.getElementById(inputFieldLabels[i].htmlFor).value;
		}
		
	}

}

/********************************************************************************************************************

					END EDIT PRODUCTS ECOMMERCE
				
********************************************************************************************************************/





/********************************************************************************************************************

					LIST CATEGORIES/PRODUCTS PAGE
				
********************************************************************************************************************/

var draggedPrevPosition;
var draggedProduct;


function setProductOrder()
{
	var newPosition = getProductPosition(draggedProduct);
	var difference = draggedPrevPosition - newPosition;
	
	if (difference==0) { return; }
	
	if (difference > 0)
	{
		sParams = "area=admin&func=module&module=ecommerce&subFunc=moveProductUp&id=" + draggedProduct.itemID + "&positions=" + difference;
	}
	else
	{
		sParams = "area=admin&func=module&module=ecommerce&subFunc=moveProductDown&id=" + draggedProduct.itemID + "&positions=" + (difference*-1);
	}
	
	var myConn = new XHConn();
		
	if (myConn)
	{ 
		myConn.connect(getDomain() + "/admin", "GET", sParams, function(oXML) { if (oXML.responseXML.getElementsByTagName("Response")[0].firstChild.nodeValue != "Success") { alert("ERROR: Data was not saved.  Please retry transaction."); } } );
	}
	
}

function setProductDragProperties(e)
{
	var el = e.target || e.srcElement;
	
	while (el.tagName != "LI")
	{
		el=el.parentNode;
	}
	
	draggedPrevPosition = getProductPosition(el);
	draggedProduct = el;
}


function getProductPosition(el)
{
	var lis = document.getElementById("filelist_files").getElementsByTagName("li");
	
	for (var i=0; i<lis.length; i++)
	{
		if (lis[i] == el) { return i; }
	}
}

/********************************************************************************************************************

					END LIST CATEGORIES/PRODUCTS PAGE
				
********************************************************************************************************************/



/********************************************************************************************************************

					GENERAL LISTING FUNCTIONS
				    (used by both file/content listings)
				
********************************************************************************************************************/

var listType;



/*******************************************************************************************************************/
//*** Name: 	createLists
//*** Params:	oXML - returned XML object from XHR
//*** Purpose: 	Parses categories/product XML and generates lists
//*** Return:   none
/*******************************************************************************************************************/

function createLists(oXML)
{
	// Get parent ID
	var parentID = oXML.responseXML.getElementsByTagName("Parent")[0].getAttribute("id");

	var groups;
	var items;
	var groupList;
	var itemList;

	if (listType=="productList")
	{
		// Category/product nodes from URL 
		groups = oXML.responseXML.getElementsByTagName("Category");
		items = oXML.responseXML.getElementsByTagName("Product");

		// Get list objects
		groupList = document.getElementById("filelist_folders");
		itemList = document.getElementById("filelist_files");
	}
	else
	{
		// Category/product nodes from URL 
		groups = oXML.responseXML.getElementsByTagName("Category");
		items = oXML.responseXML.getElementsByTagName("Content");
		
		// Get list objects
		groupList = document.getElementById("content-groups");
		itemList = document.getElementById("content-items");
	}

	// Clean lists each time
	groupList.innerHTML = "";
	itemList.innerHTML = "";
	
	for (var i=0; i<groups.length;i++)
	{
		var li = document.createElement("li");	
		AddClass(li,"folder");
		
		var del = document.createElement("a");
		del.title = "Delete this folder";
		var objTextNode = document.createTextNode("Delete");
		del.appendChild(objTextNode);
		AttachEvent(del, "click", deleteGroup);
		AddClass(del, "del");
		
		var edit = document.createElement("a");
		edit.title = "Edit this folder";
		
		if (listType=="productList")
		{
			edit.href = "admin?area=admin&func=module&module=ecommerce&subFunc=editCategory&id=" + groups[i].getAttribute("id");
		}
		else
		{
			edit.href = "admin?area=admin&func=content&subFunc=editCategory&id=" + groups[i].getAttribute("id");
		}
		
		
		objTextNode = document.createTextNode("Edit");
		edit.appendChild(objTextNode);
		AddClass(edit, "edit");
		
		var em = document.createElement("em");
		var groupName = groups[i].getElementsByTagName("Name")[0].firstChild.nodeValue;
		objTextNode = document.createTextNode(groupName);
		em.appendChild(objTextNode);
		em.id = "em"+ groups[i].getAttribute("id");		
		var strong = document.createElement("strong");
		var objShortDesc = groups[i].getElementsByTagName("ShortDescription")[0].firstChild;
		var shortDesc="";
		if (objShortDesc)
		{
			shortDesc = objShortDesc.nodeValue;
		}
		objTextNode = document.createTextNode(shortDesc);
		strong.appendChild(objTextNode);	
		
		li.appendChild(del);
		li.appendChild(edit);
		li.appendChild(em);
		li.appendChild(strong);
		
		li.groupID = groups[i].getAttribute("id");
		li.groupName = groupName;
		
		AttachEvent(em, "click", loadCategoryEvent);
		
		groupList.appendChild(li);
		
	}
	
	for (var i=0; i<items.length;i++)
	{
		var itemID = items[i].getAttribute("id");
		var objShortDesc = items[i].getElementsByTagName("ShortDescription")[0].firstChild;
		var groupName = items[i].getElementsByTagName("Name")[0].firstChild.nodeValue;
		
		var li = document.createElement("li");	
		AddClass(li,"file");
		AddClass(li,"level0");

		var del = document.createElement("a");
		del.title = "Delete this folder";
		var objTextNode = document.createTextNode("Delete");
		del.appendChild(objTextNode);
		AttachEvent(del, "click", deleteItem);
		AddClass(del, "del");
		
		var move = document.createElement("a");
		move.title = "Move file to another folder";
		var objTextNode = document.createTextNode("Move");
		move.appendChild(objTextNode);
		AddClass(move, "move");

		var edit = document.createElement("a");
		edit.title = "Edit this file";
		
		if (listType=="productList")
		{
			edit.href = "admin?area=admin&func=module&module=ecommerce&subFunc=editProduct&id=" + itemID;
		}
		else
		{
			edit.href = "admin?area=admin&func=content&subFunc=editContent&id=" + itemID;
		}
		
		objTextNode = document.createTextNode("Edit");
		edit.appendChild(objTextNode);
		AddClass(edit, "edit");

		var view = document.createElement("a");
		view.title = "View this file";
		view.href = items[i].getElementsByTagName("Url")[0].firstChild.nodeValue;
			
		
		objTextNode = document.createTextNode("View");
		view.appendChild(objTextNode);
		AddClass(view, "view");
		li.appendChild(view);

		var em = document.createElement("em");
		
		objTextNode = document.createTextNode(groupName);
		em.appendChild(objTextNode);

		var strong = document.createElement("strong");
		var shortDesc="";
		if (objShortDesc)
		{
			shortDesc = objShortDesc.nodeValue;
		}
		objTextNode = document.createTextNode(shortDesc);
		strong.appendChild(objTextNode);	

		li.appendChild(del);
		//li.appendChild(move);
		li.appendChild(edit);
		li.appendChild(view);
		li.appendChild(em);
		li.appendChild(strong);
		
		li.itemID = itemID;
		
		if (listType=="productList")
		{
			AttachEvent(li,"mousedown",setProductDragProperties);
			AttachEvent(li,"mouseup",setProductOrder);
		}

		itemList.appendChild(li);
	}
	
	// If not in root
	if (document.getElementById("breadcrumb").getElementsByTagName("li").length>1 && items.length == 0)
	{

		var li = document.createElement("li");
		var objTextNode = document.createTextNode("There are no items in this category yet, please add one");
		li.appendChild(objTextNode);
		AddClass(li, "none");
		itemList.appendChild(li);

	}
	
	// Make products list drag/drop
	if (listType=="productList")
	{
		Sortable.create("filelist_files", {tree:true,scroll:window });
	}
	
}

/*******************************************************************************************************************/
//*** Name: 	addBreadCrumb
//*** Params:	groupName - category name, groupID - category ID, root - flag to know if this is the root node
//*** Purpose: 	Adds new category into breadcrumb list
//*** Return:   none
/*******************************************************************************************************************/

function addBreadCrumb(groupName, groupID, root)
{
	// Get breadcrumb list
	var breadcrumb = document.getElementById("breadcrumb");
	
	// Get last category in list
	var lastCategory = breadcrumb.lastChild;
	while (lastCategory && lastCategory.tagName!="LI") { lastCategory = lastCategory.previousSibling; }
	
	// New list node
	var li = document.createElement("li");
	
	// See if this is the root node of the list
	if (!root)
	{
		var objTextNode = document.createTextNode("/");
		li.appendChild(objTextNode);
	}
	
	// Set text of breadcrumb
	var em = document.createElement("em");
	var objTextNode = document.createTextNode(groupName);
	em.appendChild(objTextNode);
	li.appendChild(em);
	
	// Set click event of breadcrumb
	AttachEvent(li, "click", function(e) { var el = e.target || e.srcElement; updateBreadcrumb(el); changeAddLinksProperties(groupID); getNewFolderRequest(groupID); });
	
	// Set properties of breadcrumb  
	li.groupName = groupName;
	li.groupID = groupID;
	
	// Set class of breadcrumb since it is now the last one
	if (lastCategory) { RemoveClass(lastCategory, "last"); }
	AddClass(li, "last");
	
	// Add breadcrumb
	breadcrumb.appendChild(li);
	
	// Update previous directory link to be new one
	updatePreviousDirectory();
}


/*******************************************************************************************************************/
//*** Name: 	updateBreadcrumb
//*** Params:	el - element clicked
//*** Purpose: 	Event to handle when an event from the breadcrumb bar is pressed
//*** Return:   none
/*******************************************************************************************************************/

function updateBreadcrumb(el)
{

	while (el.tagName!="LI")
	{
		el=el.parentNode;	
	}
	
	var start = el.parentNode.lastChild;
	
	while (start != el)
	{
		var prev = start.previousSibling;
		start.parentNode.removeChild(start);
		start = prev;
	}
	
	AddClass(el, "last");
	updatePreviousDirectory();
}


/*******************************************************************************************************************/
//*** Name: 	updatePreviousDirectory
//*** Params:	none
//*** Purpose:  Update previous dir link on change of directory
//*** Return:   none
/*******************************************************************************************************************/

function updatePreviousDirectory()
{
	var breadcrumb = document.getElementById("breadcrumb");
	var prevDir = document.getElementById("previous-directory");
		
	if (breadcrumb.getElementsByTagName("li").length>1) 
	{		
		prevDir.style.display = "block";
		
		DetachEvent(prevDir, "click", performPreviousDirectoryUpdate);
		AttachEvent(prevDir, "click", performPreviousDirectoryUpdate);
	}
	else
	{
		prevDir.style.display = "none";
	}

}

function deleteGroup(e)
{
	
	if (confirm("Please confirm group deletion"))
	{
		// Stop bubbling so this is only called once
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();

		var el = e.target || e.srcElement;

		while (el.tagName != "LI")
		{
			el=el.parentNode;
		}
		
		var categoryID = el.groupID;
		

		var sURL;
		var myConn = new XHConn();
		
		if (listType == "productList")
		{
			sURL = "area=admin&func=module&module=ecommerce&subFunc=deleteCategory";
		}
		else
		{
			sURL = "area=admin&func=content&subFunc=deleteCategory";
		}

		if (myConn)
		{ 
			myConn.connect(getDomain() + "/admin", "GET", sURL + "&id=" + categoryID, function(oXML) { if (oXML.responseXML.getElementsByTagName("Response")[0].firstChild.nodeValue != "Success") { alert("ERROR: Category was not deleted.  Please retry transaction."); } } );
		}	
		
		el.parentNode.removeChild(el);
	}
}

function deleteItem(e)
{
	if (confirm("Please confirm item deletion"))
	{
		// Stop bubbling so this is only called once
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();

		var el = e.target || e.srcElement;
	
		while (el.tagName != "LI")
		{
			el=el.parentNode;
		}

		var productID = el.itemID;

		var sURL;
		var myConn = new XHConn();
		
		if (listType == "productList")
		{
			sURL = "area=admin&func=module&module=ecommerce&subFunc=deleteProduct";
		}
		else
		{
			sURL = "area=admin&func=content&subFunc=deleteContent";
		}
		
		
		if (myConn)
		{ 
			myConn.connect(getDomain() + "/admin", "GET", sURL + "&id=" + productID , function(oXML) { if (oXML.responseXML.getElementsByTagName("Response")[0].firstChild.nodeValue != "Success") { alert("ERROR: Product was not deleted.  Please retry transaction."); } } );
		}
		
		el.parentNode.removeChild(el);
		
	}
}
/*******************************************************************************************************************/
//*** Name: 	loadCategoryById
//*** Params:	id - text
//*** Purpose: 	Loads category information by id
//*** Return:   none
/*******************************************************************************************************************/

function loadCategoryById(id,name)
{
	if (!name)
	{
		name = "unknown";
	}
	addBreadCrumb(name, id); 
	changeAddLinksProperties(id); 
	getNewFolderRequest(id);
}

/*******************************************************************************************************************/
//*** Name: 	loadCategoryEvent
//*** Params:	e - event
//*** Purpose: 	Loads category information when a category is clicked
//*** Return:   none
/*******************************************************************************************************************/
function loadCategoryEvent(e)
{
	var el = e.target || e.srcElement;
	
	while (el.tagName!="LI")
	{
		el = el.parentNode;
	}

	addBreadCrumb(el.groupName, el.groupID); 
	changeAddLinksProperties(el.groupID); 
	getNewFolderRequest(el.groupID);
}

/*******************************************************************************************************************/
//*** Name: 	addBreadCrumb
//*** Params:	groupName - category name, groupID - category ID, root - flag to know if this is the root node
//*** Purpose: 	Adds new category into breadcrumb list
//*** Return:   none
/*******************************************************************************************************************/

function addBreadCrumb(groupName, groupID, root)
{
	// Get breadcrumb list
	var breadcrumb = document.getElementById("breadcrumb");
	
	// Get last category in list
	var lastCategory = breadcrumb.lastChild;
	while (lastCategory && lastCategory.tagName!="LI") { lastCategory = lastCategory.previousSibling; }
	
	// New list node
	var li = document.createElement("li");
	
	// See if this is the root node of the list
	if (!root)
	{
		var objTextNode = document.createTextNode("/");
		li.appendChild(objTextNode);
	}
	
	// Set text of breadcrumb
	var em = document.createElement("em");
	var objTextNode = document.createTextNode(groupName);
	em.appendChild(objTextNode);
	li.appendChild(em);
	
	// Set click event of breadcrumb
	AttachEvent(li, "click", function(e) { var el = e.target || e.srcElement; updateBreadcrumb(el); changeAddLinksProperties(groupID); getNewFolderRequest(groupID); });
	
	// Set properties of breadcrumb  
	li.groupName = groupName;
	li.groupID = groupID;
	
	// Set class of breadcrumb since it is now the last one
	if (lastCategory) { RemoveClass(lastCategory, "last"); }
	AddClass(li, "last");
	
	// Add breadcrumb
	breadcrumb.appendChild(li);
	
	// Update previous directory link to be new one
	updatePreviousDirectory();
}


/*******************************************************************************************************************/
//*** Name: 	updateBreadcrumb
//*** Params:	el - element clicked
//*** Purpose: 	Event to handle when an event from the breadcrumb bar is pressed
//*** Return:   none
/*******************************************************************************************************************/

function updateBreadcrumb(el)
{

	while (el.tagName!="LI")
	{
		el=el.parentNode;	
	}
	
	var start = el.parentNode.lastChild;
	
	while (start != el)
	{
		var prev = start.previousSibling;
		start.parentNode.removeChild(start);
		start = prev;
	}
	
	AddClass(el, "last");
	updatePreviousDirectory();
}


/*******************************************************************************************************************/
//*** Name: 	updatePreviousDirectory
//*** Params:	none
//*** Purpose:  Update previous dir link on change of directory
//*** Return:   none
/*******************************************************************************************************************/

function updatePreviousDirectory()
{
	var breadcrumb = document.getElementById("breadcrumb");
	var prevDir = document.getElementById("previous-directory");
		
	if (breadcrumb.getElementsByTagName("li").length>1) 
	{		
		prevDir.style.display = "block";
		
		DetachEvent(prevDir, "click", performPreviousDirectoryUpdate);
		AttachEvent(prevDir, "click", performPreviousDirectoryUpdate);
	}
	else
	{
		prevDir.style.display = "none";
	}

}

function performPreviousDirectoryUpdate()
{
	var breadcrumb = document.getElementById("breadcrumb");
	var prevDir = document.getElementById("previous-directory");
	var newCurrent = breadcrumb.lastChild.previousSibling;
	var groupID = newCurrent.groupID;
	
	AddClass(newCurrent, "last");
	
	breadcrumb.removeChild(breadcrumb.lastChild); 
	
	changeAddLinksProperties(groupID);
	getNewFolderRequest(groupID); 
	
	if (breadcrumb.getElementsByTagName("li").length>1) 
	{
		prevDir.style.display = "block";
	}
	else
	{
		prevDir.style.display = "none";
	}
}


/*******************************************************************************************************************/
//*** Name: 	getNewFolderRequest
//*** Params:	groupID - category id
//*** Purpose:  Send new XHR request to get new folder data (drilled into a category)
//*** Return:   none
/*******************************************************************************************************************/

function getNewFolderRequest(groupID)
{	
	var myConn = new XHConn();

	var sURL;
	
	if (listType=="productList")
	{
		sURL = "area=admin&func=module&module=ecommerce&subFunc=listProductsXML";
	}
	else
	{
		sURL = "area=admin&func=content&subFunc=listContentXML";
	}

	if (myConn)
	{ 
		myConn.connect(getDomain() + "/admin", "GET", sURL + "&pid=" + groupID, createLists);
	}	
}


/*******************************************************************************************************************/
//*** Name: 	changeAddLinksProperties
//*** Params:	groupID - category id
//*** Purpose:  Change add product/categories link when category changes
//*** Return:   none
/*******************************************************************************************************************/

function changeAddLinksProperties(groupID)
{
	var additem = document.getElementById("add-item");
	var addgroup = document.getElementById("add-group");
	
	// see if we need to hide add product
	if (document.getElementById("breadcrumb").getElementsByTagName("li").length>1) 
	{
		additem.style.display = "block";
	}
	else
	{
		additem.style.display = "none";
	}
	
	if (listType=="productList")
	{
		// change href of add product
		addgroup.href="admin?area=admin&func=module&module=ecommerce&subFunc=addCategory&parent=" + groupID;
		additem.href="admin?area=admin&func=module&module=ecommerce&subFunc=addProduct&parent=" + groupID;
	}
	else
	{
		// change href of add product
		addgroup.href="admin?area=admin&func=content&subFunc=addCategory&parent=" + groupID;
		additem.href="admin?area=admin&func=content&subFunc=addContent&parent=" + groupID;
	}
}


/*******************************************************************************************************************/
//*** Name: 	filelistBehaviours
//*** Params:	none
//*** Purpose:  Load that sends of frist request/loads root breadcrumbs to get the ball rolling
//*** Return:   none
/*******************************************************************************************************************/

function addListBehaviours()
{

	var getUrl;
	var returnFunction;
	
	if (document.getElementById("contentManagementList"))
	{
		getUrl = "area=admin&func=content&subFunc=listContentXML";
		listType = "content";
	}
	
	if (document.getElementById("filelist_folders") && document.getElementById("filelist_files") && document.getElementById("breadcrumb"))
	{
		getUrl = "area=admin&func=module&module=ecommerce&subFunc=listProductsXML";
		listType = "productList";
	}	

	if (getUrl)
	{
	
		var myConn = new XHConn();

		if (myConn)
		{ 
			myConn.connect(getDomain() + "/admin", "GET", getUrl, createLists);
		}
// MARK 	
		addBreadCrumb("Root", 0, true);
		changeAddLinksProperties(0);
	}

}

// Add beginning event to window onload
AddLoadEvent(addListBehaviours);


/********************************************************************************************************************

					END GENERAL LISTING FUNCTIONS
				
********************************************************************************************************************/

// Simple function to serialize js arrays for php
function js_array_to_php_array (a)
{
    var a_php = "";
    var total = 0;
    for (var key in a)
    {
        ++ total;
        a_php = a_php + "s:" +
                String(key).length + ":\"" + String(key) + "\";s:" +
                String(a[key]).length + ":\"" + String(a[key]) + "\";";
    }
    a_php = "a:" + total + ":{" + a_php + "}";
    return a_php;
}
function setNavItem(which) {
	for (var i=0; i<4; i++) {
		document.getElementById('navType' + i).style.display = "none";
	}
	if (which != '--') {
		document.getElementById('navType' + which).style.display = "block";
		document.getElementById('buttonHolder').style.display = "block";
	}
	else {
		document.getElementById('buttonHolder').style.display = "none";
	}
}