YAHOO.namespace("sme");
YAHOO.sme.slideshow = function (containerName, o) {
	//Global Vars
		this.current_index = 0;
		this.container = null;
		this.anim_frames = [];
		this.active_frame = null;
		this.next_frame = null;
		this.controls = null;
		this.direction = 1;
		this.animation = null;
		this.inAnimation = false;
		this.loop_interval = null;
		this.initEvent = new YAHOO.util.CustomEvent("initEvent"); //YAHOO.util.CustomEvent.createEvent("init");
	//Global Params
		this.containerName = containerName;
		this.maxHeight = o.maxHeight;		
		this.hiddenClass = o.hiddenClass;
		if (!o.fwdeffect){
			this.fwdeffect = YAHOO.sme.slideshow.effects.slideUp;
		}else{
			this.fwdeffect = o.fwdeffect;
		}
		if (!o.bckeffect){
			this.bckeffect = YAHOO.sme.slideshow.effects.slideDown;
		}else{
			this.bckeffect = o.bckeffect;
		}
		this.effect = this.fwdeffect;
		if (o.interval){
			this.interval = o.interval;
		}else{
			this.interval = 5000;
		}
		this.waitTillFeedlLoaded = o.waitTillFeedlLoaded;
		if (o.feedXML != ""){
			var callback = { 
				success: function(o) {
					(o.argument[0]).pushXMLContent(o);
					if ((o.argument[0]).waitTillFeedlLoaded){
						(o.argument[0]).init();
					}
				},
				failure: function(o) {
					if ((o.argument[0]).waitTillFeedlLoaded){
						(o.argument[0]).init();
					}
				},
				argument: [this]
			}
			var transaction = YAHOO.util.Connect.asyncRequest('GET', o.feedXML , callback,  null); 
			if (!this.waitTillFeedlLoaded){
				this.init();
			}
		}else{
			this.init();
		}
}

