/*
    json.js
    2006-04-28

    This file adds these methods to JavaScript:

        object.toJSONString()

            This method produces a JSON text from an object. The
            object must not contain any cyclical references.

        array.toJSONString()

            This method produces a JSON text from an array. The
            array must not contain any cyclical references.

        string.parseJSON()

            This method parses a JSON text to produce an object or
            array. It will return false if there is an error.
*/
(function () {
    var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        s = {
            array: function (x) {
                var a = ['['], b, f, i, l = x.length, v;
                for (i = 0; i < l; i += 1) {
                    v = x[i];
                    f = s[typeof v];
                    if (f) {
                        v = f(v);
                        if (typeof v == 'string') {
                            if (b) {
                                a[a.length] = ',';
                            }
                            a[a.length] = v;
                            b = true;
                        }
                    }
                }
                a[a.length] = ']';
                return a.join('');
            },
            'boolean': function (x) {
                return String(x);
            },
            'null': function (x) {
                return "null";
            },
            number: function (x) {
                return isFinite(x) ? String(x) : 'null';
            },
            object: function (x) {
                if (x) {
                    if (x instanceof Array) {
                        return s.array(x);
                    }
                    var a = ['{'], b, f, i, v;
                    for (i in x) {
                        v = x[i];
                        f = s[typeof v];
                        if (f) {
                            v = f(v);
                            if (typeof v == 'string') {
                                if (b) {
                                    a[a.length] = ',';
                                }
                                a.push(s.string(i), ':', v);
                                b = true;
                            }
                        }
                    }
                    a[a.length] = '}';
                    return a.join('');
                }
                return 'null';
            },
            string: function (x) {
                if (/["\\\x00-\x1f]/.test(x)) {
                    x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                        var c = m[b];
                        if (c) {
                            return c;
                        }
                        c = b.charCodeAt();
                        return '\\u00' +
                            Math.floor(c / 16).toString(16) +
                            (c % 16).toString(16);
                    });
                }
                return '"' + x + '"';
            }
        };

    Object.prototype.toJSONString = function () {
        return s.object(this);
    };

    Array.prototype.toJSONString = function () {
        return s.array(this);
    };
})();

String.prototype.parseJSON = function () {
    try {
        return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
                this.replace(/"(\\.|[^"\\])*"/g, ''))) &&
            eval('(' + this + ')');
    } catch (e) {
        return false;
    }
};

/*

Functions Start Here

*/

var xmlHttp;
var item_form;

function createXMLHttpRequest() 
{
    if (window.ActiveXObject) 
	{
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } 
    else if (window.XMLHttpRequest) 
	{
        xmlHttp = new XMLHttpRequest();
    }
}

function addToCart(object_id, object_type) 
{
    createXMLHttpRequest();
	
	var url = "resources/modules/shopping_cart/AJAX/SC_addToCart.php?timeStamp=" + new Date().getTime();
	
	var queryString = "object_id=" + object_id + "&object_type=" + object_type;
	
    xmlHttp.open("POST", url, true);
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");    		
    xmlHttp.send(queryString);	
}


function removeFromCart(object_id, object_type) 
{
    createXMLHttpRequest();
	
	var url = "resources/modules/shopping_cart/AJAX/SC_removeFromCart.php?timeStamp=" + new Date().getTime();
	
	var queryString = "object_id=" + object_id + "&object_type=" + object_type;
	
    xmlHttp.open("POST", url, true);
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");    		
    xmlHttp.send(queryString);	
}
/*
This function is for the checkout only, it will pass a value that will prevent 
enabling of add to cart buttons, etc since they aren't used on the checkout page
*/
function removeFromCheckoutCart(object_id, object_type) 
{
    createXMLHttpRequest();
	
	var url = "resources/modules/shopping_cart/AJAX/SC_removeFromCart.php?timeStamp=" + new Date().getTime();
	
	var queryString = "object_id=" + object_id + "&object_type=" + object_type + "&from_checkout=1";
	
    xmlHttp.open("POST", url, true);
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");    		
    xmlHttp.send(queryString);	
}
function handleStateChange()
{
    if(xmlHttp.readyState == 4) 
	{
        if(xmlHttp.status == 200) 
		{
            clearPreviousResults();			
            parseResults();
        }
    }
}

