function validatePayment() {
	var retVal = false;
	retVal = validateCreditCard(document.getElementById('CC_NUM').value, document.getElementById('paymentType').value);
	if(retVal == true && document.getElementById('CC_MON').options.selectedIndex > 0 && document.getElementById('CC_YR').options.selectedIndex > 0) {
		if(retVal == true && document.getElementById('CC_CCV').value != '') {
			retVal = true;
		}
	}
	if(!retVal) {
		alert("The credit card information you have provided is not valid.");
	}
	return retVal;	
}

function validateCreditCard(cardNumber, cardType) {
	var isValid = false;
	var ccCheckRegExp = /[^\d ]/;
	isValid = !ccCheckRegExp.test(cardNumber);

	if (isValid) {
		var cardNumbersOnly = cardNumber.replace(/ /g,"");
		var cardNumberLength = cardNumbersOnly.length;
		var lengthIsValid = false;
		var prefixIsValid = false;
		var prefixRegExp;

		switch(cardType) {
			case "MC":
				lengthIsValid = (cardNumberLength == 16);
				prefixRegExp = /^5[1-5]/;
			break;
	
			case "VISA":
				lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
				prefixRegExp = /^4/;
			break;

			case "AMEX":
				lengthIsValid = (cardNumberLength == 15);
				prefixRegExp = /^3(4|7)/;
			break;

			case "DISC":
				lengthIsValid = (cardNumberLength == 15);
				prefixRegExp = /^6011/;
			break;
	
			default:
				prefixRegExp = /^$/;
				alert("Card type not found");
		}

		prefixIsValid = prefixRegExp.test(cardNumbersOnly);
		isValid = prefixIsValid && lengthIsValid;
	}

	if (isValid) {
		var numberProduct;
		var numberProductDigitIndex;
		var checkSumTotal = 0;

		for (digitCounter = cardNumberLength - 1; digitCounter >= 0; digitCounter--) {
			checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
			digitCounter--;
			numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
			for (var productDigitCounter = 0; productDigitCounter < numberProduct.length; productDigitCounter++) {
				checkSumTotal += parseInt(numberProduct.charAt(productDigitCounter));
			}
		}

		isValid = (checkSumTotal % 10 == 0);
	}

	return isValid;
}

function paymentTypeChanged(method) {
	if(method == 'MC' || method == 'VISA' || method == 'AMEX' || method == 'DISC') {
		document.getElementById('CCPaymentRow1').style.display = '';
		document.getElementById('CCPaymentRow2').style.display = '';
		document.getElementById('CCPaymentRow3').style.display = '';
	}
}

function copyBillToShip() {
	if(document.getElementById('copy').checked == 1) {
		document.getElementById('shi_first_name').value = document.getElementById('bil_first_name').value;
		document.getElementById('shi_last_name').value = document.getElementById('bil_last_name').value;
		document.getElementById('shi_address_line1').value = document.getElementById('bil_address_line1').value;
		document.getElementById('shi_address_line2').value = document.getElementById('bil_address_line2').value;
		document.getElementById('shi_city').value = document.getElementById('bil_city').value;
		document.getElementById('shi_state').options.selectedIndex = document.getElementById('bil_state').options.selectedIndex;
		document.getElementById('shi_zip').value = document.getElementById('bil_zip').value;
		document.getElementById('shi_zip_plus_four').value = document.getElementById('bil_zip_plus_four').value;
		document.getElementById('shi_phone_number').value = document.getElementById('bil_phone_number').value;
	} 
}

function toggleSEO() {
        if(document.getElementById('seoDescRow').style.display != 'none') {
                document.getElementById('seoDescRow').style.display = 'none';
                document.getElementById('seoKeywordsRow').style.display = 'none';
                document.getElementById('seoPageTitleRow').style.display = 'none';
                document.getElementById('seoDescFieldRow').style.display = 'none';
                document.getElementById('seoKeywordsFieldRow').style.display = 'none';
                document.getElementById('seoPageTitleFieldRow').style.display = 'none';
        } else {
                document.getElementById('seoDescRow').style.display = 'block';     
                document.getElementById('seoKeywordsRow').style.display = 'block';
                document.getElementById('seoPageTitleRow').style.display = 'block';
                document.getElementById('seoDescFieldRow').style.display = 'block';
                document.getElementById('seoKeywordsFieldRow').style.display = 'block';
                document.getElementById('seoPageTitleFieldRow').style.display = 'block';
        }
}

