YAHOO.diamondSearch = function(){
	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;
    var done, active, handled, stillActive, controlActive, matches, step2disabled;

 	return {
        setupEvents:function(el){
            YAHOO.util.Event.addListener(el, 'click', YAHOO.diamondSearch.clicked);
            var links = el.getElementsByTagName('a');
            for (var l=0;l<links.length;l++) {
                if (YAHOO.util.Dom.hasClass(links[l], 'info_link')) {
                    YAHOO.util.Event.addListener(links[l], 'click', YAHOO.diamondSearch.infoClicked);
                }
            }

            var inputs = el.getElementsByTagName('input');
            for (var i=0;i<inputs.length;i++) {
                var type = inputs[i].getAttribute('type').toLowerCase();
                YAHOO.util.Event.addListener(inputs[i], 'focus', YAHOO.diamondSearch.gotFocus);
                if (type == 'text') {
                    YAHOO.util.Event.addListener(inputs[i], 'keyup', YAHOO.diamondSearch.textChange);
                    YAHOO.util.Event.addListener(inputs[i], 'change', YAHOO.diamondSearch.valueChange);
                }
                if (type == 'checkbox' || type == 'radio') {
                    YAHOO.util.Event.addListener(inputs[i], 'click', YAHOO.diamondSearch.valueChange);
                }
            }

        },
        init:function(){
            YAHOO.diamondSearch.reset(null, true);
            var elements;
            var node_name;
            YAHOO.util.Event.on('ring_builder', 'reset', YAHOO.diamondSearch.reset);
            YAHOO.util.Event.on('ring_builder', 'submit', YAHOO.diamondSearch.validateSubmit);

            var sections = YAHOO.util.Dom.getElementsByClassName('form_section', 'div', 'ring_builder');
            for (var s=0;s<sections.length;s++) {
                YAHOO.diamondSearch.setupEvents(sections[s]);
            }
			if(YAHOO.diamondSearch.isDisabledStep2(true)){
				YAHOO.diamondSearch.disableStep('cut');
			}else{
				YAHOO.diamondSearch.enableStep('cut');
			}
        },
		isDisabledStep2:function(first_check){
			var ret = true;
			if(document.getElementById('shape_round').checked){
				ret = false;
				//alert('round is checked');
			}
            if (first_check != undefined && first_check) {
                YAHOO.diamondSearch.step2disabled = ret;
            }
			return ret;
		},
		disableStep:function(id){
			var step = document.getElementById(id);
			$D.removeClass(step,'active');
			$D.removeClass(step,'done');
			$E.removeListener(step,'click');
			$D.setStyle(step,'opacity','.3');

			var info_link = $D.getElementsByClassName('info_link','a',step);
			$E.removeListener(info_link,'click');

			var inputs = step.getElementsByTagName('input');
			for (var i=0; i < inputs.length; i++) {
				$E.removeListener(inputs[i], 'focus');
				$E.removeListener(inputs[i],'click');
				inputs[i].checked = false;
				inputs[i].disabled = true;
			};
            YAHOO.diamondSearch.step2disabled = true;
		},
		enableStep:function(id){
			var step = document.getElementById(id);
			YAHOO.util.Event.on(step, 'click', YAHOO.diamondSearch.clicked);
			$D.setStyle(step,'opacity','1');
			var info_link = $D.getElementsByClassName('info_link','a',step);
			$E.addListener(info_link,'click', YAHOO.diamondSearch.infoClicked);

			var inputs = step.getElementsByTagName('input');
			for (var i=0; i < inputs.length; i++) {
				$E.addListener(inputs[i], 'focus', YAHOO.diamondSearch.gotFocus);
				$E.addListener(inputs[i],'click', YAHOO.diamondSearch.valueChange);
				inputs[i].disabled = false;
			};
            YAHOO.diamondSearch.step2disabled = false;
		},
        reset:function(ev, restore) {
            YAHOO.diamondSearch.matches = 0;
            var form = document.getElementById('ring_builder');
            var sections = YAHOO.util.Dom.getElementsByClassName('form_section', 'div', 'ring_builder');
            if (restore) {
                var d, shape, a;
                a = document.getElementById('active');
                if (a) {
                    a = a.value;
                }
                YAHOO.diamondSearch.done = new Array();
                YAHOO.diamondSearch.done['shape'] = true;
                for (var s=0;s<sections.length;s++) {
                    shape = sections[s].getAttribute('id');
                    d = document.getElementById(shape + '_done');
                    if (d && d.value == 1) {
                        YAHOO.diamondSearch.done[shape] = true;
                    }
                    if (a == shape) {
                        YAHOO.diamondSearch.active = sections[s];
                    }
                }
            } else if (form) {
                var elements = form.getElementsByTagName('input');
                for (var e=0;e<elements.length;e++) {
                    if (elements[e].getAttribute('type') == 'text' || elements[e].getAttribute('type') == 'hidden') {
                        elements[e].value = '';
                    } else if (elements[e].getAttribute('type') == 'checkbox' || elements[e].getAttribute('type') == 'radio') {
                        elements[e].checked = false;
                    }
                }
                YAHOO.diamondSearch.done = Array();
                YAHOO.diamondSearch.done['shape'] = true;
                var sd = document.getElementById('shape_done');
                if (sd) {
                    sd.value = 1;
                }
                YAHOO.diamondSearch.active = false;
                YAHOO.diamondSearch.stillActive = false;
                YAHOO.diamondSearch.controlActive = false;
                for (var s=0;s<sections.length;s++) {
                    YAHOO.util.Dom.removeClass(sections[s], 'done');
                    YAHOO.util.Dom.removeClass(sections[s], 'active');
                }
                YAHOO.util.Dom.setStyle('matches_box', 'visibility', 'hidden');
                var shape_round = document.getElementById('shape_round');
                if (shape_round) {
                    shape_round.checked = true;
                    YAHOO.diamondSearch.formChanged(shape_round, true);
                }
            }
            YAHOO.diamondSearch.updateSearch();
            if (ev) {
                YAHOO.util.Event.stopEvent(ev);
            }
            YAHOO.diamondSearch.handled = false;
        },
        formChanged:function(el,e){
            if (! YAHOO.diamondSearch.isActive(el)) {
                YAHOO.diamondSearch.deactivate(YAHOO.diamondSearch.active);
                YAHOO.diamondSearch.activate(el);
            }
        },
        clicked:function(e){
            YAHOO.diamondSearch.formChanged(this,e);
        },

        infoClicked:function(e){
            YAHOO.util.Event.stopEvent(e);
            YAHOO.diamondSearch.formChanged(this,e);
        },
        gotFocus:function(e){
            YAHOO.diamondSearch.controlActive = true;
            YAHOO.diamondSearch.formChanged(this,e);
        },
        getContainingFormSection:function(el){
            var my_section;
            if (YAHOO.util.Dom.hasClass(el, 'form_section')) {
                my_section = el;
            } else {
                my_section = YAHOO.util.Dom.getAncestorByClassName(el, 'form_section');
            }
            return my_section;
        },
        isActive:function(el){
            return YAHOO.diamondSearch.getContainingFormSection(el) == YAHOO.diamondSearch.active;
        },
        deactivate:function(el){
            var my_section = YAHOO.diamondSearch.getContainingFormSection(el);
            if (my_section) {
                YAHOO.util.Dom.removeClass(my_section, 'active');
                if (YAHOO.diamondSearch.done[my_section.getAttribute('id')]) {
                    YAHOO.util.Dom.addClass(my_section, 'done');
                    var active = document.getElementById('active');
                    if (active) {
                        active.value = '';
                    }
                }
                YAHOO.diamondSearch.active = false;
            }
        },

        activate:function(el){
            var my_section = YAHOO.diamondSearch.getContainingFormSection(el);
            if (my_section) {
                if (YAHOO.util.Dom.hasClass(my_section, 'done')) {
                    YAHOO.diamondSearch.done[my_section.getAttribute('id')] = true;
                    YAHOO.util.Dom.removeClass(my_section, 'done');
                }
                YAHOO.util.Dom.addClass(my_section, 'active');
                YAHOO.diamondSearch.active = my_section;
                YAHOO.diamondSearch.placeCounter(YAHOO.diamondSearch.active, YAHOO.util.Dom.getElementsByClassName('bubble_info', 'div', YAHOO.diamondSearch.active)[0]);
                var active = document.getElementById('active');
                if (active) {
                    active.value = my_section.getAttribute('id');
                }
            }
        },
        valueChange:function(){
            var my_section = YAHOO.diamondSearch.getContainingFormSection(this);
            if (my_section) {
                YAHOO.diamondSearch.done[my_section.getAttribute('id')] = true;
                var done = document.getElementById(my_section.getAttribute('id') + '_done');
                if (done) {
                    done.value = '1';
                }
            }
            disabled = YAHOO.diamondSearch.isDisabledStep2();
            if (disabled != YAHOO.diamondSearch.step2disabled) {
    			if(disabled){
    				YAHOO.diamondSearch.disableStep('cut');
    			}else{
    				YAHOO.diamondSearch.enableStep('cut');
    			}
            }
            YAHOO.diamondSearch.updateSearch();
        },
        textChange:function(e){
            var key = (e.which) ? e.which : e.keyCode;
            if (key == 9) {
                return;
            }
            var my_section = YAHOO.diamondSearch.getContainingFormSection(this);
            if (my_section) {
                YAHOO.diamondSearch.done[my_section.getAttribute('id')] = true;
                var done = document.getElementById(my_section.getAttribute('id') + '_done');
                if (done) {
                    done.value = '1';
                }
            }
        },
        updateSearch:function(){
            var formObject = document.getElementById('ring_builder');
            YAHOO.util.Connect.setForm(formObject);
            // This example facilitates a POST transaction.
            // An HTTP GET can be used as well.
            var cObj = YAHOO.util.Connect.asyncRequest('POST', '/diamonds/search', {success: YAHOO.diamondSearch.updateCount});
        },
        updateCount:function(o){
            var new_count = o.responseText.replace(/[^0-9].*/, '');
            if (new_count.length == 0) {
                new_count = -1;
            }
            if (new_count == -1) {
                var node = document.createTextNode('Search Error');
            } else {
                var s = new_count != 1 ? 'es' : '';
                var node = document.createTextNode(new_count + ' match' + s + ' found');
            }
            YAHOO.diamondSearch.matches = new_count;
            var matches_box = document.getElementById('matches_box');
            if (! matches_box) {
                matches_box = document.createElement('div');
                matches_box.setAttribute('id', 'matches_box');
                matches_box.appendChild(node);
                $E.on(matches_box, 'click', YAHOO.diamondSearch.submit);
                document.getElementById('ring_builder').appendChild(matches_box);
            } else {
                matches_box.replaceChild(node, matches_box.firstChild);
            }

            YAHOO.diamondSearch.placeCounter(YAHOO.diamondSearch.active, YAHOO.util.Dom.getElementsByClassName('bubble_info', 'div', YAHOO.diamondSearch.active)[0]);
        },
        submit:function() {
            if (YAHOO.diamondSearch.validateSubmit()) {
                document.ring_builder.submit();
            }
        },
        validateSubmit:function(e) {
            if (YAHOO.diamondSearch.matches == 0) {
                window.alert('There are no matches for the currently selected criteria.');
                if (e) {
                    $E.stopEvent(e);
                }
                return false;
            }
            return true;
        },
        placeCounter:function(active, bubble) {
            var matches_box = document.getElementById('matches_box');
            if (! matches_box) {
                return;
            }
            matches_box.parentNode.removeChild(matches_box);
            if (active) {
                active.appendChild(matches_box);
                YAHOO.util.Dom.setStyle('matches_box', 'left', '439px');
                var region = YAHOO.util.Dom.getRegion(bubble);
                var elmHeight = region.bottom - region.top + 20;
                YAHOO.util.Dom.setStyle('matches_box', 'top', elmHeight + 'px');
            } else {
                document.getElementById('ring_builder').appendChild(matches_box);
                YAHOO.util.Dom.setStyle('matches_box', 'right', '4px');
                YAHOO.util.Dom.setStyle('matches_box', 'bottom', '8px');
            }
            YAHOO.util.Dom.setStyle(matches_box, 'visibility', 'visible');
        }
    };
}();

YAHOO.util.Event.addListener(window, "load", YAHOO.diamondSearch.init);
