/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
VarienForm = Class.create();
VarienForm.prototype = {
    initialize: function(formId, firstFieldFocus){
        this.form       = $(formId);
        if (!this.form) {
            return;
        }
        this.cache      = $A();
        this.currLoader = false;
        this.currDataIndex = false;
        this.validator  = new Validation(this.form);
        this.elementFocus   = this.elementOnFocus.bindAsEventListener(this);
        this.elementBlur    = this.elementOnBlur.bindAsEventListener(this);
        this.childLoader    = this.onChangeChildLoad.bindAsEventListener(this);
        this.highlightClass = 'highlight';
        this.extraChildParams = '';
        this.firstFieldFocus= firstFieldFocus || false;
        this.bindElements();
        if(this.firstFieldFocus){
            try{
                Form.Element.focus(Form.findFirstElement(this.form))
            }
            catch(e){}
        }
    },

    submit : function(url){
        if(this.validator && this.validator.validate()){
             this.form.submit();
        }
        return false;
    },

    bindElements:function (){
        var elements = Form.getElements(this.form);
        for (var row in elements) {
            if (elements[row].id) {
                Event.observe(elements[row],'focus',this.elementFocus);
                Event.observe(elements[row],'blur',this.elementBlur);
            }
        }
    },

    elementOnFocus: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.addClassName(element, this.highlightClass);
        }
    },

    elementOnBlur: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.removeClassName(element, this.highlightClass);
        }
    },

    setElementsRelation: function(parent, child, dataUrl, first){
        if (parent=$(parent)) {
            // TODO: array of relation and caching
            if (!this.cache[parent.id]){
                this.cache[parent.id] = $A();
                this.cache[parent.id]['child']     = child;
                this.cache[parent.id]['dataUrl']   = dataUrl;
                this.cache[parent.id]['data']      = $A();
                this.cache[parent.id]['first']      = first || false;
            }
            Event.observe(parent,'change',this.childLoader);
        }
    },

    onChangeChildLoad: function(event){
        element = Event.element(event);
        this.elementChildLoad(element);
    },

    elementChildLoad: function(element, callback){
        this.callback = callback || false;
        if (element.value) {
            this.currLoader = element.id;
            this.currDataIndex = element.value;
            if (this.cache[element.id]['data'][element.value]) {
                this.setDataToChild(this.cache[element.id]['data'][element.value]);
            }
            else{
                new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{
                        method: 'post',
                        parameters: {"parent":element.value},
                        onComplete: this.reloadChildren.bind(this)
                });
            }
        }
    },

    reloadChildren: function(transport){
        var data = eval('(' + transport.responseText + ')');
        this.cache[this.currLoader]['data'][this.currDataIndex] = data;
        this.setDataToChild(data);
    },

    setDataToChild: function(data){
        if (data.length) {
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<select name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                if(this.cache[this.currLoader]['first']){
                    html+= '<option value="">'+this.cache[this.currLoader]['first']+'</option>';
                }
                for (var i in data){
                    if(data[i].value) {
                        html+= '<option value="'+data[i].value+'"';
                        if(child.value && (child.value == data[i].value || child.value == data[i].label)){
                            html+= ' selected';
                        }
                        html+='>'+data[i].label+'</option>';
                    }
                }
                html+= '</select>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }
        else{
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<input type="text" name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }

        this.bindElements();
        if (this.callback) {
            this.callback();
        }
    }
}

RegionUpdater = Class.create();
RegionUpdater.prototype =
{
	initialize: function( countryEl, regionTextEl, regionSelectEl, regions, disableAction )
	{
		this.countryEl = $( countryEl );
		this.regionTextEl = $( regionTextEl );
		this.regionSelectEl = $( regionSelectEl );
		this.regions = regions;

		this.disableAction = ( typeof disableAction == 'undefined' ) ? 'hide' : disableAction;

		if( this.regionSelectEl.options.length <= 1 )
		{
			this.update();
		}

		Event.observe( this.countryEl, 'change', this.update.bind( this ) );
	},

	update: function()
	{
		if( this.regions[this.countryEl.value] )
		{
			var i, option, region, def;

			if( this.regionTextEl )
			{
				def = this.regionTextEl.value.toLowerCase();
				this.regionTextEl.value = '';
			}

			if( !def )
			{
				def = this.regionSelectEl.getAttribute( 'defaultValue' );
			}

			this.regionSelectEl.options.length = 1;
			for( regionId in this.regions[this.countryEl.value] )
			{
				region = this.regions[this.countryEl.value][regionId];

				option = document.createElement( 'OPTION' );
				option.value = regionId;
				option.text = region.name;

				if( this.regionSelectEl.options.add )
				{
					this.regionSelectEl.options.add( option );
				}
				else
				{
					this.regionSelectEl.appendChild( option );
				}

				if( regionId == def || region.name.toLowerCase() == def || region.code.toLowerCase() == def )
				{
					this.regionSelectEl.value = regionId;
				}
			}

			if( this.disableAction == 'hide' )
			{
				if( this.regionTextEl )
				{
					this.regionTextEl.style.display = 'none';
				}

				this.regionSelectEl.style.display = '';
			}
			else if ( this.disableAction == 'disable' )
			{
				if( this.regionTextEl )
				{
					this.regionTextEl.disabled = true;
				}

				this.regionSelectEl.disabled = false;
			}

			this.setMarkDisplay(this.regionSelectEl, true);
		}
		else
		{
			if( this.disableAction == 'hide' )
			{
				if( this.regionTextEl )
				{
					this.regionTextEl.style.display = '';
				}

				this.regionSelectEl.style.display = 'none';
				Validation.reset( this.regionSelectEl );
			}
			else if ( this.disableAction == 'disable' )
			{
				if( this.regionTextEl )
				{
					this.regionTextEl.disabled = false;
				}

				this.regionSelectEl.disabled = true;
			}
			else if ( this.disableAction == 'nullify' )
			{
				this.regionSelectEl.options.length = 1;
				this.regionSelectEl.value = '';
				this.regionSelectEl.selectedIndex = 0;
				this.lastCountryId = '';
			}

			this.setMarkDisplay( this.regionSelectEl, false );
		}
	},

	setMarkDisplay: function( elem, display )
	{
		elem = $( elem );

		var labelElement = elem.up( 1 ).down( 'label > span.required' )
					 ||
					 elem.up(2).down( 'label > span.required' )
					 ||
					 elem.up(1).down( 'label.required > em' )
					 ||
					 elem.up(2).down( 'label.required > em' );

		if( labelElement )
		{
			display ? labelElement.show() : labelElement.hide();
		}
	}
}