function getURLParam(strParamName){
  	var strReturn = "";
  	var strHref = window.location.href;
  	if ( strHref.indexOf("?") > -1 ){
   		var strQueryString = strHref.substr(strHref.indexOf("?"));
    		var aQueryString = strQueryString.split("&");
    		for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
      			if (aQueryString[iParam].indexOf(strParamName + "=") > -1 ){
        			var aParam = aQueryString[iParam].split("=");
        			strReturn = aParam[1];
        			break;
      			}
    		}
  	}
  	return unescape(strReturn);
} 

function showFileBrowser(fieldId, buttonId) {
	var url = tmceBasePath + '&field=' + urlencode(fieldId) + '&type=file&win=' + window.name + '&mce=false';
		
	window.open(url, 'FileManager', 'width=500, height=500, resizable=1, status=0, scrollbars=auto, menubar=0, toolbar=0');
        return false;
}

function showFileBrowserBase() {
	//these need to be consolidated by someone with lots of extra time
	var url = ecmpUrl + '/addons/fileManager.php';
	window.open(url, 'FileManager', 'width=500, height=500, resizable=1, status=0, scrollbars=auto, menubar=0, toolbar=0');
        return false;
}

function rocketFileBrowser(field_name, url, type, win) {
	//tmceBasePath	
	var url = tmceBasePath + '&field=' + urlencode(field_name) + '&type=' + urlencode(type) + '&win=' + urlencode(win) + '&mce=true';
	tinyMCE.activeEditor.windowManager.open({
		file : url,
		title : 'File Manager',
		width : 500,
		height : 500,
		resizable : 'yes',
		inline : 'no',
		close_previous : 'yes'
	}, {
		window : win,
		input : field_name
	});
	return false;	
}

function urlencode(str) {
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}

function urldecode(str) {
	str = str.replace('+', ' ');
	str = unescape(str);
	return str;
}

function getXMLHttpObj() {
	var thing=null;
	if (window.XMLHttpRequest)
	{
	thing=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
			thing=new ActiveXObject("Microsoft.XMLHTTP");
	}
    return thing;	
}

function changeMode(mode) {
		switch (mode) {
			case 'editMode':
				document.location.href = siteUrl + '&mode=editMode';
			break;
			case 'designerMode':
				document.location.href = siteUrl + '&mode=designerMode';
			break;
			case 'browseMode':
				document.location.href = siteUrl + '&mode=browseMode';
			break;
		}
}


//DRAG AND DROP STUFF//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                               //
//                                                                                                                               //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/** Keep hold of the current table being dragged */
var currenttable = null;

/** Capture the onmousemove so that we can see if a row from the current
 *  table if any is being dragged.
 * @param ev the event (for Firefox and Safari, otherwise we use window.event for IE)
 */
document.onmousemove = function(ev){
    if (currenttable && currenttable.dragObject) {
        ev   = ev || window.event;
        var mousePos = currenttable.mouseCoords(ev);
        var y = mousePos.y - currenttable.mouseOffset.y;
        if (y != currenttable.oldY) {
            // work out if we're going up or down...
            var movingDown = y > currenttable.oldY;
            // update the old value
            currenttable.oldY = y;
            // update the style to show we're dragging
            currenttable.dragObject.style.backgroundColor = "#eee";
            // If we're over a row then move the dragged row to there so that the user sees the
            // effect dynamically
            var currentRow = currenttable.findDropTargetRow(y);
            if (currentRow) {
                if (movingDown && currenttable.dragObject != currentRow) {
                    currenttable.dragObject.parentNode.insertBefore(currenttable.dragObject, currentRow.nextSibling);
                } else if (! movingDown && currenttable.dragObject != currentRow) {
                    currenttable.dragObject.parentNode.insertBefore(currenttable.dragObject, currentRow);
                }
            }
        }

        return false;
    }
}

// Similarly for the mouseup
document.onmouseup   = function(ev){
    if (currenttable && currenttable.dragObject) {
        var droppedRow = currenttable.dragObject;
        // If we have a dragObject, then we need to release it,
        // The row will already have been moved to the right place so we just reset stuff
        droppedRow.style.backgroundColor = 'transparent';
        currenttable.dragObject   = null;
        // And then call the onDrop method in case anyone wants to do any post processing
        currenttable.onDrop(currenttable.table, droppedRow);
        currenttable = null; // let go of the table too
    }
}