// Clear the cart contents and feedback displays
function clearPreviousResults() 
{	
    var responseDiv = document.getElementById("cartContents");
	
    if(responseDiv.hasChildNodes()) 
	{
        responseDiv.removeChild(responseDiv.childNodes[0]);
    }
	
	// Used for the no results found dialog
    var responseDiv = document.getElementById("cartResponse");
	
    if(responseDiv.hasChildNodes()) 
	{
        responseDiv.removeChild(responseDiv.childNodes[0]);
    }
	
	// Wipe the add to cart/remove from cart respones
	var responseArray = getElementsByClass("cartResponse", document, "tr");
	
	for(p in responseArray)
	{
		if(typeof(responseArray[p]) == 'object')
		{		
			if(responseArray[p].cells.length > 0)
			{
				responseArray[p].removeChild(responseArray[p].childNodes[0]);			
			}
		}
	}
}

// Deal with the PHP results
function parseResults() 
{    
	var responseText = xmlHttp.responseText;	
	//alert(responseText);
	if(responseText != 'null')
	{		
		var myObject = responseText.parseJSON();

		// Pull out object variables
		var itemCount = myObject[0]['itemCount'];
		var feedback = myObject[0]['feedback'];
		var objectID = myObject[0]['objectID'];
		var objectType = myObject[0]['objectType'];		
		var currentNumberItems = myObject[0]['currentNumberItems'];
		var maxNumber = myObject[0]['maxNumber'];
		var responseClass = myObject[0]['responseClass'];		
		var fromCheckout = myObject[0]['from_checkout'];
		// Append the item count
		var div = document.createElement("span");
		div.className = 'itemCount';
		var text = document.createTextNode(itemCount);
		div.appendChild(text);						
		document.getElementById("cartContents").appendChild(div);			

		// Append the feedback
		var div = document.createElement("td");
		div.className = responseClass;
		div.colSpan = 4;
		
		var span = document.createElement("span");
		span.className = "feedback_text";
		div.appendChild(span);
		var text = document.createTextNode(feedback);
		div.appendChild(text);
		span.appendChild(text);	
		
		//var br = document.createElement("br");
		//div.appendChild(br);
		var span = document.createElement("span");
		span.className = "feedback_links";
		div.appendChild(span);		
		var a = document.createElement("a");
		var shortlistAnch = a.cloneNode(false);
			shortlistAnch.href = "/shortlist_items.html";
			shortlistAnch.appendChild(document.createTextNode("View shortlist items"));
			shortlistAnch.className = "feedback_link";
		span.appendChild(shortlistAnch);
		span.appendChild(document.createTextNode(" | "));
		var rfpAnch = a.cloneNode(false);
			rfpAnch.href = "/request_a_proposal.html";
			rfpAnch.appendChild(document.createTextNode("Request a proposal"));
			rfpAnch.className = "feedback_link";
		span.appendChild(rfpAnch);
		document.getElementById("cartResponse-"+objectID).appendChild(div);
		
		if (fromCheckout == 1){
			deleteCartEntry(objectID);
		} else {
			// If there are fewer occurances of the item in the cart than the maximum allowed
			if( currentNumberItems < maxNumber)
			{
				// Enabled Add Button
				enableAddButton(objectID, objectType);
			}
			
			// If the item is at it's max
			if( currentNumberItems == maxNumber)
			{
				// Enabled Add Button
				disableAddButton(objectID, objectType);
			}		
		
			
			// If there are more than 0 occurances of the item
			if( currentNumberItems > 0)
			{
				// Enabled Remove Button
				enableRemoveButton(objectID, objectType);
			}
			
			// If there are 0 occurances of the item
			if( currentNumberItems == 0)
			{
				// Enabled Remove Button
				disableRemoveButton(objectID, objectType);	
			}
		}
	}
	else
	{
	    var div = document.createElement("span");
		div.className = 'response';
		var text = document.createTextNode('No results found');
		div.appendChild(text);						
		
    	document.getElementById("cartResponse").appendChild(div);
	}
}

