// Copyright 2008 Soft-Format LLC
//-----------------------------------------------------------------------------
// Filename : textField.js
//-----------------------------------------------------------------------------
// Author : V. Buryak
// Date of creation : 02.09.2008
//-----------------------------------------------------------------------------
//  Description
//  TextField which set default text and maximum characters on client side.
//-----------------------------------------------------------------------------
RegisterNamespace("TextFieldNmSp");

//  TextField Class.
TextField = function(instance){
	this._instance = instance;
	
	this._defText = null;
	this._maxChars = null;
	this._watchElem = null;
	this._watchText = null;
	
	return this;
}

TextField.prototype = {
	onFocusDefaultValue : function(evt){
		//var evt = (evt) ? evt : (window.event) ? window.event : "";
		var target = (evt.target) ? evt.target : evt.srcElement;

		if(target == null || this._defText == null)
			return;			

		if(target.value == this._defText)
			target.value = "";
		target.style.color = "#000000";
	},
	onBlurDefaultValue : function (evt){
		//var evt = (evt) ? evt : (window.event) ? window.event : "";
		var target = (evt.target) ? evt.target : evt.srcElement;

		this.setDefaultValue(target);
	},
	onKeyUpMaximimSymbols : function(evt){
		//var evt = (evt) ? evt : (window.event) ? window.event : "";
		var target = (evt.target) ? evt.target : evt.srcElement;
		
		this.setMaximimSymbols(target);		
	},	
	setDefaultValue : function(sender){
		if(sender == null || this._defText == null)
			return;			
		
		if(sender.value == "")
		{
			sender.value = this._defText;
			sender.style.color = '#999999';
		}
		else
		{
			if(sender.value == this._defText)
				sender.style.color = '#999999';
			else
				sender.style.color = '#000000';
		}
	},
	setMaximimSymbols : function(sender){
		if(sender == null || this._maxChars == null)
			return;
			
		//	Maximum characters.
		if(this._maxChars < sender.value.length){
			if(this._defText != null && sender.value == this._defText)
				return;			
			 sender.value =  sender.value.substring(0, this._maxChars);
		}

		//	Watched element.
		if(this._watchElem != null){
		    var usedChars = (sender.value == this._defText ? 0 : sender.value.length);
			this._watchElem.innerHTML = (this._watchText == null ? "" : this._watchText) + (this._maxChars - usedChars);
		}			
	}
}

//  TextField Namespace.
TextFieldNmSp = {
	init : function(){
		var aInputs = document.body.getElementsByTagName("input");
		var aTextareas = document.body.getElementsByTagName("textarea");
		var aAll = [];
		aAll.push(aInputs);
		aAll.push(aTextareas);

		var arr = null;
		var input = null;
		var handler = null;
		var textField = null;
		
		for(var iArr = 0; iArr < aAll.length; ++iArr){
			arr = aAll[iArr];
			if(arr == null)
				continue;
				
			for(var iElem = 0; iElem < arr.length; ++iElem){
				input = arr[iElem];
				if(input == null || typeof(input.getAttribute) == "undefined")
					continue;
				
				textField = new TextField(input);
				
				//	Default attribute.
				textField._defText = input.getAttribute("def");
				if(textField._defText != null){
					//	onFocusDefaultValue.
					handler = TextFieldNmSp.createDelegate(textField, textField.onFocusDefaultValue);
					TextFieldNmSp.attach(input, "focus", handler);					
					
					//	onBlurDefaultValue.
					handler = TextFieldNmSp.createDelegate(textField, textField.onBlurDefaultValue);					
					TextFieldNmSp.attach(input, "blur", handler);
					
					//	setDefaultValue.
					textField.setDefaultValue(input);
				}
				
				//	Maximum attribute.
				textField._maxChars = input.getAttribute("max");
				if(textField._maxChars != null){
					//	Watch attribute as additional.
					var watchElem = input.getAttribute("watchElem");
					if(watchElem != null){
						textField._watchElem = document.getElementById(watchElem);
						textField._watchText = input.getAttribute("watchText");
					}					
					
					//	setMaximimSymbols
					handler = TextFieldNmSp.createDelegate(textField, textField.onKeyUpMaximimSymbols);					
					TextFieldNmSp.attach(input, "keyup", handler);
					
					//	setMaximimSymbols.
					textField.setMaximimSymbols(input);					
				}
			}
		}
	},
	attach : function (sender, act, handler){
		if(sender != null && handler != null){
			//  Mozilla.
			if (sender.addEventListener)
				sender.addEventListener(act, handler, false);
			else if (sender.attachEvent)
				sender.attachEvent(["on",act].join(''), handler);
			else
				sender[['on',act].join('')] = handler;
		}
	},
	createDelegate : function(instance, method) {
		return function() {
			return method.apply(instance, arguments);
		}
	}
}