/** get the source element from an event in a way that works for IE and Firefox and Safari
 * @param evt the source event for Firefox (but not IE--IE uses window.event) */
function getEventSource(evt) {
    if (window.event) {
        evt = window.event; // For IE
        return evt.srcElement;
    } else {
        return evt.target; // For Firefox
    }
}

/**
 * Encapsulate table Drag and Drop in a class. We'll have this as a Singleton
 * so we don't get scoping problems.
 */
function TableDnD() {
    /** Keep hold of the current drag object if any */
    this.dragObject = null;
    /** The current mouse offset */
    this.mouseOffset = null;
    /** The current table */
    this.table = null;
    /** Remember the old value of Y so that we don't do too much processing */
    this.oldY = 0;

    /** Initialise the drag and drop by capturing mouse move events */
    this.init = function(table) {
        this.table = table;
        var rows = table.tBodies[0].rows; //getElementsByTagName("tr")
        for (var i=0; i<rows.length; i++) {
			// John Tarr: added to ignore rows that I've added the NoDnD attribute to (Category and Header rows)
			var nodrag = rows[i].getAttribute("NoDrag")
			if (nodrag == null || nodrag == "undefined") { //There is no NoDnD attribute on rows I want to drag
				this.makeDraggable(rows[i]);
			}
        }
    }

    /** This function is called when you drop a row, so redefine it in your code
        to do whatever you want, for example use Ajax to update the server */
    this.onDrop = function(table, droppedRow) {
        // Do nothing for now
    }

	/** Get the position of an element by going up the DOM tree and adding up all the offsets */
    this.getPosition = function(e){
        var left = 0;
        var top  = 0;
		/** Safari fix -- thanks to Luis Chato for this! */
		if (e.offsetHeight == 0) {
			/** Safari 2 doesn't correctly grab the offsetTop of a table row
			    this is detailed here:
			    http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/
			    the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild.
			    note that firefox will return a text node as a first child, so designing a more thorough
			    solution may need to take that into account, for now this seems to work in firefox, safari, ie */
			e = e.firstChild; // a table cell
		}

        while (e.offsetParent){
            left += e.offsetLeft;
            top  += e.offsetTop;
            e     = e.offsetParent;
        }

        left += e.offsetLeft;
        top  += e.offsetTop;

        return {x:left, y:top};
    }

	/** Get the mouse coordinates from the event (allowing for browser differences) */
    this.mouseCoords = function(ev){
        if(ev.pageX || ev.pageY){
            return {x:ev.pageX, y:ev.pageY};
        }
        return {
            x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
            y:ev.clientY + document.body.scrollTop  - document.body.clientTop
        };
    }

	/** Given a target element and a mouse event, get the mouse offset from that element.
		To do this we need the element's position and the mouse position */
    this.getMouseOffset = function(target, ev){
        ev = ev || window.event;

        var docPos    = this.getPosition(target);
        var mousePos  = this.mouseCoords(ev);
        return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
    }

	/** Take an item and add an onmousedown method so that we can make it draggable */
    this.makeDraggable = function(item) {
        if(!item) return;
        var self = this; // Keep the context of the TableDnd inside the function
        item.onmousedown = function(ev) {
            // Need to check to see if we are an input or not, if we are an input, then
            // return true to allow normal processing
            var target = getEventSource(ev);
            if (target.tagName == 'INPUT' || target.tagName == 'SELECT') return true;
            currenttable = self;
            self.dragObject  = this;
            self.mouseOffset = self.getMouseOffset(this, ev);
            return false;
        }
        item.style.cursor = "pointer";
    }

    /** We're only worried about the y position really, because we can only move rows up and down */
    this.findDropTargetRow = function(y) {
        var rows = this.table.tBodies[0].rows;
		for (var i=0; i<rows.length; i++) {
			var row = rows[i];
			// John Tarr added to ignore rows that I've added the NoDnD attribute to (Header rows)
			var nodrop = row.getAttribute("NoDrop");
			if (nodrop == null || nodrop == "undefined") {  //There is no NoDnD attribute on rows I want to drag
				var rowY    = this.getPosition(row).y;
				var rowHeight = parseInt(row.offsetHeight)/2;
				if (row.offsetHeight == 0) {
					rowY = this.getPosition(row.firstChild).y;
					rowHeight = parseInt(row.firstChild.offsetHeight)/2;
				}
				// Because we always have to insert before, we need to offset the height a bit
				if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) {
					// that's the row we're over
					return row;
				}
			}
		}
		return null;
	}
}

