/* Copyright 2005 Cameron Manderson. All rights reserved. 
 * 
 * No part of this document may be reproduced or copied in any form by any 
 * means without the written permission of Cameron Manderson. Unless 
 * otherwise expressly agreed in writing, the information contained in 
 * this document is subject to change without notice and Cameron Manderson 
 * assumes no responsibility for any alteration to, or any error or other 
 * deficiency, in this document. 
 * 
 * Intellectual property rights in the Document and in all extracts 
 * and things derived from any part of the Document are owned by Cameron 
 * Manderson and will be assigned to Cameron Manderson on their creation.
 * SAJAX technology from is used in this document and does not belong to 
 * Cameron Manderson and is (c) copyright 2005 modernmethod, inc
 * 
 * You will protect all the intellectual property rights relating to the 
 * Document in a manner that is equal to the protection you provide your 
 * own intellectual property. You will notify Cameron Manderson 
 * immediately, and in writing where you become aware of a breach of 
 * Cameron Manderson's intellectual property rights in relation to the 
 * Document. Cameron Manderson may at its sole discretion terminate the 
 * rights granted in this document with immediate effect by notifying you 
 * in writing and you will thereupon return (or destroy and certify that 
 * destruction to Cameron Manderson) all copies and extracts of the 
 * Document in its possession or control. 
 *
 * Cameron Manderson does not indemnify you or any third party in relation 
 * to the content or any use of the content as contemplated in these terms 
 * and conditions. 
 * 
 * This document is governed by the laws of Victoria, Australia and is 
 * intended to be legally binding.
 * 
 * Enquiries regarding the copyright of this file should be directed to
 * Cameron Manderson cam@mink.net.au
 * 
 * Author: Cameron
 * Date: 21/10/2005
 */

var createStateVariables = new Object;

var initialisedVariables = new Object;
initialisedVariables["productCatalogProductCategory"] = false;
initialisedVariables["productCatalogProductBrand"] = false;
initialisedVariables["productCatalogProductDesigner"] = false;
initialisedVariables["productCatalogLogoGECA"] = false;

var firstRun = true;
/*
 * AJAX Methods (Sajax Integration)
 * Integration 
 * TODO: If connection not available, don't keep updating the values
 * @author Cameron Manderson 
 */
