/**
 * ws_dataform jscripts
 * @author      Ben ter Stal <mail@warmstal.nl>
 * @copyright   Copyright 2011  WarmStal D!sign <www.warmstal.nl>. All Rights Reserved.
 * @version     $Revision: 2631 $ | $Date: 2011-09-19 12:41:41 +0200 (ma, 19 sep 2011) $
 *
 * $URL: http://design.warmstal.nl:8080/svn/warmstal/WarmStal%20Degree%20Framework/trunk/celsius_2.5/jscript/ws_dataform.class-1.2.8.js $
 */



/**
 * Change source for an related image
 */
function change_source(evt)
{
	var el 			= _evt_element(evt);
	var target_el 	= document.images[el.getAttribute('related')];
	var source		= el.value;
	var base		= target_el.getAttribute('base');
	target_el.src 	= base + source;
};

/**
 * toggle visiblity
 */
function showHide(element_id) {
       var element = document.getElementById(element_id);

       if (element.style.visibility == 'hidden' || element.style.visibility == '') {
              element.style.visibility= 'visible';
       } else {
              element.style.visibility = 'hidden';
       }
	return true;
};

/**
 * show element
 */
function show(element_id) {
       var element = document.getElementById(element_id);
       element.style.visibility= 'visible';
       return true;
};

/**
 * hide element
 */
function hide(element_id) {
	var element = document.getElementById(element_id);
	element.style.visibility = 'hidden';

       	return true;
};
/**
 * Change an Url querystring
 * Key/Value pair is added or replaced. Empty values are deleted
 * Hashes are attached.
 * @param url
 * @param name
 * @param value
 * @return modified Url
 */
