/*
 * The Smield : An unobtrusive javascript UI Helping SMart fIELD
 * Copyright(c) 2007, Dave Transom.
 * Version: 1.0.1
 * http://www.singular.co.nz/blog/archive/2007/05/14/unobtrusive-javascript-smart-field.aspx
 * 
 * This code is licensed under BSD license. Use it as you wish, 
 * but keep this copyright intact.
 */
if(typeof CSharpVitamins=="undefined")var CSharpVitamins={};(function(){var ns=CSharpVitamins;var isIE=/*@cc_on!@*/false,counter=0,addEvent;var createId=function(prefix){return(prefix||"smieldAutoId")+"_"+(++counter);};var createGroupName=function(){return"smield"+(++counter);};var trim=function(value){return String(value).replace(/^\s+|\s+$/g,"");};var findBy=function(){var a=arguments,list=a[0];if(a.length==3){var key=a[1],value=a[2];for(var i=0,l=list.length;i<l;++i){if(list[i][key]===value)return list[i];}}else if(a.length==2&&typeof a[1]=="function"){var predicate=a[1];for(var i=0,l=list.length;i<l;++i){if(predicate(list[i]))return list[i];}}return null;};var getElement=function(element){if(typeof element=="string")return document.getElementById(element);return element||null;};var extend=function(destination,source){for(var key in source){destination[key]=source[key];}return destination;};var hasClass=function(element,name){var re=new RegExp("(?:^|\\s+)"+name+"(?:\\s+|$)");return re.test(element.className);};var addClass=function(element,name){if(hasClass(element,name))return;element.className=[element.className,name].join(' ');};var removeClass=function(element,name){if(!hasClass(element,name))return;var re=new RegExp("(?:^|\\s+)"+name+"(?:\\s+|$)","g");element.className=element.className.replace(re,' ');};if(typeof YAHOO!="undefined"&&YAHOO.util.Event){var E=YAHOO.util.Event;addEvent=function(){E.on.apply(E,arguments);};}else if(typeof Prototype!="undefined"){addEvent=function(){Event.observe.apply(Event,arguments);};}else if(typeof $addHandler=="function"){var cache=[];addEvent=function(){$addHandler.apply(this,arguments);cache.push(arguments[0]);};Sys.Application.add_unload(function(){for(var i=cache.length-1;i>=0;--i){$clearHandlers(cache[i]);cache[i]=null;}cache=null;});}else{var cache=[];addEvent=function(element,type,handler,capture){if(element.addEventListener)element.addEventListener(type,handler,capture||false);else if(window.attachEvent)element.attachEvent("on"+type,handler);cache.push(arguments);};addEvent(window,"unload",function(){for(var i=cache.length-1;i>=0;--i){var item=cache[i];if(item[0].removeEventListener){item[0].removeEventListener(item[1],item[2],item[3]||false);}else if(item[0].detachEvent){try{item[0].detachEvent("on"+item[1],item[2]);}catch(e){}}item[0]=null;}cache=null;});}ns.SmieldChoice=function(name,label,members,separator){this.name=name;this.label=label||"";this.separator=separator||" ";this.fields=[];this.hasFields=false;this.trigger=null;if(members){if(typeof members=="string")this.fields.push(getElement(members));else{for(var i=0,field=null;null!=(field=getElement(members[i]));++i)this.fields.push(field);}this.hasFields=this.fields.length>0;}};ns.SmieldChoice.prototype={getTrigger:function(group){if(!this.trigger){var radio;if(isIE){radio=document.createElement("<input type=\"radio\" id=\""+createId(group)+"\" name=\""+group+"\" value=\""+this.name+"\" />");}else{radio=document.createElement("input");radio.type="radio";radio.name=group;radio.id=createId(group);radio.value=this.name;}this.trigger=radio;}return this.trigger;},getValue:function(){var results=[];for(var i=0,l=this.fields.length;i<l;++i){var value=trim(this.fields[i].value);if(value.length>0)results.push(value);}return results.join(this.separator);}};ns.Smield=function(input,choices,options){var me=this;this.input=getElement(input);this.choices=choices;this.current=null;this.options=extend({group:createGroupName(),listClass:"smield",disabledClass:"disabled",filter:ns.Smield.Filters.trim,position:ns.Smield.Position.below,protection:ns.Smield.Protection.readonly},options||{});this.event_swap=function(e){me.swap(e||window.event);};this.event_update=function(){me.update();};var ul=document.createElement("ul"),value=this.getValue(),defaultChoice=null;addClass(ul,this.options.listClass);if(this.options.position==ns.Smield.Position.above){this.input.parentNode.insertBefore(ul,this.input);}else{this.input.parentNode.appendChild(ul);}for(var i=0,choice=null;null!=(choice=this.choices[i]);++i){var li=document.createElement("li"),radio=choice.getTrigger(me.options.group),label=document.createElement("label");label.htmlFor=radio.id;label.appendChild(document.createTextNode(choice.label));li.appendChild(radio);li.appendChild(label);ul.appendChild(li);addEvent(radio,"click",me.event_swap);for(var j=0,field=null;null!=(field=choice.fields[j]);++j){addEvent(field,field.tagName=="INPUT"?"keyup":"change",me.event_update);addEvent(field,"blur",me.event_update);}if(!me.current&&choice.hasFields&&value==me.options.filter(choice.getValue())){me.current=choice;radio.checked=true;}if(!defaultChoice&&!choice.hasFields)defaultChoice=choice;}if(!this.current)this.current=defaultChoice||this.choices[0];this.current.trigger.checked=true;this.update();if(this.input.form){addEvent(this.input.form,"submit",function(){me.beforeSubmit();});addEvent(this.input.form,"reset",function(){me.beforeReset();});}};ns.Smield.prototype={beforeSubmit:function(){if(this.options.protection==ns.Smield.Protection.disabled){this.input.disabled=false;}},beforeReset:function(){var me=this;setTimeout(function(){me.reset();},10);},swap:function(ev){var trigger=ev.target||ev.srcElement;this.current=findBy(this.choices,"name",trigger.value);this.update();},update:function(){var value=this.options.filter(this.current.getValue());if(value.length>0)this.input.value=value;this.input[this.options.protection==ns.Smield.Protection.disabled?"disabled":"readOnly"]=this.current.hasFields;if(this.current.hasFields)addClass(this.input,this.options.disabledClass);else removeClass(this.input,this.options.disabledClass);},getValue:function(){return this.options.filter(this.input.value);},reset:function(){var value=this.getValue();if(value.length>0){var me=this;var predicate=function(item){return item.hasFields&&value==me.options.filter(item.getValue());};var choice=findBy(this.choices,predicate)||findBy(this.choices,"hasFields",false)||this.choices[0];this.current=choice;this.current.trigger.checked=true;this.update();}}};ns.Smield.Position={below:"below",above:"above"};ns.Smield.Protection={readonly:"readonly",disabled:"disabled"};ns.Smield.Filters={none:function(value){return value;},trim:trim,username:function(value){var filters=ns.Smield.Filters;return filters.chain(value,[filters.company,function(v){return v.replace(/[^a-z0-9\._@]/ig,"");},filters.trim,filters.lower]);},company:function(value){return value.replace(/\b(limited|ltd\.?)/ig,"");},lower:function(value){return value.toLowerCase();},upper:function(value){return value.toUpperCase();},chain:function(value,filters){for(var i=0,filter=null;null!=(filter=filters[i]);++i)value=filter(value);return value;}};})();