/*
Delete cart entry
*/
function deleteCartEntry(objectID){
	var target = document.getElementById("cartItem-"+objectID);
	target.parentNode.removeChild(target);
}

function enableAddButton(objectID, objectType)
{
	var target = document.getElementById("addButton-"+objectID+"-"+objectType);
	
	var targetInput = target.childNodes[0];

	targetInput.removeAttribute("disabled");
	
	// change the classs
	targetInput.className = "enabled_button";	
}

function disableAddButton(objectID, objectType)
{
	var target = document.getElementById("addButton-"+objectID+"-"+objectType);

	var targetInput = target.childNodes[0];

	targetInput.setAttribute("disabled", "disabled");
	
	// change the classs
	targetInput.className = "disabled_button";	
}

function enableRemoveButton(objectID, objectType)
{
	var target = document.getElementById("removeButton-"+objectID+"-"+objectType);
	
	var targetInput = target.childNodes[0];

	targetInput.removeAttribute("disabled");
	
	// change the classs
	targetInput.className = "enabled_button";		
}

function disableRemoveButton(objectID, objectType)
{
	var target = document.getElementById("removeButton-"+objectID+"-"+objectType);
	
	var targetInput = target.childNodes[0];

	targetInput.setAttribute("disabled", "disabled");
	
	// change the classs
	targetInput.className = "disabled_button";		
}