function getItemRecords(trigger) {
	var connectionAvailable = sajax_init_object();
	if(!connectionAvailable) {		
		var responsePacket = "<wddxPacket version='1.0'><header/><data><struct><var name='values'><struct><var name='productCatalogProductCategory'><struct><var name='5'><string>Lighting</string></var><var name='11'><string>Seating - Dining/Cafe</string></var><var name='12'><string>Seating - Outdoor</string></var><var name='13'><string>Seating - Visitor</string></var><var name='15'><string>Seating - Stools</string></var><var name='23'><string>Seating - Lounge chairs</string></var><var name='29'><string>Seating - Executive</string></var><var name='30'><string>Seating - Task</string></var><var name='46'><string>Tables - Coffee/Side</string></var><var name='47'><string>Tables - Cafe/Breakout</string></var><var name='48'><string>Tables - Outdoor</string></var><var name='59'><string>Seating - Lounges</string></var><var name='61'><string>Seating - Ottomans/Benches</string></var><var name='79'><string>Classics Collection</string></var><var name='80'><string>Tables - Dining</string></var><var name='81'><string>Tables - Meeting/Conference</string></var><var name='88'><string>Accessories</string></var><var name='96'><string>Seating - Training</string></var><var name='97'><string>Seating - Meet/Conference</string></var><var name='129'><string>Desking</string></var><var name='147'><string>Storage - Residential</string></var><var name='152'><string>Workstations</string></var><var name='166'><string>Tables - Training</string></var><var name='178'><string>Storage - Commercial</string></var><var name='191'><string>Seating - Home</string></var><var name='194'><string>Seating - Arm/Side chairs</string></var><var name='294'><string>Seating - Corner Lounges</string></var></struct></var><var name='productCatalogProductBrand'><struct><var name='77'><string>Herman Miller</string></var><var name='159'><string>Howe</string></var><var name='176'><string>Living Edge</string></var><var name='185'><string>Norman and Quaine</string></var><var name='237'><string>Walter Knoll</string></var><var name='284'><string>Woodmark</string></var><var name='7385'><string>Andreu World</string></var><var name='9030'><string>Established &amp; Sons</string></var></struct></var><var name='productCatalogProductDesigner'><struct><var name='78'><string>Charles and Ray Eames</string></var><var name='90'><string>Bill Stumpf</string></var><var name='91'><string>Don Chadwick</string></var><var name='93'><string>Studio 7.5</string></var><var name='95'><string>Jerome Caruso</string></var><var name='100'><string>Jeff Weber</string></var><var name='103'><string>Mark Goetz</string></var><var name='105'><string>Tom Newhouse</string></var><var name='118'><string>Robert Propst</string></var><var name='137'><string>Ray Eames</string></var><var name='139'><string>George Nelson</string></var><var name='142'><string>Carol Catalano</string></var><var name='149'><string>Bruce Burdick</string></var><var name='151'><string>Ayse Birsel</string></var><var name='154'><string>Jack Kelley</string></var><var name='160'><string>David Rowland</string></var><var name='162'><string>Erik Simonsen</string></var><var name='165'><string>Komplot Design</string></var><var name='168'><string>John Bollen</string></var><var name='174'><string>EOOS</string></var><var name='186'><string>Norman and Quaine</string></var><var name='241'><string>Wolfgang C R Mezger</string></var><var name='244'><string>Pearson Lloyd</string></var><var name='251'><string>Edgar Reuter</string></var><var name='255'><string>Preben Fabricius</string></var><var name='256'><string>Jorgen Kastholm</string></var><var name='264'><string>Norman Foster</string></var><var name='296'><string>Matthew Sheargold</string></var><var name='371'><string>Soren Holst</string></var><var name='3896'><string>Douglas Ball</string></var><var name='3898'><string>Eric Chan</string></var><var name='4028'><string>John Bollen</string></var><var name='6830'><string>Daniel Korb</string></var><var name='7427'><string>Lievore, Altherr &amp; Molina</string></var><var name='7768'><string>Industrial Facility</string></var><var name='7769'><string>Kaiju Studios</string></var><var name='7823'><string>Jeff Weber</string></var><var name='8418'><string>UNStudio/Ben van Berkel</string></var><var name='8427'><string>Claudio Bellini</string></var><var name='9031'><string>Alexander Taylor</string></var><var name='9032'><string>BarberOsgerby</string></var><var name='9033'><string>Frank</string></var><var name='9035'><string>Klauser &amp; Carpenter </string></var><var name='9036'><string>Sylvain Willenz</string></var><var name='9037'><string>Sebastian Wrong</string></var><var name='9038'><string>Richard Woods</string></var><var name='9039'><string>Raw-Edges/ Shay Alkalay</string></var><var name='9040'><string>Wouter Scheublin</string></var><var name='9352'><string>Front Design</string></var><var name='9633'><string>Ronan and Erwan Bouroullec</string></var><var name='9744'><string>Konstantin Grcic</string></var><var name='9745'><string>Amanda Levete Architects</string></var><var name='9746'><string>Luca Nichetto</string></var><var name='9747'><string>Paul Cocksedge</string></var><var name='9748'><string>Bertjan Pot</string></var><var name='9769'><string>Martino Gamper</string></var><var name='9771'><string>Scholten &amp; Baijings</string></var><var name='9774'><string>Estd </string></var><var name='9779'><string>Maarten Baas</string></var><var name='9811'><string>Michael Eden</string></var><var name='9816'><string>Stefan Diez</string></var></struct></var><var name='productCatalogLogoGECA'><struct><var name='y'><string>GECA Product</string></var></struct></var></struct></var></struct></data></wddxPacket>";
		var theDeserializer = new WddxDeserializer;
		theDeserializer.preserveVarCase = true;
		var responseObject = theDeserializer.deserialize(responsePacket);
		for(var i in responseObject.values) {
			addOptions(responseObject.values[i], MM_findObj(i));		
		}
	} else { 
		// Locate all the objects
		var fields = new Object;
		var theSerializer = new WddxSerializer;
		theSerializer.preserveVarCase = true;
		var selectionStruct = new Object;		
		if(firstRun == true) { 
			selectionStruct = createStateVariables;
			firstRun = false;
		} else {
			fields["productCatalogProductCategory"] = MM_findObj("productCatalogProductCategory");
			fields["productCatalogProductBrand"] = MM_findObj("productCatalogProductBrand");
			fields["productCatalogProductDesigner"] = MM_findObj("productCatalogProductDesigner");
			fields["productCatalogLogoGECA"] = MM_findObj("productCatalogLogoGECA");		
		
			// Collate all the selections
			
			for(var i in fields) {
				if(fields[i] !== null) {
					selectionStruct[i] = (fields[i].selectedIndex > -1) ? fields[i].options[fields[i].selectedIndex].value : null;
				}
			}	
		}
		var structPacket = theSerializer.serialize(selectionStruct);
	    
	    
		// Invoke Server
		x_getItemRecords(trigger, structPacket, getItemRecordsResponse);
	}
}

function getItemRecordsResponse(responsePacket) {		
	// Populate the record fields based on the packet response from the server
	var theDeserializer = new WddxDeserializer;
	theDeserializer.preserveVarCase = true;
	var responseObject = theDeserializer.deserialize(responsePacket);
	if(responseObject !== null) {
		for(var i in responseObject.values) {
			addOptions(responseObject.values[i], MM_findObj(i));		
		}	
	}
//	alert(responseObject.cacheInfo);
//	MM_findObj('debugStr').value = responseObject.cacheInfo + "\n";
//	MM_findObj('debugStr').value += responseObject.debug;
}