YAHOO.sme.slideshow.prototype = {
	init: function(){
			this.container = YAHOO.util.Dom.get(this.containerName);
			this.anim_frames = YAHOO.util.Dom.getElementsByClassName("yui-sldshw-frame", null, this.container);
			this.controls = (YAHOO.util.Dom.getElementsByClassName("yui-sldshw-controls", null, this.container.parentNode))[0];
			//this.all_frames = YAHOO.util.Dom.getChildren(this.container);
			for (var f = 0; f < this.anim_frames.length; f++){
				if (f == 0){
					this.toActive(this.anim_frames[f]);
				}else if (f == 1){
					this.toNext(this.anim_frames[f]);
				}else{
					this.toCache(this.anim_frames[f]);
				}
			}
			this.initControls();
			this.initEvent.fire(this);
		},
	pushXMLContent: function(o){
			var root = o.responseXML.documentElement; 
			var slides = root.getElementsByTagName('content');
			var next_slide = null;
			var first_child = YAHOO.util.Dom.get(this.containerName).firstChild;
			var str = "";
			for (var s=0; s <  slides.length; s++){
				str = "";
				//alert(s+": "+slides[s].hasChildNodes());
				if (slides[s].hasChildNodes()){
					slide_contents = slides[s].childNodes;
					for (var c = 0; c < slide_contents.length; c++){
						if (window.ActiveXObject){
							str += slide_contents[c].xml;
						}else{
							str += (new XMLSerializer()).serializeToString(slide_contents[c]);
						}
						//alert((s+1)+"/"+slides.length+","+(c+1)+"/"+slide_contents.length+": " + str);
					}
					if (str != ""){
						next_slide = document.createElement('div');
						YAHOO.util.Dom.addClass(next_slide, "yui-sldshw-frame");
						next_slide.setAttribute('id','content_'+slides[s].getAttribute('id'));
						next_slide.innerHTML = str;
						if (!this.waitTillFeedlLoaded || first_child != undefined){
							YAHOO.util.Dom.get(this.containerName).insertBefore(next_slide,first_child);
						}else{
							YAHOO.util.Dom.get(this.containerName).appendChild(next_slide);
						}
					}
				}
			}
		},
	initControls: function(){
			if (this.controls!= undefined && this.anim_frames.length > 1){
				var self = this;
				var prevBtn = document.createElement('div');
					prevBtn.setAttribute('id','prevBtn');
					YAHOO.util.Dom.get(this.controls).appendChild(prevBtn);
					YAHOO.util.Event.addListener('prevBtn', 'click', function(){ self.loopStop(); self.gotoPrev(); });
				var nextBtn = document.createElement('div');
					nextBtn.setAttribute('id','nextBtn');
					YAHOO.util.Dom.get(this.controls).appendChild(nextBtn);
					YAHOO.util.Event.addListener('nextBtn', 'click', function(){ self.loopStop(); self.gotoNext(); });
				var pauseBtn = document.createElement('div');
					pauseBtn.setAttribute('id','pauseBtn');
					if (this.loop_interval == null) YAHOO.util.Dom.setStyle('pauseBtn', 'display', 'none');
					YAHOO.util.Dom.get(this.controls).appendChild(pauseBtn);
					YAHOO.util.Event.addListener('pauseBtn', 'click', function(){ self.loopStop(); });
				var playBtn = document.createElement('div');
					playBtn.setAttribute('id','playBtn');
					if (this.loop_interval != null) YAHOO.util.Dom.setStyle('playBtn', 'display', 'none');
					YAHOO.util.Dom.get(this.controls).appendChild(playBtn);
					YAHOO.util.Event.addListener('playBtn', 'click', function(){ self.loopFwd(); });
				this.showControls();
			}
		},
	showControls: function(){
			if (this.controls!= undefined && this.anim_frames.length > 1){
				newH = this.maxHeight - parseInt(YAHOO.util.Dom.getStyle(this.controls, 'height'));
				YAHOO.util.Dom.setStyle(this.container, 'height', newH + 'px');
				YAHOO.util.Dom.setStyle(this.controls, 'display', 'block');
			}
		},
	hideControls: function(){
			if (this.controls!= undefined && this.anim_frames.length > 1){
				YAHOO.util.Dom.setStyle(this.container, 'height', this.maxHeight + 'px');
				YAHOO.util.Dom.setStyle(this.controls, 'display', 'none');
			}
		},
	gotoNext: function(){
			this.direction = 1;
			this.current_index = this.getNextIndex();
			this.effect = this.fwdeffect;
			this.switchFrames(this.anim_frames[this.current_index],null);
		},
	gotoPrev: function(){
			this.direction = -1;
			this.current_index = this.getPrevIndex();
			this.effect = this.bckeffect;
			this.switchFrames(this.anim_frames[this.current_index],null);
		},
	switchBack: function(){
			this.switchFrames(this.active_frame,this.effect);
		},
	switchFrames: function(to,effect){
			if (typeof(to) == "string" || typeof(to) == "object"){
				if (this.animation != null && this.inAnimation){
					this.animation.stop();
				}
				if (typeof(to) == "string"){ 
					to = YAHOO.util.Dom.get(to);
				}
				if (effect != null){
					if (effect == this.fwdeffect || effect == this.bckeffect) this.effect = effect;
				}else effect = this.effect;
				if (this.next_frame != to){
					if (this.active_frame != to){
						if (this.next_frame != null){ 
							this.toCache(this.next_frame);
						}
						this.toNext(to);
					}else{
						if (effect == this.bckeffect){
							effect = this.fwdeffect;
							this.effect = effect;
						}else if(effect == this.fwdeffect){
							effect = this.bckeffect;
							this.effect = effect;
						}
					}
				}
				//alert("to: " + to.id + " active: " + this.active_frame.id + " next: " + this.next_frame.id);
				this.animation = effect.get_animation(this.active_frame);
				this.animation.onComplete.subscribe(this.switchedFrames, this, true);
				this.inAnimation = true;
			    this.animation.animate();
			}
		},
	switchedFrames: function(){
			this.inAnimation = false;
			var next;
			if (this.getFrameIndex(this.next_frame) > -1){
				if (this.direction > 0){
					next = this.anim_frames[this.getNextIndex()];
				}else{
					next = this.anim_frames[this.getPrevIndex()];
				}
			}else{
				next = this.active_frame;
			}
			//alert("cache: " + this.active_frame.id + " active: " + this.next_frame.id + " next: " + next.id);
			this.toCache(this.active_frame);
			this.toActive(this.next_frame);
			this.toNext(next);
			this.effect.setup(next);
		},
	getFrameIndex: function(frame){
			for (var i = 0; i < this.anim_frames.length; i++){
				if (this.anim_frames[i] == frame){
					return i;
				}
			}
			return -1;
		},
	getNextIndex: function(){
			var i = this.current_index + 1;
			if (i >= this.anim_frames.length) i = 0;
			return i;
		},
	getPrevIndex: function(){
			var i = this.current_index - 1;
			if (i < 0) i = this.anim_frames.length - 1;
			return i;
		},
	loopStop: function(){
			if (this.loop_interval != null){
				clearInterval(this.loop_interval);
				this.loop_interval = null;
				YAHOO.util.Dom.setStyle('pauseBtn', 'display', 'none');
				YAHOO.util.Dom.setStyle('playBtn', 'display', 'block');
			}
		},
	loopFwd: function(){
			if (this.anim_frames.length > 1 && this.loop_interval == null){
				var self = this;
				this.loop_interval = setInterval( function(){ self.gotoNext();}, this.interval );
				YAHOO.util.Dom.setStyle('pauseBtn', 'display', 'block');
				YAHOO.util.Dom.setStyle('playBtn', 'display', 'none');
			}
		},
	loopBck: function(){
			if (this.anim_frames.length > 1){
				var self = this;
				this.loop_interval = setInterval( function(){ self.gotoPrev();}, this.interval );
				YAHOO.util.Dom.setStyle('pauseBtn', 'display', 'block');
				YAHOO.util.Dom.setStyle('playBtn', 'display', 'none');
			}
		},
	toCache: function(frame){
			YAHOO.util.Dom.setStyle(frame, 'z-index', '0');
			YAHOO.util.Dom.setStyle(frame, 'display', 'none');
			YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
			YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
		},
	toNext: function(frame){
			if (YAHOO.util.Dom.getStyle(frame, 'opacity') == '0') YAHOO.util.Dom.setStyle(frame, 'opacity', '1');
			YAHOO.util.Dom.setStyle(frame, 'z-index', '1');
			YAHOO.util.Dom.setStyle(frame, 'display', 'block');
			YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
			YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
			this.next_frame = frame; 
		},
	toActive: function(frame){
			YAHOO.util.Dom.setStyle(frame, 'z-index', '10');
			YAHOO.util.Dom.setStyle(frame, 'display', 'block');
			YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
			YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
			this.active_frame = frame; 
		}
}	
YAHOO.sme.slideshow.effects = {
	slideRight :{
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
				YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Motion(frame, { points: { by: [region.right-region.left,0] } }, 1, YAHOO.util.Easing.easeOut);
			}
		},
	slideLeft: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
				YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Motion(frame, { points: { by: [region.left-region.right,0] } }, 1, YAHOO.util.Easing.easeOut);
			}
		},
	squeezeLeft: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'width', '100%'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Anim(frame, { width: { to: 0 } }, 1, YAHOO.util.Easing.easeOut);
			}
		},
	squeezeRight: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'width', '100%'); 
				YAHOO.util.Dom.setStyle(frame, 'right', '0px'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				YAHOO.util.Dom.setStyle(frame, 'right', '0px'); 
				return new YAHOO.util.Anim(frame, { width: { to: 0 }}, 1, YAHOO.util.Easing.easeOut);
			}
		},
	squeezeUp: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'height', '100%'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Anim(frame, { height: { to: 0 }}, 1, YAHOO.util.Easing.easeOut);
			}
		},
	squeezeDown: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'height', '100%'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				YAHOO.util.Dom.setStyle(frame, 'bottom', '0px'); 
				return new YAHOO.util.Anim(frame, { height: { to: 0 }}, 1, YAHOO.util.Easing.easeOut);
			}
		},
	fadeOut: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'opacity', '1'); 
			},
			get_animation: function(frame){
				return new YAHOO.util.Anim(frame, { opacity: { to: 0 }}, 1, YAHOO.util.Easing.easeOut);
			}
		},
	fadeIn: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'opacity', '0'); 
				YAHOO.util.Dom.setStyle(frame, 'z-index', '20'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Anim(frame, { opacity: { to: 1 }}, 1, YAHOO.util.Easing.easeOut);
			}
		} ,
	slideUp: {
			setup: function(frame){
				YAHOO.util.Dom.setStyle(frame, 'top', '0'); 
				YAHOO.util.Dom.setStyle(frame, 'left', '0'); 
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Motion(frame, { points: { by: [0,region.top-region.bottom] } }, 1, YAHOO.util.Easing.easeOut);
			}
		},
	none: {
			setup: function(frame){
			},
			get_animation: function(frame){
				var region = YAHOO.util.Dom.getRegion(frame);
				return new YAHOO.util.Motion(frame, {}, 0);
			}
		}
}
YAHOO.sme.typeOf = function(value){
	var s = typeof(value);
	if (s === 'object') {
		if (value) {
			if (typeof value.length === 'number' &&
                    !(value.propertyIsEnumerable('length')) &&
                    typeof value.splice === 'function') {
                s = 'array';
			}
		} else {
			s = 'null';
		}
	}
	return s;
}
YAHOO.sme.trim = function(str) {
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}
YAHOO.sme.frmValidator = function (fields, config) {
		this.fields = fields;
		this.config = config;
		this.initialized = false;
		this.submitable = false;
}
YAHOO.sme.frmValidator.prototype = {
	init: function(){
		if (!this.initialized){
			for (var f=0; f < this.fields.length; f++){
				var rules = this.fields[f];
				rules.validate = this.hasValidation(rules);
				rules.valid = null; 	
				rules.hidden = (rules.hideId != undefined && this.config.hiddenClass != undefined && YAHOO.util.Dom.hasClass(rules.hideId, this.config.hiddenClass));
				if (rules.ignoreHide != undefined) rules.ignoreHide = false;
			}
			for (var f=0; f < this.fields.length; f++){
				var rules = this.fields[f];
				var field = YAHOO.util.Dom.get(rules.fieldFaux);
				if (rules.value != null) this.setSingleInputValue(field,rules.value,",");
				if (rules.mask != undefined && rules.defmask == undefined) rules.defmask = rules.mask; 
				if (rules.onChange != undefined) YAHOO.util.Event.addListener(field, 'change', rules.onChange, self);
				if (rules.onKeyUp != undefined) YAHOO.util.Event.addListener(field, 'keyup', rules.onKeyUp, self);
				if (rules.validate){
					var self = this;
					var val = this.getFieldValue(field);
					if (val != null && val != undefined && val != "") this.validate(field,true);
					YAHOO.util.Event.addListener(field, 'focus', self.clearOnFocus, self);
					YAHOO.util.Event.addListener(field, ((field.type == 'text' || field.type == 'password')? 'keyup':'change'), self.validateOnChange, self);
					YAHOO.util.Event.addListener(field, 'blur', self.validateOnBlur, self);
				}
				if (rules.descTxt != null){
					var ttl = YAHOO.sme.langvars[rules.descTxt];
					if (ttl != null){
						if (ttl.length > 40){
							tootltip = new YAHOO.widget.Tooltip(field.id+"-ttl", { context:field, text:ttl, width:((ttl.length > 160)? 340:240)+'px', showdelay:0, autodismissdelay:(ttl.length*125), zIndex:100 });
						}else tootltip = new YAHOO.widget.Tooltip(field.id+"-ttl", { context:field, text:ttl, zIndex:100 });
					}
				}
				if (rules.onInit != undefined) rules.onInit(field,self);
			}
			this.initialized = true;
		}
	},
	clearOnFocus: function(e,el){
		var field = YAHOO.util.Event.getTarget(e);
		var rules = el.getFieldRules(field);
		if (rules != null && rules.valid == false){
			el.clearState(field,rules);
		}
	},
	validateOnChange: function(e,el){
		var field = YAHOO.util.Event.getTarget(e);
		el.validate(field,(field.type == 'select-one' || field.type == 'radio'));
	},
	validateOnBlur: function(e,el){
		var field = YAHOO.util.Event.getTarget(e);
		el.validate(field,true);
	},
	validate: function(obj,done){
		if (typeof(obj)=="string"){
			var fieldId = obj;
			var field = YAHOO.util.Dom.get(obj);
		}else{
			var field = obj;
			var fieldId = obj.id;
		}
		var val = this.getFieldValue(field);
		if (val != null && val != undefined){
			var rules = this.getFieldRules(fieldId);
			if (rules != null){
				result = true;
				if (rules.mask != null){
					if (!this.isRegExp(rules.mask)) rules.mask = new RegExp(rules.mask);
					result = rules.mask.test(val);
				}
				if (result && rules.minLength != null)
					result = (val.length >= rules.minLength);
				if (result && rules.maxLength != null)
					result = (val.length <= rules.maxLength);
				if (result && rules.minValue != null && !isNaN(val))
					result = (Number(val) >= rules.minValue);
				if (result && rules.maxValue != null && !isNaN(val))
					result = (Number(val) <= rules.maxValue);
				this.changeState(field,rules,result,done);
				return result;
			}
		}
		return false;
	},
	validateIfNotEmpty: function(obj,done){
		if (YAHOO.sme.typeOf(obj)=="array"){
			var flist = obj;
		}else if (typeof(obj)=="string"){			
			var flist = [];
			flist[0] = obj;
		}else return false;
		b = true;
		for (var f=0; f < flist.length; f++){
			field = flist[f];
			val = this.getFieldValue(field);
			rules = this.getFieldRules(field);
			if ((val != null && val != '') || (rules != null && rules.validIfEmpty != undefined && rules.validIfEmpty)){
				fb = this.validate(field,done);
				fb = fb && b;
			}
		}
		//alert("validateIfNotEmpty: "+b);
		return b;
	},
	hasValidation: function(rule){
		return (rule.mask != null || rule.minLength != null || rule.maxLength != null || rule.minValue != null || rule.maxValue != null);
	},
	changeState: function(obj,rules,to,done){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		if (rules != null && rules.validate){
			var from = rules.valid;
			var resultContainer = this.config.resultContainer;
			var next = YAHOO.util.Dom.getNextSiblingBy(field,function(el){ return YAHOO.util.Dom.hasClass(el,resultContainer); });
			//if (to && !done && from != to && field.id == 'joinPcode1') alert("|"+from+"=>"+to+"|"+field.value+":"+rules.mask+"|");
			if(!to && done){
				this.clearState(field,rules);
				rules.valid = to;
				if (this.config.invalidStyle != undefined) YAHOO.util.Dom.addClass(field,this.config.invalidStyle);
				if (next != null && this.config.invalidImg != undefined){
					img = document.createElement('img');
					img.setAttribute('src',this.config.invalidImg);
					if (rules.invalidTxt != null){
						ttl = YAHOO.sme.langvars[rules.invalidTxt];
						if (ttl != null){
							id = YAHOO.util.Dom.generateId (img,'join-invalid-');
							if (ttl.length > 40){
								tootltip = new YAHOO.widget.Tooltip(id+"-ttl", { context:id, text:ttl, width:((ttl.length > 120)? 340:240)+'px', autodismissdelay:(ttl.length*125), zIndex:100 });
							}else tootltip = new YAHOO.widget.Tooltip(id+"-ttl", { context:id, text:ttl, zIndex:100 });
						}
					}
					next.appendChild(img);
				}
			}else if (to && from != to){
				this.clearState(field,rules);
				rules.valid = to;
				if (this.config.validStyle != undefined) YAHOO.util.Dom.addClass(field,this.config.validStyle);
				if (next != null && this.config.validImg != undefined){
					img = document.createElement('img');
					img.setAttribute('src',this.config.validImg);
					next.appendChild(img);
				}
				if (rules.onValidate != undefined)
					rules.onValidate(field,this);
			}
			if (from != to)
				this.refreshSubmitability(obj);
		}
	},
	refreshSubmitability: function(obj){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		var submitable = this.isSubmitable();
		if (submitable != this.submitable){ 
			if (submitable){ 
				//alert(field.id+": "+this.submitable+"=>"+submitable);
				if (this.config.onReady != undefined) this.config.onReady(obj,this); 
			}else{
				//alert(field.id+": "+this.submitable+"=>"+submitable);
				if (this.config.onUnReady != undefined) this.config.onUnReady(obj,this); 
			}
		}
		this.submitable = submitable;
	},
	clearState: function(obj,rules){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		rules.valid = null;
		if (YAHOO.util.Dom.hasClass(field,this.config.validStyle)) YAHOO.util.Dom.removeClass(field,this.config.validStyle);
		if (YAHOO.util.Dom.hasClass(field,this.config.invalidStyle)) YAHOO.util.Dom.removeClass(field,this.config.invalidStyle);
		var resultContainer = this.config.resultContainer;
		var next = YAHOO.util.Dom.getNextSiblingBy(field,function(el){ return YAHOO.util.Dom.hasClass(el,resultContainer); });
		if (next != null)
			next.innerHTML = "";
	},	
	getFieldRules: function(obj){
		if (typeof(obj)=="string"){
			var fieldId = obj;
		}else var fieldId = obj.id;
		for (var f=0; f < this.fields.length; f++)
			if (this.fields[f].fieldFaux == fieldId) return this.fields[f];
		return null;
	},
	getFieldValue: function(obj){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		if (field != null){
			return this.getSingleInputValue(field,false,",");
		}else return null;
	},
	getSingleInputValue: function(obj,use_default,delimiter) {
		if (typeof(obj)=="string")
			obj = YAHOO.util.Dom.get(obj);
		switch(obj.type){
			case 'radio': case 'checkbox': return(((use_default)?obj.defaultChecked:obj.checked)?obj.value:"");
			case 'text': case 'hidden': case 'textarea': return(use_default)?obj.defaultValue:obj.value;
			case 'password': return((use_default)?null:obj.value);
			case 'select-one':
				if (obj.options==null) { return null; }
				if(use_default){
					var o=obj.options;
					for(var i=0;i<o.length;i++){if(o[i].defaultSelected){return o[i].value;}}
					return o[0].value;
				}
				if (obj.selectedIndex<0){return null;}else return obj.options[obj.selectedIndex].value;
				//return(obj.options.length>0)?obj.options[obj.selectedIndex].value:null;
			case 'select-multiple': 
				if (obj.options==null) { return null; }
				var values=new Array();
				for(var i=0;i<obj.options.length;i++) {
					if((use_default&&obj.options[i].defaultSelected)||(!use_default&&obj.options[i].selected)) {
						values[values.length]=obj.options[i].value;
						}
					}
				return (values.length==0)?null:this.commifyArray(values,delimiter);
			}
		return null;
	},
	commifyArray: function(obj,delimiter){
		if (typeof(delimiter)=="undefined" || delimiter==null) { delimiter = ","; }
		var s="";
		if(obj==null||obj.length<=0){ return s; }
		for(var i=0;i<obj.length;i++){ s=s+((s=="")?"":delimiter)+obj[i].toString(); }
		return s;
	},
	setSingleInputValue: function(obj,val,delimiter){
		if (typeof(obj)=="string")
			obj = YAHOO.util.Dom.get(obj);
		switch(obj.type){
			case 'radio': 
				for(var i=0; i < obj.length; i++) 
					if(obj[i].value == val) obj[i].checked = true; 
				break;
			case 'checkbox':
				var vals = val.split(delimiter);
				for(var v=0;v<vals.length;v++)
					for(var i=0;i<obj.length;i++) 
						if(obj[i].value == vals[v]) obj[i].checked = true;
				break;
			case 'text':  case 'hidden': case 'textarea': 
				obj.value = val;
				break;
			case 'select-one': 
				var o=obj.options;
				for(var i=0;i<o.length;i++)
					if(o[i].value == val) o[i].selected = true;
				break;
			case 'select-multiple': 
				var o=obj.options;
				var vals = val.split(delimiter);
				for(var v=0;v<vals.length;v++)
					for(var i=0;i<o.length;i++)
						if(o[i].value == vals[v]) o[i].selected = true;
				break;
		}
	},	
	setAndValidate: function(obj,val,done){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		this.setSingleInputValue(field,val,",");
		this.validate(field,done);
	},
	resetAndUnvalidate: function(obj){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		var val = this.getFieldValue(field);
		if (val != ""){
			this.setSingleInputValue(field,"",",");
			this.unValidate(field);
		}
	},
	unValidate: function(obj){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		var rules = this.getFieldRules(field.id);
		if (rules != null && rules.valid == true)
			this.clearState(field,rules);
	},
	isRegExp: function(a){
		return(typeof(a)==='function')?a.constructor.toString().match(/regexp/i)!==null:false;
	},
	hideOrShowFieldWhenMasked: function(obj,hide,mask){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		var rules = this.getFieldRules(field.id);
		if (rules != null && rules.hideId != undefined && this.config.hiddenClass != undefined){
			if (mask != null){
				rules.mask = mask;
				YAHOO.util.Dom.removeClass(rules.hideId, this.config.hiddenClass);
				rules.hidden = false;
			}else if (hide){
				YAHOO.util.Dom.addClass(rules.hideId, this.config.hiddenClass);
				rules.hidden = true;
			}
		}
	},
	hideOrShowFields: function(objs,hide){
		if (YAHOO.sme.typeOf(objs)=="array")
			for(var o=0; o<objs.length; o++) 
				this.hideOrShowField(objs[o],hide);
	},
	hideOrShowField: function(obj,hide){
		if (typeof(obj)=="string"){
			var field = YAHOO.util.Dom.get(obj);
		}else var field = obj;
		var rules = this.getFieldRules(field.id);
		if (rules != null && rules.hideId != undefined && this.config.hiddenClass != undefined){
			if (hide){
				YAHOO.util.Dom.addClass(rules.hideId, this.config.hiddenClass);
				rules.hidden = true;
			}else{
				YAHOO.util.Dom.removeClass(rules.hideId, this.config.hiddenClass);
				rules.hidden = false;
			}
		}
	},
	setMask: function(obj,mask){		
		if (YAHOO.sme.typeOf(obj)=="array"){
			var rlist = obj; //alert(obj.length+"{array}, "+mask);
		}else if (typeof(obj)=="string"){			
			var rlist = [];
			rlist[0] = obj; //alert(obj+"{string}, "+mask);
		}else return false; //alert(obj+"{"+YAHOO.sme.typeOf(obj)+"}, "+mask);
		if (mask != null){
			for (var r=0; r < rlist.length; r++){
				rules = this.getFieldRules(rlist[r]);
				if (rules != null) rules.mask = mask;
			}
			return true;
		}else return false;
	},
	revertMask: function(obj){
		if (YAHOO.sme.typeOf(obj)=="array"){
			var rlist = obj;
		}else if (typeof(obj)=="string"){			
			var rlist = [];
			rlist[0] = obj;
		}else return false;
		for (var r=0; r < rlist.length; r++){
			rules = this.getFieldRules(rlist[r]);
			if (rules != null && rules.mask != null && rules.defmask != null) rules.mask = rules.defmask;
		}
		return true;
	},
	isSubmitable: function(){
		for (var f=0; f < this.fields.length; f++)
			if (this.fields[f].validate && !this.fields[f].valid && !this.fields[f].hidden) return false;
		return true;
	},
	submit: function(){
		if (this.submitable){
			if (this.config.submitajax){
				var c = 0;
				var send = [];
				var keys, tvals, vals, key, val, i, d;
				var s = "";
				var sends = "";
				for (var f=0; f < this.fields.length; f++){
					if (!this.fields[f].hidden && (!this.fields[f].validate || (this.fields[f].validate && this.fields[f].valid))){
						keys = (this.fields[f].fieldReal).split('|');
						val = this.getFieldValue(this.fields[f].fieldFaux);
						if (val != null){
							vals = new Array(keys.length);
							tvals = val.split('|');
							d = keys.length - tvals.length;
							for(var k=keys.length-1; k >= 0; k--)
								vals[k] = ((k >= d)? tvals[k-d]:"");
							for (var k=0; k < keys.length; k++){
								//s += f + ", " + k + ": " + keys[k] + "=" + vals[k] + " (" + this.fields[f].fieldReal + "<=" + this.fields[f].fieldFaux + ")\r\n";
								key = keys[k];
								val = ((this.fields[f].prefix != undefined)? this.fields[f].prefix:"") + vals[k] + ((this.fields[f].suffix != undefined)? this.fields[f].suffix:"");
								i = this.getIndexOf(key,send);
								if (i == null){
									send[c] = {key:key,val:val};
									c++;
								}else send[i].val += val;
								//s += i + "," + c + ": " + key + "=" + val + " (" + this.fields[f].fieldFaux + ")\r\n";
							}
						}
					}
				}
				//alert(s);
				for (var f=0; f < send.length; f++)
					sends += (f? "&":"") + send[f].key + "=" + escape(send[f].val.replace('+','%2B'));
				//alert(sends);
				var callback = { 
					success: function(o) { 
						//alert(o.responseText);
						var el = o.argument[0];
						if (el.config.onSuccess != undefined) el.config.onSuccess(el,o.responseText);
					},
					failure: function(o) {
						//alert("didn't work");
						var el = o.argument[0];
						if (el.config.onFailure != undefined) el.config.onFailure(el,'<h5>Submission Failed: Please <A href="javascript:window.location.reload(false);">refresh</A> the page and try again</h5>');
					},
					argument: [this]
				};
				if (this.config.onSubmit != undefined) this.config.onSubmit(this);
				var transaction = YAHOO.util.Connect.asyncRequest('POST', this.config.submitto, callback,  sends);
			}else{
				var frm = YAHOO.util.Dom.get(this.config.frmName);
				frm.action = this.config.submitto;
				frm.submit()
			}
		}else alert(YAHOO.sme.langvars.please_fill_all_required);
	},
	getIndexOf: function(key,array){
		for (var i=0; i < array.length; i++) 
			if (array[i].key != undefined && array[i].key == key) return i;
		return null;
	},
	handleResponse: function(){
		
	}
}
YAHOO.sme.suggestAndSearch = function (searchbox,searchpane,size,config) {
	this.searchbox = YAHOO.util.Dom.get(searchbox);
	this.searchpane = YAHOO.util.Dom.get(searchpane);
	this.size = size;
	this.searchpaneRight = null;
	this.searchpaneRightC = null;
	this.searchpaneLeft = null;
	this.searchpaneLeftC = null;
	this.searchpaneLeftE = null;
	this.searchpaneTitle = null;
	this.searchpaneTitleLink = null;
	this.searchpaneCloseLink = null;
	if (this.searchbox != null){ 
		this.searchcontainer = YAHOO.util.Dom.getAncestorByTagName(searchbox,'div');
		this.searchform = this.searchbox.form;
	}
	if (this.searchpane != null){
		var spc = YAHOO.util.Dom.getChildren(this.searchpane);
		var spl = null;
		var spr = null;
		if (spc.length > 0){
			if (spc.length > 2){
				spr = YAHOO.util.Dom.getChildren(spc[2]);
				this.searchpaneRight = spc[2]; 
				spl = YAHOO.util.Dom.getChildren(spc[1]);
				this.searchpaneLeft = spc[1]; 
				spz = YAHOO.util.Dom.getChildren(spc[0]);
				if (spz.length > 0 && spz[0].tagName == "A") this.searchpaneCloseLink = spz[0];
			}else if (spc.length > 1){
				spr = YAHOO.util.Dom.getChildren(spc[1]);
				this.searchpaneRight = spc[1]; 
				spl = YAHOO.util.Dom.getChildren(spc[0]);
				this.searchpaneLeft = spc[0]; 
			}else{ 
				spl = YAHOO.util.Dom.getChildren(spc[0]);
				this.searchpaneLeft = spc[0];
			}
			this.searchpaneRightC = this.searchpaneRight;
			this.searchpaneLeftC = this.searchpaneLeft;
			if (spl != null && spl.length > 1){ 
				if (spl.length > 2) this.searchpaneLeftE = spl[2];
				this.searchpaneLeftC = spl[1];
				this.searchpaneTitle = spl[0];
				splc = YAHOO.util.Dom.getChildren(spl[0]);
				if (splc != null && splc.length > 0){ this.searchpaneTitleLink = splc[0]; }
			}
			if (spr != null && spr.length > 1) this.searchpaneRightC = spr[1];
		}else{ 
			this.searchpaneLeft = this.searchpane; 
			this.searchpaneLeftC = this.searchpaneLeft;
		}
	}
	this.config = config;
	if (this.config.autoInit == undefined) this.config.autoInit = false;
	if (this.config.focusClass == undefined) this.config.focusClass = 'focused';
	if (this.config.hiddenClass == undefined) this.config.hiddenClass = 'hidden';
	if (this.config.perc33Class == undefined) this.config.perc33Class = 'perc33';
	if (this.config.perc66Class == undefined) this.config.perc66Class = 'perc66';
	if (this.config.wait == undefined) this.config.wait = 1000;
	if (this.config.minlength == undefined) this.config.minlength = 2;
	if (this.config.rssize == undefined) this.config.rssize = GSearch.SMALL_RESULTSET;
	if (this.config.linktarget == undefined) this.config.linktarget = GSearch.LINK_TARGET_SELF;	
	//if (this.config.completecallback != undefined) .setSearchCompleteCallback(object, method);
	this.gsearch = null;
	this.keywords = "";
	this.waitinterval = null;
	this.initialized = false;
	this.numResults = 0;
	if (this.config.autoInit) return this.init();
	return null;
}
YAHOO.sme.suggestAndSearch.prototype = {
	init: function(){
		if (!this.initialized){
			if (GSearchControl != undefined && this.searchpaneLeftC != null){
				try{
					this.gsearch = new GSearchControl();
					this.gsearch.setResultSetSize(this.config.rssize);
					this.gsearch.setLinkTarget(this.config.linktarget);
					this.gsearch.setSearchCompleteCallback(this, this.searchComplete);
		
					var siteSearch = new GwebSearch();
					siteSearch.setUserDefinedClassSuffix("siteSearch");
					siteSearch.setSiteRestriction(YAHOO.sme.langvars._url);
					
					this.gsearch.addSearcher(siteSearch);
		
					var drawOptions = new GdrawOptions();
					drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);
					
					this.gsearch.draw(this.searchpaneLeftC, drawOptions);
				}catch(x){
					return false;
				}
			}else return false;
			if (this.searchbox != null){
				if (this.searchpane != null){
					var self = this;
					// Se agrega para eliminar las posibles SQL explosions
					// var badwords = "INSERT|insert|update|UPDATE|SELECT|select|DELETE|delete|submit|SUBMIT|alert|ALERT|script|/|SCRIPT");
					
					YAHOO.util.Dom.removeClass(this.searchcontainer,this.config.focusClass);
					YAHOO.util.Event.addListener(this.searchbox, 'focus', function(){ self.focused(); });
					YAHOO.util.Event.addListener(this.searchbox, 'blur', function(){ self.blurred(); });
					YAHOO.util.Event.addListener(this.searchbox, 'keyup', function(){ self.typed(); });
					if(this.searchpaneTitleLink != null) YAHOO.util.Event.addListener(this.searchpaneTitleLink, 'click', function(){ self.goSearch(null,true); });
					if(this.searchpaneCloseLink != null) YAHOO.util.Event.addListener(this.searchpaneCloseLink, 'click', function(){ self.hidePane(); });
					
					if (this.searchbox.value != "" && this.searchbox.value != YAHOO.sme.langvars.search_desc){
						// aquiros						
						// valorabuscar = this.searchbox.value.replace(badwords,'');
						valorabuscar = this.searchbox.value;
						this.execsearch(valorabuscar);
					}else{ 
						this.searchbox.value = YAHOO.sme.langvars.search_desc;
						// alert(self.searchbox.id);
						this.searchbox.blur();
					}
				}else return false;
			}else return false;
			this.initialized = true;
			return true;
		}
	},
	focused: function(){
		if (this.searchbox.value == YAHOO.sme.langvars.search_desc) this.searchbox.value = ""; 
		YAHOO.util.Dom.addClass(this.searchcontainer,this.config.focusClass);
	},
	blurred: function(){
		if (YAHOO.lang.trim(this.searchbox.value) == "") this.searchbox.value = YAHOO.sme.langvars.search_desc; 
		YAHOO.util.Dom.removeClass(this.searchcontainer,this.config.focusClass); 
	},
	typed: function(){
		val = YAHOO.lang.trim(this.searchbox.value);
		if (val.length > this.config.minlength){
			if (this.config.wait > 0){
				var self = this;
				if (this.waitinterval != null) clearTimeout(this.waitinterval);
				this.waitinterval = setTimeout(function(){ self.execsearch(val); }, this.config.wait);
			}else this.execsearch(val);
		}else this.hidePane();
	},
	execsearch: function(keywords){

		//aquiros
		var badwords = eval("/INSERT|insert|update|UPDATE|SELECT|select|DELETE|delete/ig");
		var val = YAHOO.lang.trim(this.searchbox.value.replace(badwords,''));
        
		if (val != keywords) this.gsearch.execute(val);
		if (keywords.length > this.config.minlength){
			if (this.gsearch != null){
				this.keywords = keywords;
				this.gsearch.execute(keywords);
				this.waitinterval = null;
			}
		}else this.hidePane();
	},
	searchComplete: function(searchControl, searcher){
		if (this.searchpaneRight != null){
			var self = this;	
			self.hideSuggestionPane();
			this.numResults = 0;
			stats = YAHOO.util.Dom.getElementsByClassName('gsc-stats', 'div', this.searchpaneLeftC, function(el){ self.numResults = parseInt(el.innerHTML.replace("(","").replace(")","")); } );
			if (!isNaN(this.numResults) && this.numResults > 0){
				if (this.searchpaneTitle != null)  YAHOO.util.Dom.removeClass(this.searchpaneTitle.id,this.config.hiddenClass);
				YAHOO.util.Dom.removeClass(this.searchpaneLeftC,this.config.hiddenClass);
				YAHOO.util.Dom.addClass(this.searchpaneLeftE,this.config.hiddenClass);
				self.showPane(false);
				if (this.searchpaneRight != null && this.config.suggestURI != undefined) this.execsuggest();
			}else if (this.searchpaneLeftE != null){
				if (this.searchpaneTitle != null)  YAHOO.util.Dom.addClass(this.searchpaneTitle.id,this.config.hiddenClass); 
				this.searchpaneLeftE.innerHTML = YAHOO.sme.langvars.search_nonefound.replace("%1",this.keywords);
				YAHOO.util.Dom.addClass(this.searchpaneLeftC,this.config.hiddenClass);
				YAHOO.util.Dom.removeClass(this.searchpaneLeftE,this.config.hiddenClass);
				self.showPane(true);
			}else self.hidePane();
		}
	},
	execsuggest: function(){
		var uri = this.config.suggestURI+escape(this.keywords);
		var maxResults = this.numResults*2;
		var self = this;
		var callback = { 
			success: function(o) {
				try { 
					var root = o.responseXML.documentElement;
				}catch (x){ 
					return;
				} 
				var list = new Array();
				for(var l=0; l < root.childNodes.length; l++){
					var node = root.childNodes[l];
					if (node.tagName == "CompleteSuggestion" && node.childNodes.length > 0 && node.childNodes[0].tagName == "suggestion" && node.childNodes[0].attributes.length > 0){
						keyword = node.childNodes[0].attributes[0].nodeValue;
						if (keyword.toUpperCase() != self.keywords.toUpperCase() && keyword.indexOf('.') == -1)
							list.push(keyword);
					}
					if (list.length == maxResults) break;
				}
				self.fillSuggest(list);
			},
			failure: function(o) {
				return;
			},
			argument: []
		}
		var transaction = YAHOO.util.Connect.asyncRequest('GET', uri, callback, null); 
	},
	fillSuggest: function(list){
		if (this.searchpaneRight != null && list.length > 0){
			var self = this;
			this.searchpaneRightC.innerHTML = "";
			for(var l=0; l < list.length; l++){
				a = document.createElement('a');
				id = YAHOO.util.Dom.generateId(a,'suglink_');
				a.setAttribute('href','#');
				a.innerHTML = list[l];
				var i = list[l];
				this.searchpaneRightC.appendChild(a);
				YAHOO.util.Event.addListener(id,'click', self.goSuggestionEv, self);
				YAHOO.util.Event.addListener(id,'focus', function(){ self.focused(); });
				YAHOO.util.Event.addListener(id,'mouseover', function(){ self.focused(); });
				//YAHOO.util.Event.addListener(id,'mouseout', function(){ self.blurred(); });
			}
			this.showSuggestionPane();
		}else this.hideSuggestionPane();
	},
	goSuggestionEv: function(e,el){
		var self = el;
		if (e.target == undefined){
			var obj = this;
		}else var obj = e.target;
		if (self != undefined && self != null && obj != undefined && obj != null){
			var keyword = obj.innerHTML;
			if (keyword != undefined && keyword != null && keyword != ""){
				self.goSearch(keyword,false);
			}
		}
	},
	goSearchEv: function(e,el){
		var self = el;
		if (e.target == undefined){
			var obj = this;
		}else var obj = e.target;
		if (self != undefined && self != null && obj != undefined && obj != null){
			var keyword = obj.innerHTML;
			if (keyword != undefined && keyword != null && keyword != ""){
				self.goSearch(keyword,true);
			}
		}
	},
	goSearch: function(keyword,gosubmit){
		this.focused();
		if (keyword != null && keyword != undefined)
			this.searchbox.value = keyword;
		if (gosubmit && this.searchform != null){ 
			document.location = this.searchform.action + "?" + this.searchbox.name + "=" + escape(this.searchbox.value);
		}else this.execsearch(keyword);
	},
	showPane: function(error){
		if (this.config.activateId != undefined && this.config.activateClass != undefined)
			YAHOO.util.Dom.addClass(this.config.activateId,this.config.activateClass);
		if (YAHOO.env.ua.ie != 0 && YAHOO.env.ua.ie < 7){
			if (error && this.config.errorHeight != undefined)
				YAHOO.util.Dom.setStyle(this.searchpane,'height',this.config.errorHeight+"px");
			if (!error && this.config.paneHeight != undefined)
				YAHOO.util.Dom.setStyle(this.searchpane,'height',this.config.paneHeight+"px");
		}
		YAHOO.util.Dom.removeClass(this.searchpane,this.config.hiddenClass);		
	},
	hidePane: function(){
		if (this.config.activateId != undefined && this.config.activateClass != undefined)
			YAHOO.util.Dom.removeClass(this.config.activateId,this.config.activateClass);
		if (this.config.paneHeight != undefined && YAHOO.env.ua.ie != 0 && YAHOO.env.ua.ie < 7)
			YAHOO.util.Dom.setStyle(this.searchpane,'height',"0px");
		YAHOO.util.Dom.addClass(this.searchpane,this.config.hiddenClass);
	},
	showSuggestionPane: function(){
		YAHOO.util.Dom.addClass(this.searchpaneLeft,this.config.perc66Class);
		if (this.searchpaneRight != null){
			YAHOO.util.Dom.removeClass(this.searchpaneRight,this.config.hiddenClass);
			YAHOO.util.Dom.addClass(this.searchpaneRight,this.config.perc33Class);
		}
	},
	hideSuggestionPane: function(){
		if (this.searchpaneRight != null){
			YAHOO.util.Dom.addClass(this.searchpaneRight,this.config.hiddenClass);
			YAHOO.util.Dom.removeClass(this.searchpaneRight,this.config.perc33Class);
		}
		YAHOO.util.Dom.removeClass(this.searchpaneLeft,this.config.perc66Class);
	}
}

