
var select_chain = {

    value : 0,
    id : 0,
    key : 0,
    class_name : '',
    select_elm : false,
    div_elm : false,
    url : '',
    
    load : function()
    {
        var all = window.$$('div.select_chain_group');
    },
    
    set_url : function(url)
    {
        select_chain.url = url;
    },
    
    update : function(selectElm,key)
    {
        select_chain.value = selectElm.value;

        select_chain.id = selectElm.id.replace(/select_chain_/,'');
        select_chain.key = key;
        //use this get get main value
        select_chain.class_name = selectElm.className;
        
        //get parent div element
        select_chain.div_elm = select_chain.find_parent($(selectElm),'div','select_chain_group');
                        
        //loop through each select in this row
        var all = select_chain.div_elm.getElements('.'+selectElm.className);
        var len = all.length-1;
        
        if(len == key)
        {
            //last item, no change needed!
        }
        else
        {
            //skip the first one
            for(var count = (key+1); count <= len; count++)
            {
                //change the second select
                if(count == (key+1))
                {
                    //blank the next
                    all[count].length = 1;
                    all[count].options[0] = new Option('- Loading -','-',true);
                    
                    //set ref to this elm so we can update when ajax comes back
                    select_chain.select_elm = all[count];
                    
                    this.send(selectElm);
                }
                else
                {
                    //blank the next
                    all[count].length = 1;
                    all[count].options[0] = new Option('-','',true);
                }
            }
        }
        select_chain.update_value();
    },

    update_value : function()
    {
        //alert(select_chain.class_name);
        var v = select_chain.div_elm.getElement('.' + select_chain.class_name + '_value');
	console.log('.' + select_chain.class_name + '_value');
        //find the last select
        var all = select_chain.div_elm.getElements('.' + select_chain.class_name);
        var last = all[all.length-1];
		console.log(all);
		console.log(length);
		
        //update hidden value
        v.value = last.value;
    },
    
    send : function (selectElm)
    {

        //set up get var to send
        var toSend='';
        toSend+='select_chain_id='+select_chain.id+'&value='+select_chain.value+'&key='+select_chain.key;
        
        //alert(toSend);
        dAjaxSend(toSend,select_chain.confirm,select_chain.url);
    },

    confirm : function (data,elm)
    {
        var s = select_chain.select_elm;

        var count = 0;
        data['list'].each(function(o,i)
        {
            if(o != null)
            {
                this.options[count] = new Option(o,i,'');
                count++;
            }
        },s);

        select_chain.update_value();
    },
	
    find_parent : function(elm,theTag,theClass)
    {
        elm = $(elm);

        if(theClass != '')
        {
            while(elm !== false && (elm.getTag() != theTag || elm.hasClass(theClass) == false))
            {
                elm = elm.getParent();
            };
        }
        else
        {
            while(elm !== false && elm.getTag() != theTag)
            {
                elm = elm.getParent();
            };
        }
        
        if(elm == false)
        {
            alert('could not find tag: ' + theTag + ' ..or class: ' + theClass);
        }
        
        return elm;
    }
}

window.addEvent('load',select_chain.load);




function dAjaxSend(formData,zcallBack,serverUrl,callBackArray)
{
    dAjaxLoading(true);

    if(window.XMLHttpRequest){
        var xmlReq = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
    }
    xmlReq.onreadystatechange = function(){
        if(xmlReq.readyState == 4){
            //document.getElementById('insert').innerHTML = xmlReq.responseText;
            
            //turn off loading...
            dAjaxLoading(false);
            
            var textSerial=xmlReq.responseText;
            
            //alert(textSerial);
            //unserialize data
            var data = PHP_Unserialize(textSerial);
            
            if(data==null){
                alert('error in dAjaxSubmitForm: '+textSerial);
            }
            
            zcallBack(data,callBackArray);
        }
    }
    xmlReq.open('POST', serverUrl, true);
    xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlReq.send(formData);
    
    return false;
}

function dAjaxDoResponse(theText)
{
    alert(theText);
}

