// Namespace emulation
var CrispStudio = new Object();
CrispStudio.Patents = new Object();

/*
        Utils singleton
*/
CrispStudio.JsUtils = new function()
{
	this.$ = function(id)
	{
    	if (document.getElementById != null)
		{
			return document.getElementById(id);
			}
			if (document.all != null)
			{
				return document.all[id];
			}
        }


	this.GetElementsByClassName = function(searchClass,node,tag)
	{
	        var classElements = new Array();

	        if (node == null)
		{
			node = document;
		}

	        if (tag == null)
		{
			tag = '*';
		}

		var els = node.getElementsByTagName(tag);
	        var elsLen = els.length;
        	var pattern = new RegExp("(^|\\s)" + searchClass+ "(\\s|$)");
	        for (var i = 0, j = 0; i < elsLen; i++)
		{
			if (pattern.test(els[i].className))
			{
				classElements[j] = els[i];
				j++;
			}
        	}
	        return classElements;
	}


	this.AddLoadEvent = function(func)
	{
        var oldonload = window.onload;
		if (typeof window.onload != 'function')
		{
			window.onload = func;
        }
        else
		{
			window.onload = function()
			{
				oldonload();
                func();
			}
		}
	}

	this.GetEventSrc = function(e)
	{
		if (!e)
		{
			e = window.event;
		}

		if (e.originalTarget)
		{
			return e.originalTarget;
		}

		else
		{
			if (e.srcElement)
			{
	    	return e.srcElement;
			}
		}
	}

	this.AddEvent = function(objObject, strEventName, fnHandler)
	{
		if (objObject.addEventListener)
		{
			objObject.addEventListener(strEventName, fnHandler, false);
		}
	    else
		{
			if (objObject.attachEvent)
			{
				objObject.attachEvent("on" + strEventName, fnHandler);
			}
		}
	}

	this.RemoveEvent = function(obj, evType, fn, useCapture)
	{
		if (obj.removeEventListener)
		{
		    obj.removeEventListener(evType, fn, useCapture);
		    return true;
		}
		else
		{
			if (obj.detachEvent)
			{
				var r = obj.detachEvent("on"+evType, fn);
				return r;
			}
			else
			{
		    	alert("Handler could not be removed");
			}
		}
	}

	this.Toggle = function(obj)
	{
		if (obj.style.display != 'none')
		{
			obj.style.display = 'none';
		}
		else
		{
			obj.style.display = 'block';
		}
	}

	this.AddFormSubmitEvent = function(objObject, fnHandler)
	{
		objObject.onsubmit = fnHandler;
	}

	this.GetElementsByClassName = function(searchClass,node,tag)
	{
        var classElements = new Array();
        if (node == null)
		{
			node = document;
		}
        if (tag == null)
		{
               tag = '*';
		}
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)" + searchClass+ "(\\s|$)");
        for (var i = 0, j = 0; i < elsLen; i++)
		{
			if (pattern.test(els[i].className))
			{
				classElements[j] = els[i];
				j++;
			}
        }
        return classElements;
	}

	this.CrispRegexTest = function(regexText, testString)
	{
		var regex = new RegExp(regexText);
		return regex.test(testString);
	}


	this.LeftTrim = function(value)
	{
			var re = /\s*((\S+\s*)*)/;
			return value.replace(re, "$1");
	}

	this.RightTrim = function(value)
	{
		var re = /((\s*\S+)*)\s*/;
		return value.replace(re, "$1");
	}

	this.Trim = function (value)
	{
		return this.LeftTrim(this.RightTrim(value));
	}
}


/*
	Cookies handling singleton
*/
CrispStudio.CookiesUtils = new function()
{

	this.CreateCookie = function(name, value, days) 
	{
		if (days) 
		{
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = "; expires=" + date.toGMTString();
		}
		else 
		{
			var expires = "";
		}
		document.cookie = name+ "= " + value + expires + "; path=/";
	}

	this.ReadCookie = function(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for (var i=0; i < ca.length; i++) 
		{
			var c = ca[i];
			while (c.charAt(0)==' ') 
			{
				c = c.substring(1,c.length);
			}
		
			if (c.indexOf(nameEQ) == 0) 
			{
				return c.substring(nameEQ.length,c.length);
			}
		}
		
		return null;
	}

}