function getElementsByClass(searchClass,node,tag) 
{
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	
	for (i = 0, j = 0; i < elsLen; i++) 
	{
		if ( pattern.test(els[i].className) ) 
		{
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/*
// swapButton function - not used

function swapButtons(objectID, objectType)
{
	var target = document.getElementById("cartButton-"+objectID);
	
	var targetName = target.childNodes[0].name;
	

	if(target.hasChildNodes()) 
	{
        target.removeChild(target.childNodes[0]);
    }	
			
	if(targetName == 'addToCart')
	{
		target.appendChild(createInputNode('button', 'removeFromCart', 'Remove From Cart', 'removeFromCart', objectID, objectType));
	}
	else if(targetName == 'removeFromCart')
	{
		target.appendChild(createInputNode('button', 'addToCart', 'Add To Cart', 'addToCart', objectID, objectType));		
	}
}

function createInputNode(type, name, value, onclick, objectID, objectType)
{
	var input = document.createElement("INPUT");
	input.type = type;
	input.name = name;
	input.value = value;
	input.onclick = function(){
		eval(onclick + '(' + objectID + ',' + '"' + objectType + '")')
	}
	
	return input;
}
*/

// Function used to dynamically save the checkout form when a user clicks an action
function saveCheckoutForm(form_id)
{
	createXMLHttpRequest();
	
	item_form = document.getElementById(form_id);
	
	var title = document.getElementById('title').value;
	var firstname = document.getElementById('firstname').value;
	var lastname = document.getElementById('lastname').value;
	var company_name = document.getElementById('company_name').value;
	var address_1 = document.getElementById('address_1').value;
	var address_2 = document.getElementById('address_2').value;
	var city = document.getElementById('city').value;
	var county = document.getElementById('county').value;
	var country = document.getElementById('country').value;
	var postcode = document.getElementById('postcode').value;
	var email = document.getElementById('email').value;
	var confirm_email = document.getElementById('confirm_email').value;
	var contact_number = document.getElementById('contact_number').value;
	
	var name_of_event = document.getElementById('name_of_event').value;
	var market_sector = document.getElementById('market_sector').value;
	var number_days = document.getElementById('number_days').value;
	var delegates = document.getElementById('delegates').value;
	var meeting_room_style = document.getElementById('meeting_room_style').value;
	var breakout_rooms = document.getElementById('breakout_rooms').value;
	var exhibition_space = document.getElementById('exhibition_space').value;
	var start_day = document.getElementById('start_day').value;
	var start_month = document.getElementById('start_month').value;
	var start_year = document.getElementById('start_year').value;
	var end_day = document.getElementById('end_day').value;
	var end_month = document.getElementById('end_month').value;
	var end_year = document.getElementById('end_year').value;
	var single_day_event = document.getElementById('single_day_event').value;
	
	var accommodation_required = document.getElementById('accommodation_required').value;
	var total_bedrooms = document.getElementById('total_bedrooms').value;
	var single_bedrooms = document.getElementById('single_bedrooms').value;
	var double_bedrooms = document.getElementById('double_bedrooms').value;
	var twin_bedrooms = document.getElementById('twin_bedrooms').value;
	var number_nights = document.getElementById('number_nights').value;
	var check_in_day = document.getElementById('check_in_day').value;
	var check_in_month = document.getElementById('check_in_month').value;
	var check_in_year = document.getElementById('check_in_year').value;
	var check_out_day = document.getElementById('check_out_day').value;
	var check_out_month = document.getElementById('check_out_month').value;
	var check_out_year = document.getElementById('check_out_year').value;
	var additional_info = document.getElementById('additional_info').value;
	
	var url = "resources/modules/shopping_cart/AJAX/SC_saveCheckoutForm.php?timeStamp=" + new Date().getTime();
	
	var queryString = 
		"title=" + title 
		+ "&firstname=" + firstname
		+ "&lastname=" + lastname
		+ "&company_name=" + company_name
		+ "&address_1=" + address_1
		+ "&address_2=" + address_2
		+ "&city=" + city
		+ "&county=" + county
		+ "&country=" + country
		+ "&postcode=" + postcode
		+ "&email=" + email
		+ "&confirm_email=" + confirm_email
		+ "&contact_number=" + contact_number
		+ "&name_of_event=" + name_of_event
		+ "&market_sector=" + market_sector
		+ "&delegates=" + delegates
		+ "&meeting_room_style=" + meeting_room_style
		+ "&breakout_rooms=" + breakout_rooms
		+ "&exhibition_space=" + exhibition_space
		+ "&start_day=" + start_day
		+ "&start_month=" + start_month
		+ "&start_year=" + start_year
		+ "&end_day=" + end_day
		+ "&end_month=" + end_month
		+ "&end_year=" + end_year
		+ "&single_day_event=" + single_day_event
		+ "&accommodation_required=" + accommodation_required
		+ "&total_bedrooms=" + total_bedrooms
		+ "&single_bedrooms=" + single_bedrooms
		+ "&double_bedrooms=" + double_bedrooms
		+ "&twin_bedrooms=" + twin_bedrooms
		+ "&number_nights=" + number_nights
		+ "&check_in_day=" + check_in_day
		+ "&check_in_month=" + check_in_month
		+ "&check_in_year=" + check_in_year
		+ "&check_out_day=" + check_out_day
		+ "&check_out_month=" + check_out_month
		+ "&check_out_year=" + check_out_year
		+ "&additional_info=" + additional_info;
		
	//alert(queryString);
	
    xmlHttp.open("POST", url, true);
	//xmlHttp.onreadystatechange = submitForm(item_form);
	xmlHttp.onreadystatechange = submitForm; // () does not work
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");    		
    xmlHttp.send(queryString);	
}

function submitForm()
{
	//alert(xmlHttp.readyState);
	//alert(xmlHttp.status);

    if(xmlHttp.readyState == 4) 
	{
        if(xmlHttp.status == 200) 
		{
			item_form.submit();
        }
    }				
}