/**
 * JSized Forms, v1.0
 *
 * @copyright Copyright (c) 2010 JSized, <a href="http://jsized.com/">JSized</a>
 * @author Stephen Reay
 * @version 1.0
 */

if(!Object.map){Object.map=function(object,callback,context){if(callback.constructor!==Function){throw new TypeError()}var obj={};for(var i in object){if(object.hasOwnProperty(i)){obj[i]=callback.call(context,object[i],i,object)}}return obj}}if(!Array.prototype.indexOf){Array.prototype.indexOf=function indexOf(searchElement,from){var len=this.length;from=Number(from)||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0){from+=len}for(;from<len;from++){if(from in this&&this[from]===searchElement){return from}}return-1}}if(!Function.prototype.inherits){Function.prototype.inherits=function inherits(ParentClass){if(typeof this==='function'){if(this===ParentClass){throw new ReferenceError("A Class can't inherit from itself")}this.prototype=new ParentClass();this.prototype.inherits=Function.prototype.inherits;this.prototype.constructor=this;this.prototype.parent=ParentClass.prototype}else if(typeof this==='object'){if(this.constructor===ParentClass){throw new ReferenceError("A Class can't inherit from itself")}if(arguments.length>1){ParentClass.apply(this,Array.prototype.slice.call(arguments,1))}else{ParentClass.call(this)}}}}if(!Function.prototype.bind){Function.prototype.bind=function bind(context){var callback=this;var args=Array.prototype.slice.call(arguments,0);var object=args.shift();return function(){return callback.apply(object,args.concat(Array.prototype.slice.call(arguments,0)))}}}if(!Function.prototype.bindAsEventListener){Function.prototype.bindAsEventListener=function bindAsEventListener(context){var callback=this;var args=Array.prototype.slice.call(arguments,0);var object=args.shift();return function(event){var localArgs=Array.prototype.slice.call(arguments,0);localArgs.shift();return callback.apply(object,[event||window.event].concat(args,localArgs))}}}if(typeof JSized==='undefined'){var JSized={}}if(typeof JSized.Util==='undefined'){JSized.Util={}}if(typeof JSized.Util.Event==='undefined'){JSized.Util.Event={}}JSized.Util.Event.getKeyCode=function(e){var code=e.keyCode?e.keyCode:e.which?e.which:false;return code};JSized.Util.Event.keyCodes={KEY_CANCEL:3,KEY_HELP:6,KEY_BACK_SPACE:8,KEY_TAB:9,KEY_CLEAR:12,KEY_RETURN:13,KEY_ENTER:14,KEY_SHIFT:16,KEY_CONTROL:17,KEY_ALT:18,KEY_PAUSE:19,KEY_CAPS_LOCK:20,KEY_ESCAPE:27,KEY_SPACE:32,KEY_PAGE_UP:33,KEY_PAGE_DOWN:34,KEY_END:35,KEY_HOME:36,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_PRINTSCREEN:44,KEY_INSERT:45,KEY_DELETE:46,KEY_0:48,KEY_1:49,KEY_2:50,KEY_3:51,KEY_4:52,KEY_5:53,KEY_6:54,KEY_7:55,KEY_8:56,KEY_9:57,KEY_SEMICOLON:59,KEY_EQUALS:61,KEY_A:65,KEY_B:66,KEY_C:67,KEY_D:68,KEY_E:69,KEY_F:70,KEY_G:71,KEY_H:72,KEY_I:73,KEY_J:74,KEY_K:75,KEY_L:76,KEY_M:77,KEY_N:78,KEY_O:79,KEY_P:80,KEY_Q:81,KEY_R:82,KEY_S:83,KEY_T:84,KEY_U:85,KEY_V:86,KEY_W:87,KEY_X:88,KEY_Y:89,KEY_Z:90,KEY_CONTEXT_MENU:93,KEY_NUMPAD0:96,KEY_NUMPAD1:97,KEY_NUMPAD2:98,KEY_NUMPAD3:99,KEY_NUMPAD4:100,KEY_NUMPAD5:101,KEY_NUMPAD6:102,KEY_NUMPAD7:103,KEY_NUMPAD8:104,KEY_NUMPAD9:105,KEY_MULTIPLY:106,KEY_ADD:107,KEY_SEPARATOR:108,KEY_SUBTRACT:109,KEY_DECIMAL:110,KEY_DIVIDE:111,KEY_F1:112,KEY_F2:113,KEY_F3:114,KEY_F4:115,KEY_F5:116,KEY_F6:117,KEY_F7:118,KEY_F8:119,KEY_F9:120,KEY_F10:121,KEY_F11:122,KEY_F12:123,KEY_F13:124,KEY_F14:125,KEY_F15:126,KEY_F16:127,KEY_F17:128,KEY_F18:129,KEY_F19:130,KEY_F20:131,KEY_F21:132,KEY_F22:133,KEY_F23:134,KEY_F24:135,KEY_NUM_LOCK:144,KEY_SCROLL_LOCK:145,KEY_COMMA:188,KEY_PERIOD:190,KEY_SLASH:191,KEY_BACK_QUOTE:192,KEY_OPEN_BRACKET:219,KEY_BACK_SLASH:220,KEY_CLOSE_BRACKET:221,KEY_QUOTE:222,KEY_META:224};if(typeof JSized.Ui==='undefined'){JSized.Ui={}}if(typeof JSized.Ui.Form==='undefined'){JSized.Ui.Form={}}jQuery.fn.JSizedFormSelect=function(options){return this.each(function(){new JSized.Ui.Form.Select(this,options)})};JSized.Ui.Form.Select=function(element,options){if(this.constructor===window.constructor){return new arguments.callee(element)}this.element=jQuery(element);this.options=jQuery.extend(true,{},this.options,options||{});this.isOpen=false;this.styleElement();this.element.bind('focus',this.grabFocus.bindAsEventListener(this));this.element.bind('change',this.onChange.bindAsEventListener(this))};JSized.Ui.Form.Select.prototype.options={containerClass:'custom-select',wrapperClass:'custom-select-wrapper',selectedClass:'current-selected'};JSized.Ui.Form.Select.prototype.styleElement=function(){this.container=jQuery('<div />').addClass(this.options.containerClass);this.wrapper=jQuery('<div><ul></ul><div class="bottom"></div></div>').addClass(this.options.wrapperClass);this.selected=jQuery('<a href="#" />').addClass(this.options.selectedClass).attr('tabIndex',this.element.attr('tabIndex')).html(this.element[0].options[this.element[0].selectedIndex].text);this.container.append(this.selected).append(this.wrapper);this.element.hide().attr('tabIndex','-1').before(this.container);this.optList=this.wrapper.find('ul');this.optListEntries=jQuery.map(this.element[0].options,this.addOption.bind(this));var self=this;this.element.closest('form').bind('reset',function(){window.setTimeout(self.onChange.bind(self),50)});this.selected.bind('click',this.toggle.bindAsEventListener(this));this.selected.bind('keydown',this.keydown.bindAsEventListener(this));this.optList.bind('click',this.click.bindAsEventListener(this))};JSized.Ui.Form.Select.prototype.grabFocus=function(){this.selected.focus()};JSized.Ui.Form.Select.prototype.onChange=function(event,fromUs){if(typeof fromUs!=='undefined'&&fromUs){return}this.selectByIndex(this.element[0].selectedIndex,false)};JSized.Ui.Form.Select.prototype.addOption=function(element,i){element=jQuery(element);var el=jQuery('<li />').addClass(element.hasClass('all')?'all':'').html(jQuery('<a href="#" />').addClass(element.attr('selected')?'selected':'').attr('tabIndex','-1').html(element.html()));this.optList.append(el);return el[0]};JSized.Ui.Form.Select.prototype.toggle=function(e){e.preventDefault();if(this.isOpen){this.close(e)}else{this.selected.focus();this.open(e)}};JSized.Ui.Form.Select.prototype.open=function(e){this.container.addClass('open');this.isOpen=true;window.setTimeout(this.setupEvents.bind(this),10)};JSized.Ui.Form.Select.prototype.close=function(e){this.container.removeClass('open');this.optList.find('.current').removeClass('current');this.isOpen=false;this.removeEvents(e)};JSized.Ui.Form.Select.prototype.setupEvents=function(){var that=this;if(this.callbacks){return}this.callbacks=Object.map({click:this.close,keydown:this.keydown,mouseover:this.mouseover},function(func,key){var callback=func.bindAsEventListener(that);jQuery(document).bind(key,callback);return callback})};JSized.Ui.Form.Select.prototype.removeEvents=function(e){if(this.callbacks){jQuery.each(this.callbacks,function(index,callback){jQuery(document).unbind(index,callback)})}this.callbacks=false};JSized.Ui.Form.Select.prototype.mouseover=function(e,element){element=e?jQuery(e.target):element;if(element[0].nodeName.toLowerCase()==='a'){this.optList.find('.current').removeClass('current');element.addClass('current')}};JSized.Ui.Form.Select.prototype.keydown=function(e){var element=this.optList.find('.current'),ev_element=jQuery(e.target),currentIndex=element?this.optListEntries.indexOf(element.parent()[0]):-1,newIndex=false;switch(JSized.Util.Event.getKeyCode(e)){case JSized.Util.Event.keyCodes.KEY_SPACE:if(ev_element[0]===this.selected[0]){e.stopPropagation();e.preventDefault();this.open(e)}break;case JSized.Util.Event.keyCodes.KEY_TAB:this.close(e);this.element.trigger('change',[true]);break;case JSized.Util.Event.keyCodes.KEY_ESC:this.close(e);break;case JSized.Util.Event.keyCodes.KEY_RETURN:e.stopPropagation();e.preventDefault();if(currentIndex!==-1){this.selectByElement(element)}this.close(e);break;case JSized.Util.Event.keyCodes.KEY_UP:e.stopPropagation();e.preventDefault();if(this.isOpen){newIndex=currentIndex-1}else{this.selectByOffset(-1)}break;case JSized.Util.Event.keyCodes.KEY_DOWN:e.stopPropagation();e.preventDefault();if(this.isOpen){newIndex=currentIndex+1}else{this.selectByOffset(1)}break}if(newIndex!==false){if(newIndex<0){newIndex=this.optListEntries.length-1}else if(newIndex>=this.optListEntries.length){newIndex=0}this.mouseover(false,jQuery('a',this.optListEntries[newIndex]))}};JSized.Ui.Form.Select.prototype.click=function(e){var element=e?jQuery(e.target):false;e.preventDefault();if(element[0]&&element[0].nodeName.toLowerCase()==='a'){this.selectByElement(element);this.close(e)}};JSized.Ui.Form.Select.prototype.selectByOffset=function(offset){var newIndex=this.element[0].selectedIndex+offset;if(newIndex<0){newIndex=this.optListEntries.length-1}if(newIndex>=this.optListEntries.length){newIndex=0}this.selectByIndex(newIndex,false)};JSized.Ui.Form.Select.prototype.selectByElement=function(element){element=jQuery(element);var index=parseInt(this.optListEntries.indexOf(element.closest('li')[0]));this.selectByIndex(index,true)};JSized.Ui.Form.Select.prototype.selectByIndex=function(index,triggerFunction){if(index>=0&&index<this.element[0].options.length){var oldIndex=this.element[0].selectedIndex;this.element[0].selectedIndex=index;this.selected.html(jQuery('a',this.optListEntries[index]).eq(0).html());if(triggerFunction&&oldIndex!==index){this.element.trigger('change',[true])}}};jQuery.fn.JSizedFormCheckbox=function(){return this.each(function(){new JSized.Ui.Form.Checkbox(this)})};JSized.Ui.Form.Checkbox=function Checkbox(element){element=jQuery(element);if(element.data('JSizedStyled')==true){return}if(this.constructor===window.constructor){return new arguments.callee(element)}if(typeof element!=='undefined'){this.basename='checkbox';this.elements=element;this.links=jQuery.map(this.elements,this.styleElement.bind(this))}};JSized.Ui.Form.Checkbox.prototype.styleElement=function styleElement(element,index){element=jQuery(element).data('JSizedStyled',true);var self=this,link=jQuery('<a />').attr({href:'#',className:this.basename});if(element[0].checked){this.check(link,index)}link.insertBefore(element.css({position:'absolute',opacity:0,left:'-999em'}));element.bind('change',this.onChange.bindAsEventListener(this));element.closest('form').bind('reset',function(){window.setTimeout(function(){self.onChange({target:element})},50)});element.closest('label').add(jQuery('label[for="'+element.attr('id')+'"]')).bind('click',function(){link.focus()});link.bind('click keypress',this.clicked.bindAsEventListener(this));return link.get(0)};JSized.Ui.Form.Checkbox.prototype.onChange=function onChange(event){var index=this.elements.index(event.target);if(this.elements[index].checked){this.check(this.links[index],index)}else{this.uncheck(this.links[index],index)}};JSized.Ui.Form.Checkbox.prototype.check=function check(link,i){jQuery(link).addClass(this.basename+'-checked')};JSized.Ui.Form.Checkbox.prototype.uncheck=function uncheck(link,i){jQuery(link).removeClass(this.basename+'-checked')};JSized.Ui.Form.Checkbox.prototype.clicked=function clicked(e){if(e.type==='keypress'){if(JSized.Util.Event.getKeyCode(e)!==JSized.Util.Event.keyCodes.KEY_SPACE){return}}var element=e.target,index=this.links.indexOf(element);element.focus();e.preventDefault();e.stopPropagation();this.elements[index].checked=!this.elements[index].checked;this.elements.eq(index).trigger('change')};jQuery.fn.JSizedFormRadio=function(){return this.each(function(){new JSized.Ui.Form.Radio(this)})};JSized.Ui.Form.Radio=function Radio(element){element=jQuery(element);if(element.data('JSizedStyled')==true){return}if(this.constructor===window.constructor){return new arguments.callee(element)}this.inherits(JSized.Ui.Form.Checkbox);this.basename='radio';this.elements=jQuery('input[name="'+element.attr('name')+'"]');this.links=jQuery.map(this.elements,this.styleElement.bind(this))};JSized.Ui.Form.Radio.inherits(JSized.Ui.Form.Checkbox);JSized.Ui.Form.Radio.prototype.onChange=function onChange(event){var index=this.elements.index(event.target);var self=this;jQuery.each(this.links,function(i,link){self[self.elements[i].checked?'check':'uncheck'](link,i)});this[this.elements[index].checked?'check':'uncheck'](this.links[index],index)};JSized.Ui.Form.Radio.prototype.clicked=function clicked(e){if(e.type==='keypress'){if(JSized.Util.Event.getKeyCode(e)!==JSized.Util.Event.keyCodes.KEY_SPACE){return}e.preventDefault();e.stopPropagation()}var element=e.target,index=this.links.indexOf(element);element.focus();e.preventDefault();e.stopPropagation();this.elements[index].checked=true;this.elements.eq(index).trigger('change')};jQuery.fn.JSizedFormPlaceholder=function(){return this.each(function(){new JSized.Ui.Form.Placeholder(this)})};JSized.Ui.Form.Placeholder=function(element){this.element=jQuery(element);if(!this.element.length||this.nativeSupport(this.element)){return}this.placeholderText=this.element.attr('placeholder');this.active=false;this.passwordMode=this.element.get(0).type==='password';this.passwordFieldFixed=false;if(this.placeholderText){this.events();this.show()}};JSized.Ui.Form.Placeholder.prototype.nativeSupport=function(element){var type=element.get(0).nodeName.toLowerCase(),e=document.createElement(type);return'placeholder'in e};JSized.Ui.Form.Placeholder.prototype.events=function(){this.element.bind('focus',this.hide.bindAsEventListener(this));this.element.closest('form').bind('submit',this.hide.bindAsEventListener(this));this.element.closest('form').bind('reset',this.reset.bindAsEventListener(this));this.element.bind('blur',this.show.bindAsEventListener(this))};JSized.Ui.Form.Placeholder.prototype.fixPasswordField=function(){this._element=this.element;this.otherField=jQuery('<input />').attr('type','text').addClass(this.element.attr('class')).bind('focus',this.hide.bindAsEventListener(this));jQuery('label[for="'+this.element.attr('id')+'"]').bind('observe','click',this.focus.bind(this));this.element.parent().get(0).insertBefore(this.otherField.get(0),this.element.get(0));this.passwordFieldFixed=true};JSized.Ui.Form.Placeholder.prototype.show=function(){if(this.element.val().length===0){if(this.passwordMode){try{this.element.attr('type','text')}catch(e){if(!this.passwordFieldFixed){this.fixPasswordField()}this.element.hide();this.otherField.show();this.element=this.otherField}}this.element.val(this.placeholderText);this.element.css('color','GrayText');this.active=true}};JSized.Ui.Form.Placeholder.prototype.hide=function(){if(this.active){if(this.passwordMode){try{this.element.attr('type','password')}catch(e){if(!this.passwordFieldFixed){this.fixPasswordField()}this.otherField.hide();this.element=this._element;this.active=false;this.element.show().focus()}}this.element.val('');var toFocus=false;this.element.css('color','');this.active=false}};JSized.Ui.Form.Placeholder.prototype.focus=function(){this.element.focus()};JSized.Ui.Form.Placeholder.prototype.reset=function(){window.setTimeout(this.show.bind(this),20)};