function addOptions(object, target) {	
	if(target == null) return;
	if(target.selectedIndex > 0) {
		currentSelectionValue = target.options[target.selectedIndex].value;
	} else {		
		if(createStateVariables[target.name] !== undefined && createStateVariables[target.name] !== null) {
			if(initialisedVariables[target.name] == false) {
				currentSelectionValue = createStateVariables[target.name];
				initialisedVariables[target.name] = true;
			}	
		} else {
			currentSelectionValue = 0;	
		}
	}
	target.options.length = 0;
	var x = 0;
	var y = -1;
	var newOption = document.createElement('option');
	newOption.value = 0;
	newOption.text = 'Any';
	if(newOption.value == currentSelectionValue) 
	  	y = x;	
	 
	target.options[x] = newOption;
	
	// Place in sorting
	var optionsArray = new Array();
	function availableOption(optionValue, optionText) {
		this.optionValue = optionValue;
		this.optionText = optionText;	
	}
	z = 0;
	for(var i in object) {
		optionsArray[z++] = new availableOption(i, object[i]);	
	}	
	// Sort the options (case insensitive bubblesort)
	optionsArray.sort(sortOption);
		for(var x = 0; x < optionsArray.length; x++) {
		var newOption = document.createElement('option');
		newOption.value = optionsArray[x].optionValue;
		newOption.text = optionsArray[x].optionText;
		if(newOption.value == currentSelectionValue)
			y = x + 1;
		target.options[x + 1] = newOption; // standards compliant; doesn't work in IE
	}
	if(y == -1) y = 0;
	target.selectedIndex = y;
}

function sortOption(a, b) { 
	if(a == null) return true;
	if(b == null) return false;
	var x = a.optionText.toLowerCase();
    var y = b.optionText.toLowerCase();
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

/**
 * Initialises the form based off the elements passed into this script
 */
function initialiseForm() {
	alert("inititalised called");
	var connectionAvailable = sajax_init_object();
	if(!connectionAvailable) {	
		getItemRecords();
	} else {
		// Collate all the selections
		var theSerializer = new WddxSerializer;
		theSerializer.preserveVarCase = true;
		var selectionStruct = createStateVariables;
		var structPacket = theSerializer.serialize(selectionStruct);
		
		// Invoke Server		
		//alert(structPacket);
		x_getItemRecords("productCatalogProductCategory", structPacket, getItemRecordsResponse);
	}
}

//initialiseForm();
/*
 * SAJAX BELOW LINE
 */
		
// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_debug_mode = false;
var sajax_request_type = "POST";

function sajax_debug(text) {
	if (sajax_debug_mode)
		alert("RSD: " + text)
}
function sajax_init_object() {
	sajax_debug("sajax_init_object() called..")
	
	var A;
	try {
		A=new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			A=new ActiveXObject("Microsoft.XMLHTTP");
		} catch (oc) {
			A=null;
		}
	}
	if(!A && typeof XMLHttpRequest != "undefined")
		A = new XMLHttpRequest();
	if (!A)
		sajax_debug("Could not create connection object.");
	return A;
}
function sajax_do_call(func_name, args) {
	var i, x, n;
	var uri;
	var post_data;
	
	uri = "/catalog/engine/searchEngineJS.php?itemid=89";
	if (sajax_request_type == "GET") {
		if (uri.indexOf("?") == -1) 
			uri = uri + "?rs=" + escape(func_name);
		else
			uri = uri + "&rs=" + escape(func_name);
		for (i = 0; i < args.length-1; i++) 
			uri = uri + "&rsargs[]=" + escape(args[i]);
		uri = uri + "&rsrnd=" + new Date().getTime();
		post_data = null;
	} else {
		post_data = "rs=" + escape(func_name);
		for (i = 0; i < args.length-1; i++) 
			post_data = post_data + "&rsargs[]=" + escape(args[i]);
	}
	
	x = sajax_init_object();
	x.open(sajax_request_type, uri, true);
	if (sajax_request_type == "POST") {
		x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
		x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}
	x.onreadystatechange = function() {
		if (x.readyState != 4) 
			return;
		sajax_debug("received " + x.responseText);
		
		var status;
		var data;
		status = x.responseText.charAt(0);
		data = x.responseText.substring(2);
		if (status == "-") 
			alert("Error: " + data);
		else  
			args[args.length-1](data);
	}
	x.send(post_data);
	sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
	sajax_debug(func_name + " waiting..");
	delete x;
}
		
				
// wrapper for getItemRecords
function x_getItemRecords() {
	sajax_do_call("getItemRecords",
		x_getItemRecords.arguments);
}
		
		