/*
	Search form validation class
*/
CrispStudio.Patents.SearchForm = function(options)
{
	this.formElement =  CrispStudio.JsUtils.$(options.form);
	this.searchElement = CrispStudio.JsUtils.$(options.text);
	this.initialize();
}

CrispStudio.Patents.SearchForm.prototype =
{
	initialize : function()
	{
		if (this.formElement != undefined)
		{
			CrispStudio.JsUtils.AddFormSubmitEvent(this.formElement, this.validateForm); //trick
			this.formElement.modelObj = this;
		}
	},

	validateForm : function(e)
	{
		var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);
		var modelObj = selectedElement.modelObj;

		if (CrispStudio.JsUtils.Trim(modelObj.searchElement.value) == '' ||
			modelObj.searchElement.value == modelObj.searchElement._labelText)		
		{
			return false;
		}
		else
		{
			return true;
		}

	}
}

/*
	Dynamic labels class
*/      
CrispStudio.Patents.DynamicLabels = function(options)
{
	this.labelClassName = options.labelClass;
	this.initialize();
}


CrispStudio.Patents.DynamicLabels.prototype =
{
	initialize : function()
	{
		var objLabels = document.getElementsByTagName("LABEL");
		var objField;

		//labels
		for (var i = 0; i < objLabels.length; i++) 
			{
				if (this.labelClassName == objLabels[i].className) 
					{
						objField = CrispStudio.JsUtils.$(objLabels[i].htmlFor);
						CrispStudio.JsUtils.AddEvent(objField, 'focus', this.focusDynamicLabels);				
						CrispStudio.JsUtils.AddEvent(objField, 'blur', this.blurDynamicLabels);				
						objField.modelObj = this;
						objField._labelText = objLabels[i].firstChild.nodeValue;
						objField.value = objField._labelText;
			        }
			}	
	},

	focusDynamicLabels : function(e)
	{
		var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);
		if (selectedElement._labelText == selectedElement.value) 
		{
			selectedElement.value = '';
		}
	},

	blurDynamicLabels : function(e)
	{
		var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);		
		if ('' == selectedElement.value) 
		{
			selectedElement.value = selectedElement._labelText;
		}
	}
}

/*
	Switcher
*/
CrispStudio.Patents.Switcher = function(options)
{
	this.switcherElement = CrispStudio.JsUtils.$(options.switcher);

	if (this.switcherElement != undefined)
	{
		this.activeClassName = options.switcher_active_class;
		this.panelElement = CrispStudio.JsUtils.$(options.panel);
		this.defaultText = this.switcherElement.innerHTML;
		this.alternativeText = options.alternativeText;
		this.cookieName = options.cookie_name;
		this.cookieDays = options.cookie_days;
		this.initialize();
	}
}

CrispStudio.Patents.Switcher.prototype =
{
	initialize : function()
	{
			if (CrispStudio.CookiesUtils.ReadCookie(this.cookieName) == '0')
			{
				this.doSwitch(this);								
			}

			CrispStudio.JsUtils.AddEvent(this.switcherElement, 'click', this.switchPanel);
			this.switcherElement.modelObj = this;
	},

	switchPanel : function(e)
	{
		var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);
		var modelObj = selectedElement.modelObj;
		modelObj.doSwitch(modelObj);
	},

	doSwitch : function(modelObj)
	{
		CrispStudio.JsUtils.Toggle(modelObj.panelElement);
 
		if (modelObj.switcherElement.innerHTML == modelObj.defaultText)
		{
			CrispStudio.CookiesUtils.CreateCookie(modelObj.cookieName, '0', modelObj.cookieDays);
			modelObj.switcherElement.innerHTML = modelObj.alternativeText;
			modelObj.switcherElement.className = modelObj.activeClassName;
		}
		else
		{
			CrispStudio.CookiesUtils.CreateCookie(modelObj.cookieName, '1', modelObj.cookieDays);
			modelObj.switcherElement.innerHTML = modelObj.defaultText;
			modelObj.switcherElement.className = '';
		}
	}
}