function addQuerystringArgument(url, name, value){

	//Get hash and strip
	var arrUrl = url.split(/#/); 
	url = arrUrl[0];
	var hash = arrUrl[1];
	
	var qsaSearch = new RegExp(name+'=[^&]*','gi');
	//Replace argument values
	if(url.match(qsaSearch)){
		url = value=='' ? url.replace(qsaSearch, '') : url.replace(qsaSearch, name + '=' + value);
	} else if(value!='') {
		var qa = url.indexOf('?')==-1 ? '?' : '&';
		url =  url + qa + name + '=' + value;
	}
	
	//Append hash
	if(hash)
		url = url + '#' + hash;
	
	return url;
}

/**
 *===================jquery.dataform.js =============================
 * Jquery plugins
 *===================================================================
 */

/**
 * Show or hide an element depending on a value from another jQ element
 * @param jQ controler element
 * @param Map	Options Key/value pairs:
 * 		 effect (string) = show or hide animation effect : slide|fade,
 *		 onvalue (bool)  = show when met (true) else when not met (false)
 *	     test (string)   = value to test.
 */
jQuery.fn.valueToggle = function(jQ, options)
{
	var settings = jQuery.extend({effect: 'show', onvalue: true, test: null}, options);

	var el 		= jQ[0];
	var type	= el.type ;
	var tag 	= el.tagName.toLowerCase();
	var show	= false; /*status*/
	var hidden	= this[0].style.display == 'none' ;

	if(type=='checkbox'){
		show = el.checked;
	} else if (type =='radio' && !el.checked ) {
		show = false;
	} else if (type == 'text' || type == 'password' || tag == 'textarea' || tag=='select' || type =='radio') {
		if(settings.test){
			show =  el.value == settings.test;
		} else {
			show =  ! (el.value == '' || el.value == '0');
		}
	}

	/* reverse behavior */
	if(settings.onvalue==false)
		show = ! show;

	if(show && hidden ) {
		if(settings.effect=='slide'){
			this.slideDown();
		} else if(settings.effect =='fade' ) {
			this.fadeIn();
		} else {
			this.show();
		}
	} else if (! show && ! hidden){
		if(settings.effect=='slide'){
			this.slideUp();
		} else if(settings.effect =='fade' ) {
			this.fadeOut();
		} else {
			this.hide();
		}
	}
	return this;
};

/**
 * Attach valueSlideToggle behavior to an element,
 * slide show or hide sliding another jQ element depending on this value
 * @param target target element
 * @param Map	Options Key/value pairs: see valueToggle()
 */
jQuery.fn.attachValueToggle = function(target, options)
{
	//var target = this;
	target.valueToggle(this, {effect:"show", onvalue:options.onvalue} );
	$(this).bind('click', function(event){
		target.valueToggle($(this), {effect:options.effect, onvalue:options.onvalue, test:options.test} );
	});
	return $(this);
};

/**
 * Adding onfocus, onblur and capsdetect handlers to input fields
 * Sets focus to first input field
 * To the focused input the class="focus" is added
 */
jQuery.fn.attachFocusHandlers = function()
{
	var first = true;
	$("input.disableAutoComplete").attr("autocomplete", "off");
	$("input:visible", this).each( function() {
	 	if(this.readOnly || this.disabled || this.type == "image" || this.type == "reset" || this.type == "submit")
		return true;

		$(this).focus( 	function() 	{ $(this).addClass("focus"); });
		$(this).blur(	function()	{ $(this).removeClass("focus"); });
		if(this.type == 'password')	{ $(this).capsDetect(); };

		if(first) {
			$(this).setFocus();
			first = false;
   		};
	});
};

jQuery.fn.setFocus = function(){
	if(this.readOnly || this.disabled || this.type == "image" || this.type == "reset" || this.type == "submit")
		return;
	try {this.focus(); } catch (ex) {};
};

/**
 * formSubmit
 * add submit handler to an element click event, to submit forms with a specific action.
 * updates Post field 'ws_action' to transfer the action.
 * @param object options: action:string, formname:string
 */
jQuery.fn.attachFormSubmit = function(options)
{
	var settings = jQuery.extend({action:"_none", formname: false, event:'click', callback:''}, options);

	/**Wich form?*/
	if(settings.formname){
		myform = $("form#"+settings.formname);
	} else {
		var myform = this.parents("form");
	}

	$(this).bind(settings.event, function (event) {
		$("input[name=ws_action]", myform).val(settings.action);
		event.preventDefault();
		var callbackFunction = settings.callback;
		if(!callbackFunction || callbackFunction(myform) !== false) {

			//To make Autocompletion work in IE with a script submit
			//window external exists in IE and FF, Bug in IE when use typeof gives unknown (and not undefined)
			if(window.external && typeof (window.external.AutoCompleteSaveForm)==='unknown')
				window.external.AutoCompleteSaveForm(myform.attr('name'));

			myform.submit();
		}

	});
};

/**
 * Ad post as get parameter to action (location) of the form
 * adds this handler to an input field. Fielname=value is send
 * @param object options: event:string
 */
jQuery.fn.attachCopyPostToGet = function(options)
{
	var settings = jQuery.extend({event:'blur'}, options);
	var myform = this.parents("form");

	$(this).bind(settings.event, function (event) {
		var action = myform.attr("action");
		var name   = $(this).attr("name");
		if($(this).is('select')){
			var value  = $("option:selected", this).val();
		} else {
			var value  = $(this).val();
		}
		action = addQuerystringArgument(action, name, value);
		//Set form action (url)
		myform.attr("action", action);
	});
};

/**
 * Send Get parameter to add it to location
 * add this handler to an input field. Fielname=value is send
 * @param object options: event:string
 */
jQuery.fn.attachSendGet = function(options)
{
	var settings = jQuery.extend({event:'change'}, options);

	$(this).bind(settings.event, function (event) {
		var loc    = window.location.href;
		var name   = $(this).attr("name");
		var value  = $(this).val();

		window.location = addQuerystringArgument(loc, name, value);
	});
};

/**
 * Detect capslock and appends a span element with id=capslock to an element
 */
jQuery.fn.capsDetect = function ()
{
	$(this).keypress( function(evt) {
		//what (case sensitive in good browsers) key was pressed
		var theKey = evt.which ? evt.which : ( evt.keyCode ? evt.keyCode : ( evt.charCode ? evt.charCode : 0 ) );
		//was the shift key was pressed
		var theShift = evt.shiftKey || ( evt.modifiers && ( evt.modifiers & 4 ) ); //bitWise AND
		//if upper case, check if shift is not pressed. if lower case, check if shift is pressed
		isCaps = ( theKey > 64 && theKey < 91 && !theShift ) || ( theKey > 96 && theKey < 123 && theShift ) ;
		$("#capslock").remove();
		if( isCaps)	$(this).after("<span id='capslock'>! Caps Lock</span>");
	});
};
