
var _initialized = false;
var deafultSearchFeildValue = 'Enter your search query';
var initList = ['addSearchFeildHandlers', 'fixTextFieldDisplayInOlderBrowsers'];

if (typeof document.addEventListener == 'function') {
	document.addEventListener("DOMContentLoaded", init, false);
} else {
	document.onreadystatechange = function () {
		if( (document.readyState == "complete" || document.readyState == "interactive") && !_initialized ) {
			_initialized = true;
			init();
		}
	};
}

function bind(el, evtName, handler){
	if (el.addEventListener){
		el.addEventListener(evtName, handler, false);
	} else if (el.attachEvent){
		el.attachEvent('on' + evtName, handler);
	}
}

function $(id){
	return document.getElementById(id);
}

function init(){
	var i, item;
	for (i=0; i<initList.length; i++){
		item = initList[i];
		if (typeof item == 'function'){
			item();
		} else if (typeof window[item] == 'function') {
			window[item]();
		}
	}
}

function addSearchFeildHandlers(){
	var searchField = $('searchField');
	if (searchField){
		bind(searchField, 'focus', searchFieldFocus);
		bind(searchField, 'blur', searchFieldBlur);
	}
}

function searchFieldFocus(event){
	var el = event.target || event.srcElement;
	if (el.value == deafultSearchFeildValue) el.value = '';
}

function searchFieldBlur(event){
	var el = event.target || event.srcElement;
	if (el.value == '') el.value = deafultSearchFeildValue;
}

function validateSearch(){
	var term = $('searchField').value;
	return (term != deafultSearchFeildValue && term != '' && term.length <= 1024);
}

function fixTextFieldDisplayInOlderBrowsers(){
	var b = Browser;
	if (  (b.Firefox && parseFloat(b.Firefox) < 3.5) ){
		var searchField = $('searchField');
		searchField.style.height = '24px';
		searchField.style.paddingTop = '10px';
	}
}

/**
 * Browser
 */
var Browser = new function(){
	// user agent
	this.ua = navigator.userAgent;

	// User Agent Contains : check if ua contains str
	this.uac = function(str){
		return this.ua.indexOf(str) != -1;
	};

	this._found = false;

	this.getVersion = function(browser){
		if (this._found) return false;
		var match = this.ua.match(new RegExp(browser + '.([0-9][0-9\\.]+)'));
		if (match != null){
			this._found = true;
			return match[1];
		}
		return false;
	};

	// Mainstream Browsers
	this.IE = this.getVersion('MSIE');
	this.Firefox = this.getVersion('Firefox');
	this.Chrome = this.getVersion('Chrome');
	this.Safari = this.Chrome ? false : this.uac('Safari') && this.getVersion('Version');
	this.MobileSafari = this.Safari && this.uac('Mobile');
	this.Opera = this.uac('Opera') && this.uac('Presto') ? this.getVersion('Version') || this.getVersion('Opera') : false;

	// Browser Engine
	//this.AppleWebKit = this.uac(' AppleWebKit/');
	this._found = false;
	this.AppleWebKit = this.getVersion('AppleWebKit');
	this.Gecko = this.getVersion('Gecko');
	this.Mozilla = !this.Gecko && !this.AppleWebKit && this.uac('Mozilla/');

	// OS
	this.Windows = this.uac('Windows ');
	this.Linux = !this.Windows && this.uac('Linux ');
	this.Mac = !this.Windows && !this.Linux && this.uac('Mac ');

	this.getOS = function(){
		return this.Windows ? 'Windows' : this.Linux ? 'Linux' : this.Mac ? 'Mac' : 'unknown';
	};

	// get browser name
	this.getName = function(){
		var names = ['IE', 'Firefox', 'Chrome', 'Safari', 'MobileSafari', 'Opera', 'Gecko', 'AppleWebKit', 'Mozilla'];
		var engineIndex = 6;	// denotes where in the 'names' array starts the list of engines
		for (var i=0, leni = names.length; i < leni; i++){
			if (this[names[i]]) return i >= engineIndex ? names[i] + ' (Engine)' : names[i];
		}
		return 'unknown';
	};

	/* deliberately overriding the previous getVersion method.
	   return value as  string or float */
	this.getVersion = function(asFloat){
		var ver = this.IE || this.Firefox || this.Chrome || this.Safari || this.MobileSafari || this.Opera || 'unknown';
		return asFloat ? parseFloat(ver) || -1 : ver;
	};

	this.toString = function(){
		return [this.getName(), this.getVersion(), this.getOS()].join(' ');
	};
};