/*
	Document print button
*/
CrispStudio.Patents.DocumentPrint = function(options)
{
	this.clickElement = CrispStudio.JsUtils.$(options.elementId);
	if (this.clickElement)
	{
		this.initialize();	
	}	
}


CrispStudio.Patents.DocumentPrint.prototype =
{
	initialize : function()
	{
		CrispStudio.JsUtils.AddEvent(this.clickElement, 'click', this.documentPrint);	
	},
	
	documentPrint : function(e)
	{
		window.print();
	}

}

/*
        Order form validation
*/
CrispStudio.Patents.FeedbackForm = function(options)
{
	this.formElement =  CrispStudio.JsUtils.$(options.form);
	this.inputElements = options.fieldlist.bindings;
	this.initialize();
}

CrispStudio.Patents.FeedbackForm.prototype =
{
	initialize : function()
	{
		if (this.formElement != undefined)
		{
			CrispStudio.JsUtils.AddFormSubmitEvent(this.formElement, this.validateForm);
			this.formElement.modelObj = this;
		}
	},

	validateForm : function(e)
	{
		var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);
		var modelObj = selectedElement.modelObj;

		var errorList = "";

	    for (var key in modelObj.inputElements)
    	{
			var currentInputElement = CrispStudio.JsUtils.$(modelObj.inputElements[key].field);
			var currentInputRegex = modelObj.inputElements[key].regex;
			var currentInputErrorText = modelObj.inputElements[key].errorText;

			if (currentInputElement.value != undefined)
			{
				//check regex here
				if(!CrispStudio.JsUtils.CrispRegexTest(currentInputRegex, currentInputElement.value))
				{

					errorList += "\n- " + currentInputErrorText;
				}
			}

		}

		if (errorList == "")
		{
			return true;
		}
		else
		{
			alert("Please, check the following fields:" + errorList);
			return false;
		}
	}
}


/*
	Adding onLoad event with constructors
*/
CrispStudio.JsUtils.AddLoadEvent(function ()
	{
		//Dynamic Labels
		var dynamicLabelsOptions = {
			labelClass	: 'dynamicLabel'			
		};

		var currentDynamicForms = new CrispStudio.Patents.DynamicLabels(dynamicLabelsOptions);

		//Adding searchform handler
		var searchFormOptions = {
			form	: 'search_form',
			text	: 'search_phrase'
		};
		var currentSearchFormValidator = new CrispStudio.Patents.SearchForm(searchFormOptions);

		//Adding switcher handlers
		var switcherOptions = {
			switcher				: 'showhide_button',
			switcher_active_class	: 'closed',
			panel					: 'patent_info_table',		
			alternativeText			: 'Show panel',
			cookie_name				: 'patent_details_panel_open',
			cookie_days				: 7
		};
		var currentSwitcher = new CrispStudio.Patents.Switcher(switcherOptions);

		//print
		var documentPrintOptions = {
			elementId : "print_button"
		};
			
		var currentPrinter = new CrispStudio.Patents.DocumentPrint(documentPrintOptions);
				var anyText = "(.+)";

		var orderFormOptions = {
			form	: "feedback_form",
			fieldlist :
			{
				"bindings":
					[
						{"field": "feedback_name", "regex": anyText, "errorText": "Name"},
						{"field": "feedback_email", "regex": "[0-9a-z_]+@[0-9a-z_^.-]+\\.[a-z]{2,4}", "errorText": "E-mail"},
						{"field": "keystring", "regex": "[a-z0-9]", "errorText": "Key string"},
						{"field": "feedback_message", "regex": anyText, "errorText": "Message"}
					]
			}
		};
		var currentOrderFormValidator = new CrispStudio.Patents.FeedbackForm(orderFormOptions);

	})