function dAjaxLoading(view)
{
    var loading = $('HTML_AJAX_LOADING');

    if(view==true)
    {
        if (loading != false)
        {
            loading = document.createElement('div');
            loading.id = 'HTML_AJAX_LOADING';
            loading.innerHTML = 'Loading...';
            loading.count = 0;
            
            // set some styles            
            var s = $(loading);
            s.setStyle('color','#fff');
            s.setStyle('position','absolute');
            s.setStyle('top',0);
            s.setStyle('right',0);
            s.setStyle('backgroundColor','#f00');
            s.setStyle('border','1px solid #f99');
            s.setStyle('width','80px');
            s.setStyle('padding','4px');
            s.setStyle('fontFamily','Arial');
        
            var marginChange = new Fx.Style(loading, 'opacity').start(0,1);
        
           document.body.insertBefore(loading,document.body.firstChild);

        }
        else
        {
            loading.setStyle('display','');
        }
    }else{
        if(loading != false)
        {
            loading.remove();
        }
    }
}


/**
* Unserializes a PHP serialized data type. Currently handles:
*  o Strings
*  o Integers
*  o Doubles
*  o Arrays
*  o Booleans
*  o NULL
*  o Objects
* 
* alert()s will be thrown if the function is passed something it
* can't handle or incorrect data.
*
* @param  string input The serialized PHP data
* @return mixed        The resulting datatype
*/
function PHP_Unserialize(input)
{
    var result = PHP_Unserialize_(input);
    return result[0];
}


/**
* Function which performs the actual unserializing
*
* @param string input Input to parse
*/
function PHP_Unserialize_(input)
{
    var length = 0;
    
    switch (input.charAt(0)) {
        /**
        * Array
        */
        case 'a':
            length = PHP_Unserialize_GetLength(input);
            input  = input.substr(String(length).length + 4);

            var arr   = new Array();
            var key   = null;
            var value = null;

            for (var i=0; i<length; ++i) {
                key   = PHP_Unserialize_(input);
                input = key[1];

                value = PHP_Unserialize_(input);
                input = value[1];

                arr[key[0]] = value[0];
            }

            input = input.substr(1);
            return [arr, input];
            break;
        
        /**
        * Objects
        */
        case 'O':
            length = PHP_Unserialize_GetLength(input);
            var classname = String(input.substr(String(length).length + 4, length));
            
            input  = input.substr(String(length).length + 6 + length);
            var numProperties = Number(input.substring(0, input.indexOf(':')))
            input = input.substr(String(numProperties).length + 2);

            var obj      = new Object();
            var property = null;
            var value    = null;

            for (var i=0; i<numProperties; ++i) {
                key   = PHP_Unserialize_(input);
                input = key[1];
                
                // Handle private/protected
                key[0] = key[0].replace(new RegExp('^\x00' + classname + '\x00'), '');
                key[0] = key[0].replace(new RegExp('^\x00\\*\x00'), '');

                value = PHP_Unserialize_(input);
                input = value[1];

                obj[key[0]] = value[0];
            }

            input = input.substr(1);
            return [obj, input];
            break;

        /**
        * Strings
        */
        case 's':
            length = PHP_Unserialize_GetLength(input);
            return [String(input.substr(String(length).length + 4, length)), input.substr(String(length).length + 6 + length)];
            break;

        /**
        * Integers and doubles
        */
        case 'i':
        case 'd':
            var num = Number(input.substring(2, input.indexOf(';')));
            return [num, input.substr(String(num).length + 3)];
            break;
        
        /**
        * Booleans
        */
        case 'b':
            var bool = (input.substr(2, 1) == 1);
            return [bool, input.substr(4)];
            break;
        
        /**
        * Null
        */
        case 'N':
            return [null, input.substr(2)];
            break;

        /**
        * Unsupported
        */
        case 'o':
        case 'r':
        case 'C':
        case 'R':
        case 'U':
            alert('Error: Unsupported PHP data type found!');

        /**
        * Error
        */
        default:
            return [null, null];
            break;
    }
}


/**
* Returns length of strings/arrays etc
*
* @param string input Input to parse
*/
function PHP_Unserialize_GetLength(input)
{
    input = input.substring(2);
    var length = Number(input.substr(0, input.indexOf(':')));
    return length;
}

