
/* Merged Plone Javascript file
 * This file is dynamically assembled from separate parts.
 * Some of these parts have 3rd party licenses or copyright information attached
 * Such information is valid for that section,
 * not for the entire composite file
 * originating files are separated by - filename.js -
 */

/* - contextmenu.jquery.js - */
// http://www.tudienducviet.de/portal_javascripts/contextmenu.jquery.js?original=1
(function($){$.fn.jjmenu=function(id,clickEvent,param,myReplaces,effect){var global=this;var acceptEvent=false;var id=id;if(!id)id="main";if(clickEvent=="rightClick"||clickEvent=="both"){global.mousedown(function(event){if(event.button==2&&(clickEvent=="rightClick"||clickEvent=="both")){global.pageX=event.pageX;global.pageY=event.pageY;event.preventDefault();event.stopPropagation();var mmain=new menu(id,param,myReplaces,this,effect);$(this)[0].oncontextmenu=function(){return false}
$(this).unbind('mouseup');$(this).blur();return false}});document.body.oncontextmenu=function(){if($("div[id^=jjmenu_main]").length) return false}}
if(clickEvent=="click"||clickEvent=="both"){global.click(
function(event){if(this==event.target){global.pageX=event.pageX;global.pageY=event.pageY;event.preventDefault();event.stopPropagation();var mmain=new menu(id,param,myReplaces,this,effect);$(this).blur();return false}})}
$(document).click(function(event){if(event.button!=2) $("div[id^=jjmenu]").remove()});
function menu(id,param,myReplaces,el,effect){var effect=getEffect(id,effect);if(id=="main") window.triggerElement=el;$("div[id^=jjmenu_"+id+"]").remove();var m=document.createElement('div');var ms=document.createElement('span');$(m).append(ms);m.className="jjmenu";m.id="jjmenu_"+id;$(m).css({display:'none'});$(document.body).append(m);positionMenu();var dynamicItems=false;for(var i in param){if(param[i].get){dynamicItems=true;$.getJSON(uReplace(param[i].get), function(data){for(var ii in data){putItem(data[ii])}
checkPosition()})
$(this).ajaxError( function(){checkPosition()})}
else if(param[i].getByFunction){if(typeof(param[i].getByFunction)=="function"){var uF=param[i].getByFunction}
else{var uF=eval(param[i].getByFunction)}
var uItems=uF(myReplaces);for(var ii in uItems){putItem(uItems[ii])}
checkPosition()}
else{putItem(param[i])}}
if(!dynamicItems) checkPosition();showMenu();
function positionMenu(){var pos=$(el).offset();var t=pos.top;if(effect.xposition=="left"){var l=pos.left}
else{var l=pos.left+$(el).width()+10}
if(effect.xposition=="mouse"){l=global.pageX}
if(effect.yposition=="mouse"){t=global.pageY}
$(m).css({position:"absolute",top:t+"px",left:l+"px"})}
function checkPosition(){var isHidden=$(m).css("display")=="none"?true:false;var noAuto=false;if(effect.orientation=="top"||effect.orientation=="bottom"){noAuto=true}
if(isHidden) $(m).show();var positionTop=$(m).offset().top;var positionLeft=$(m).offset().left;if(isHidden) $(m).hide();var xPos=positionTop-$(window).scrollTop();$(m).css({left:"0px"});var menuHeight=$(m).outerHeight();var menuWidth=$(m).outerWidth();$(m).css({left:positionLeft+"px"});var nleft=positionLeft;if(positionLeft+menuWidth>$(window).width()){nleft=$(window).width()-menuWidth}
var spaceBottom=true;if(effect.yposition=="auto"&&effect.xposition=="left"){if(xPos+menuHeight+$(el).outerHeight()>$(window).height()){spaceBottom=false}}
else{if(xPos+menuHeight>$(window).height()){spaceBottom=false}}
var spaceTop=true;if(positionTop-menuHeight<0){spaceTop=false}
if(effect.yposition=="bottom"){positionTop=positionTop+$(el).outerHeight()}
if((effect.orientation=="auto"&&spaceBottom==false&&spaceTop==true)||effect.orientation=="top"){var ntop=parseInt(positionTop,10)-parseInt(menuHeight,10);$(m).addClass("topOriented")} else{$(m).addClass("bottomOriented");if(effect.yposition=="auto"&&effect.xposition=="left"){positionTop=positionTop+$(el).outerHeight()}
var ntop=parseInt(positionTop,10)}
$(m).css({"top":ntop+"px","left":nleft+"px"})}
function showMenu(){if(!effect||effect.show=="default"){$(m).show();return false}
var speed=parseInt(effect.speed);speed=isNaN(speed)?500:speed;switch(effect.show){case "fadeIn":$(m).fadeIn(speed);break;case "slideDown":$(m).slideDown(speed);break;default:$(m).show();break}}
function putItem(n){var item=document.createElement('div');$(item).hover(function(){$(this).addClass("jj_menu_item_hover")},
function(){$(this).removeClass("jj_menu_item_hover")});$(item).click( function(event){event.stopPropagation();doAction(n.action)});var span=document.createElement('span');$(item).append(span);switch(n.type){case "sub":item.className="jj_menu_item jj_menu_item_more";$(item).click(function(){if($("#jjmenu_"+id+"_sub").length>0){$("div[id^=jjmenu_"+id+"_sub]").remove()}
else{var sub=new menu(id+"_sub",n.src,myReplaces,this,effect)}});break;default:$(item).hover(function(){$("div[id^=jjmenu_"+id+"_sub]").remove()});item.className="jj_menu_item";break}
if(n.customClass&&n.customClass.length>0){jQuery(span).addClass(n.customClass)}
$(span).html(uReplace(n.title));$(ms).append(item)}
function doAction(act){if(act){switch(act.type){case "gourl":if(act.target){var newWindow=window.open(uReplace(act.url),act.target);newWindow.focus();return false}
else{document.location.href=uReplace(act.url)}
break;case "ajax":$.getJSON(uReplace(act.url), function(data){var cb=eval(act.callback);if(typeof(cb)=="function"){cb(data)}});break;case "fn":var callfn='var cb = '+act.callback;jQuery.globalEval(callfn);if(typeof(cb)=="function"){cb(myReplaces)}
break}}}
function uReplace(str){if(myReplaces){for(var u in myReplaces){str=str.replace("#"+u+"#",eval("myReplaces."+u))}}
return str}
function getEffect(id,effect){var defEffect={show:"default",xposition:"right",yposition:"auto",orientation:"auto"};if(!effect){return defEffect}
if(!effect.show) effect.show="default";var show=effect.show;if(!effect.xposition) effect.xposition="right";if(!effect.yposition) effect.yposition="auto";if(!effect.orientation) effect.orientation="auto";if(id!="main"){var subeffect=defEffect;subeffect.show=show}
return(id=="main")?effect:subeffect}}}})(jQuery);

/* - menu_action.js - */
// http://www.tudienducviet.de/portal_javascripts/menu_action.js?original=1
$(document).ready(function(){var info_menus=[{title:'x',customClass:'but_close',action:{type:'fn',callback:closeCallBack}},{title:'Add word',customClass:'add_word',action:{type:'fn',callback:'(function(data){addWordCallBack(data);})'}},{title:'Add to my word list',customClass:'add_to_wordlist',action:{type:'fn',callback:addToWordListCallBack}},{title:'Edit word',customClass:'edit_word',action:{type:'fn',callback:'(function(data){editWordCallBack(data);})'}},{title:'Google search',customClass:'google_search',action:{type:'fn',callback:'(function(data){googleCallBack(data);})'}}];var speech_menus=[{title:'x',customClass:'speech_but_close',action:{type:'fn',callback:closeCallBack}},{title:'<input type="button" value="" class="speech"> Vietnamese',customClass:'vietnamese_speech',action:{type:'fn',callback:'(function(data){vietnameseSpeechCallBack(data);})'}},{title:'<input type="button" value="" class="speech"> Deutsch',customClass:'deutsch_speech',action:{type:'fn',callback:'(function(data){deutschSpeechCallBack(data);})'}}];$('.bt_info').jjmenu(null,'click',info_menus,{inputValue: function(){return triggerElement}});$('.bt_speech').jjmenu(null,'click',speech_menus,{inputValue: function(){return triggerElement}});$('.bt_info').mouseover(function(){var src=$(this).attr("src").match(/[^\.]+/)+"_hover.png";$(this).attr("src",src)}).mouseout(function(){var src=$(this).attr("src").replace("_hover","");$(this).attr("src",src)});$('.bt_speech').mouseover(function(){var src=$(this).attr("src").match(/[^\.]+/)+"_hover.png";$(this).attr("src",src)}).mouseout(function(){var src=$(this).attr("src").replace("_hover","");$(this).attr("src",src)})});
function closeCallBack(){$("div[id^=jjmenu]").remove()}
function addWordCallBack(data){var dt=data.inputValue();var addword_url=$(dt).attr('portal_url');window.location=addword_url+'/@@addWord'}
function addToWordListCallBack(){alert('This function being updated!')}
function editWordCallBack(data){var dt=data.inputValue();var editword_url=$(dt).attr('absolute_url');window.location=editword_url+'/edit'}
function googleCallBack(data){var dt=data.inputValue();var word=$(dt).attr('word');var gURL='http://www.google.com.vn/search?q='+word;window.open(gURL,'Bach Viet Dictionary','width=800,height=600')}
function computerSpeechCallBack(data){var dt=data.inputValue();var idx=$(dt).attr('idx');var word=$(dt).attr('audio1');if(word){document.getElementById("dummyspan").innerHTML="<embed width='0px' height='0px' src='"+word+"' hidden=true autostart=true loop=false>"}
else if(!word){alert('Computer Speech Not Available!')}}
function vietnameseSpeechCallBack(data){var dt=data.inputValue();var idx=$(dt).attr('idx');var word=$(dt).attr('audiomale');if(word){document.getElementById("dummyspan").innerHTML="<embed width='0px' height='0px' src='"+word+"' hidden=true autostart=true loop=false>"}
else if(!word){alert('Vietnamese Speech Not Available!')}}
function deutschSpeechCallBack(data){var dt=data.inputValue();var idx=$(dt).attr('idx');var word=$(dt).attr('audiofemale');if(word){document.getElementById("dummyspan").innerHTML="<embed width='0px' height='0px' src='"+word+"' hidden=true autostart=true loop=false>"}
else if(!word){alert('Deutsch Speech Not Available!')}}

/* - jquery.validate.min.js - */
// http://www.tudienducviet.de/portal_javascripts/jquery.validate.min.js?original=1
(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){this.find("input, button").filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&this.find("input, button").filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("<input type='hidden'/>").attr("name",b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form();else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name];return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a,b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:[],ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)},onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults,a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."),minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator");e="on"+e.type.replace(/^validate/,"");f.settings[e]&&f.settings[e].call(f,this[0])}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate(":text, :password, :file, select, textarea","focusin focusout keyup",a).validateDelegate(":radio, :checkbox, select, option","click",a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement=a=this.clean(a);this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,
function(d){return!(d.name in a)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()==0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.clean(a);if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+a.id+", check the '"+f.method+"' method",h);throw h}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==undefined)return arguments[a]},defaultMessage:function(a,b){return this.findDefined(this.customMessage(a.name,b),this.customMetaMessage(a,b),!this.settings.ignoreTitle&&a.title||undefined,c.validator.messages[b],"<strong>Warning: No message defined for "+a.name+"</strong>")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]=d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass().addClass(this.settings.errorClass);d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this,c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings,a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e=a.attr(d);if(e)b[d]=e}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(a)},url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9-]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>=0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery);(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery);(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a,b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery);

/* - jquery.raty.min.js - */
// http://www.tudienducviet.de/portal_javascripts/jquery.raty.min.js?original=1
(function(g){g.fn.raty=function(n){options=g.extend({},g.fn.raty.defaults,n);if(this.length==0){d("Selector invalid or missing!");return}else{if(this.length>1){return this.each(function(){g.fn.raty.apply(g(this),[n])})}}if(options.number>20){options.number=20}else{if(options.number<0){options.number=0}}if(options.path.substring(options.path.length-1,options.path.length)!="/"){options.path+="/"}$global=g(this);$global.data("options",options);var k=this.attr("id"),l=0,s=options.starOn,o="",m=(options.width)?options.width:(options.number*options.size+options.number*4);if(k==""){k="raty-"+$global.index();$global.attr("id",k)}if(!isNaN(options.start)&&options.start>0){l=(options.start>options.number)?options.number:options.start}for(var p=1;p<=options.number;p++){s=(l>=p)?options.starOn:options.starOff;o=(p<=options.hintList.length&&options.hintList[p-1]!==null)?options.hintList[p-1]:p;$global.append('<img id="'+k+"-"+p+'" src="'+options.path+s+'" alt="'+p+'" title="'+o+'" class="'+k+'"/>').append((p<options.number)?"&nbsp;":"")}if(options.iconRange&&l>0){c(k,l,options)}g("<input/>",{id:k+"-score",type:"hidden",name:options.scoreName}).appendTo($global).val(l);if(options.half){b($global,g("input#"+k+"-score").val(),options)}if(!options.readOnly){if(options.cancel){var q=g("img."+k),t='<img src="'+options.path+options.cancelOff+'" alt="x" title="'+options.cancelHint+'" class="button-cancel"/>',j=options,r=$global;if(j.cancelPlace=="left"){$global.prepend(t+"&nbsp;")}else{$global.append("&nbsp;").append(t)}g("#"+k+" img.button-cancel").mouseenter(function(){g(this).attr("src",j.path+j.cancelOn);q.attr("src",j.path+j.starOff)}).mouseleave(function(){g(this).attr("src",j.path+j.cancelOff);q.mouseout()}).click(function(i){g("input#"+k+"-score").val(0);if(j.click){j.click.apply(r,[0,i])}});$global.css("width",m+options.size+4)}else{$global.css("width",m)}$global.css("cursor","pointer");f($global,options)}else{$global.css("cursor","default");h($global,l,options)}return $global};function f(k,j){var m=k.attr("id"),l=g("input#"+m+"-score"),i=g("img."+m).length;g("#"+m).mouseleave(function(){a(k,l.val(),j)});g("img."+m).mousemove(function(o){c(m,this.alt,j);if(j.half){var n=parseFloat(((o.pageX-g(this).offset().left)/j.size).toFixed(1));n=(n>=0&&n<0.5)?0.5:1;k.data("score",parseFloat(this.alt)+n-1);b(k,k.data("score"),j)}else{c(m,this.alt,j)}}).click(function(n){l.val(j.half?k.data("score"):this.alt);if(j.click){j.click.apply(k,[l.val(),n])}})}function e(m,j,i){var k=$global;if(j){if(j.indexOf(".")>=0){var l;return g(j).each(function(){l="#"+g(this).attr("id");if(i=="start"){g.fn.raty.start(m,l)}else{if(i=="click"){g.fn.raty.click(m,l)}else{if(i=="readOnly"){g.fn.raty.readOnly(m,l)}}}})}k=g(j);if(!k.length){d('"'+j+'" is a invalid identifier for the public funtion $.fn.raty.'+i+"().");return}}return k}function d(i){if(window.console&&window.console.log){window.console.log(i)}}function c(j,k,r){var l=g("img."+j).length,q=0,o=0,p,m;for(var n=1;n<=l;n++){p=g("img#"+j+"-"+n);if(n<=k){if(r.iconRange&&r.iconRange.length>q){m=r.iconRange[q][0];o=r.iconRange[q][1];if(n<=o){p.attr("src",r.path+m)}if(n==o){q++}}else{p.attr("src",r.path+r.starOn)}}else{p.attr("src",r.path+r.starOff)}}}function h(j,k,i){if(k!=0){k=parseInt(k);hint=(k>0&&i.number<=i.hintList.length&&i.hintList[k-1]!==null)?i.hintList[k-1]:k}else{hint=i.noRatedMsg}g("#"+j.attr("id")).attr("title",hint).children("img").attr("title",hint)}function a(j,k,i){var l=j.attr("id");if(k<0||isNaN(k)){k=0}else{if(k>i.number){k=i.number}}g("input#"+l+"-score").val(k);c(l,k,i);if(i.half){b(j,k,i)}if(i.readOnly||j.css("cursor")=="default"){h(j,k,i)}}function b(k,m,j){var n=k.attr("id"),i=Math.ceil(m),l=(i-m).toFixed(1);if(l>=0.3&&l<=0.7){i=i-0.5;g("img#"+n+"-"+Math.ceil(i)).attr("src",j.path+j.starHalf)}else{if(l>=0.8){i--}else{g("img#"+n+"-"+i).attr("src",j.path+j.starOn)}}}g.fn.raty.click=function(l,j){var k=e(l,j,"click"),i=g(j).data("options");a(k,l,i);if(i.click){i.click.apply(k,[l])}else{d('You must add the "click: function(score) { }" callback.')}return g.fn.raty};g.fn.raty.readOnly=function(l,j){var k=e(l,j,"readOnly"),m=k.children("img.button-cancel"),i=g(j).data("options");if(m[0]){(l)?m.hide():m.show()}if(l){g("img."+k.attr("id")).unbind();k.css("cursor","default").unbind()}else{f(k,i);k.css("cursor","pointer")}return g.fn.raty};g.fn.raty.start=function(l,j){var k=e(l,j,"start"),i=g(j).data("options");a(k,l,i);return g.fn.raty};g.fn.raty.defaults={cancel:false,cancelHint:"cancel this rating!",cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:null,half:false,hintList:["bad","poor","regular","good","gorgeous"],noRatedMsg:"not rated yet",number:5,path:"img/",iconRange:[],readOnly:false,scoreName:"score",size:16,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",start:0,width:null}})(jQuery);

/* - dictionary.js - */
// http://www.tudienducviet.de/portal_javascripts/dictionary.js?original=1
$(document).ready(function(){$('#form_addword').validate({rules:{image:{accept:"gif|jpg|png"},audio:{accept:"mp3|flac|wma|aac"},video:{accept:"flv|avi|wmv|mpeg"}}});$('label.error').hide();$('.addWordTranslate').bind('click',function(){$(this).parent().parent().children('.addWordTranslateInput').show()});$('button$[name="cancelWordTranslate"]').bind('click',function(){$('.addWordTranslateInput').hide()});var reset_option=function(){$('.uiOptionMenu li a.selected').each( function(){$(this).removeClass('selected')});$('#brancheBox').val([]);$('#wordclassBox').val([]);$('#wordclassVirtual').val('');$('#branchesVirtual').val('');$('#inputSearch').val('');$('#d_v, #him_off').attr('checked',true);$('.type_language').change();setMethod(-1);$('#search-words .wordclasses.addition').show()}
$('.reset_option').bind('click',function(){reset_option()});$('#search-tabs ul li a').bind('click',function(){reset_option();reset_list_option()});var reset_list_option=function(){$('#l_d_v').attr('checked',true);$('#list_brancheBox').val([]);$('#list_wordclassBox').val([]);$('#prefixNum1').attr('checked',true);$('#list-words .wordclasses.addition').show()}
$('.reset_list_option').bind('click', function(){reset_list_option()});$('a.video').media({width:130,height:150});$('a.audio').media({width:200,height:20})});

/* - selectBox.js - */
// http://www.tudienducviet.de/portal_javascripts/selectBox.js?original=1
(function($){$.fn.extend({uiSelect: function(options,menuID,inputID){var uiInputStyle={'z-index':0}
var defaults={leftOffset:0,topOffset:0};var options=$.extend(defaults,options);var uiMenu=$('<div/>',{id:menuID,'class':'uiSelect',css:{position:'absolute',display:'none',zIndex:1000}});var uiInput=$('<input/>',{id:inputID,name:inputID,value:options.defaultText});var uiOptionMenu=$('<ul/>',{'class':'uiOptionMenu',css:{position:'relative'}});return this.each(function(){var obj=$(this).attr('id');var o=options;var optionTexts=[];var menu=$('#'+obj+' option').each(function(){optionTexts.push($(this).text())});$('#'+obj).after('<div id="group_'+inputID+'"></div>');$('#group_'+inputID).append(uiInput);$('#group_'+inputID).append('<div class="dropdownbtn"></div><div class="clear"></div>');$('#group_'+inputID).parent().append(uiMenu);$("#"+menuID).append(uiOptionMenu);$('#'+obj+' option').each(function(idx){var uiOption=null;if(o.showThumb){uiOption=$('<li><div class="ct"><a class="item_'+idx+'" href="#" value="'+$(this).val()+'"><div class="left"><img style="width:75px; border:none;" src="'+$(this).val()+'" /></div><div class="left img-text">'+$(this).text()+'</div></a><div class="clear"></div></div></li>')}
else{uiOption=$('<li><a class="item_'+idx+'" href="#" value="'+$(this).val()+'">'+$(this).text()+'</a></li>')}
$("#"+menuID+' .uiOptionMenu').append(uiOption)});$('#'+inputID+', .uiSelect a').focus(function(){$(this).blur()});$('#'+obj).css('display','none');$('#'+inputID+', #group_'+inputID+' div.dropdownbtn').css(uiInputStyle).click(function(){if($("#"+menuID).hasClass('open')){$("#"+menuID).removeClass('open');$("#"+menuID).slideUp('fast');return false}
else{$("#"+menuID).addClass('open')}
if(o.multiable){var vals=$('#'+obj).val();if(vals){$('#'+menuID+' a.selected').each(function(){if($(this).hasClass('selected')){$(this).removeClass('selected')}});$('#'+menuID+' a.selected').removeClass('selected');$('#'+menuID+' a').each(function(){var self=this;$(vals).each(function(idx){if($(self).attr('value')==vals[idx]){$(self).addClass('selected')}})})}}
$('div.uiSelect').not("#"+menuID).slideUp('fast');var position=$('#'+inputID).position();var uiHeight=parseInt($('#'+inputID).css('height'))+3;if(o.topOffset==0){uiHeight=uiHeight}else{uiHeight=uiHeight+o.topOffset}
$("#"+menuID).css({"left":(position.left+o.leftOffset)+"px","top":(position.top+uiHeight)+"px"});$("#"+menuID).slideDown();return false}).live('keydown',function(){$('#'+inputID).blur();$("#"+menuID).slideUp('fast');$("#"+menuID).removeClass('open')});$('*').live('click',function(){$("#"+menuID).slideUp('fast');$("#"+menuID).removeClass('open')});$('#'+menuID+' a').click(function(){if(options.multiable){if($(this).hasClass('selected')){$(this).removeClass('selected')}
else{$(this).addClass('selected')}
var vals=[];$('#'+menuID+' a.selected').each(function(){vals.push($(this).attr('value'))});$('#'+obj+'').val(vals).change()}
else{var v=$(this).attr('value');$('#'+obj+'').val(v);$('#'+inputID).val($(this).text());$("#"+menuID).fadeOut('fast')}
return false})})}})})(jQuery);

/* - jquery.bbq.js - */
// http://www.tudienducviet.de/portal_javascripts/jquery.bbq.js?original=1
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);

/* - jquery.urldecoder.min.js - */
// http://www.tudienducviet.de/portal_javascripts/jquery.urldecoder.min.js?original=1
jQuery.url=function(){ function l(a){for(var b="",c=0,f=0,d=0;c<a.length;){f=a.charCodeAt(c);if(f<128){b+=String.fromCharCode(f);c++}else if(f>191&&f<224){d=a.charCodeAt(c+1);b+=String.fromCharCode((f&31)<<6|d&63);c+=2}else{d=a.charCodeAt(c+1);c3=a.charCodeAt(c+2);b+=String.fromCharCode((f&15)<<12|(d&63)<<6|c3&63);c+=3}}return b} function m(a,b){var c={},f={"true":true,"false":false,"null":null};$.each(a.replace(/\+/g, " ").split("&"), function(d, j) { var e = j.split("="); d = k(e[0]); j = c; var i = 0, g = d.split("]["), h = g.length - 1; if(/\[/.test(g[0]) &&/\]$/.test(g[h])) { g[h] = g[h].replace(/\]$/, ""); g = g.shift().split("[").concat(g); h = g.length - 1 }else h = 0; if(e.length === 2) { e = k(e[1]); if(b)e = e && !isNaN(e) ? +e : e === "undefined" ? undefined : f[e] !== undefined ? f[e] : e; if(h)for(;i <= h;i++) { d = g[i] === "" ? j.length : g[i]; j = j[d] = i < h ? j[d] || (g[i + 1] && isNaN(g[i + 1]) ? {} : []) : e }else if($.isArray(c[d]))c[d].push(e); else c[d] = c[d] !== undefined ? [c[d], e] : e }else if(d)c[d] = b ? undefined : "" }); return c } function n(a) { a = a || window.location; var b = ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"]; a =/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(a); for(var c = {}, f = b.length;f--;)c[b[f]] = a[f] || ""; if(c.query)c.params = m(c.query, true); return c } function o(a) { if(a.source)return encodeURI(a.source); var b = []; if(a.protocol)if(a.protocol == "file")b.push("file:///"); else a.protocol == "mailto" ? b.push("mailto:") : b.push(a.protocol + "://"); if(a.authority)b.push(a.authority); else { if(a.userInfo)b.push(a.userInfo + "@"); else if(a.user) { b.push(a.user); a.password && b.push(":" + a.password); b.push("@") }if(a.host) { b.push(a.host); a.port && b.push(":" + a.port) } }if(a.path)b.push(a.path); else { a.directory && b.push(a.directory); a.file && b.push(a.file) }if(a.query)b.push("?" + a.query); else a.params && b.push("?" + $.param(a.params)); a.anchor && b.push("#" + a.anchor); return b.join("") } function p(a) { return encodeURIComponent(a) } function k(a) { a = a || window.location.toString(); return l(unescape(a.replace(/\+/g," ")))} return{encode:p,decode:k,parse:n,build:o}}();

/* - jquery.media.js - */
// http://www.tudienducviet.de/portal_javascripts/jquery.media.js?original=1
;(function($){var lameIE=$.browser.msie&&$.browser.version<9;$.fn.media=function(options,f1,f2){if(options=='undo'){return this.each(function(){var $this=$(this);var html=$this.data('media.origHTML');if(html)
$this.replaceWith(html)})}
return this.each(function(){if(typeof options=='function'){f2=f1;f1=options;options={}}
var o=getSettings(this,options);if(typeof f1=='function') f1(this,o);var r=getTypesRegExp();var m=r.exec(o.src.toLowerCase())||[''];o.type?m[0]=o.type:m.shift();for(var i=0;i<m.length;i++){fn=m[i].toLowerCase();if(isDigit(fn[0])) fn='fn'+fn;if(!$.fn.media[fn])
continue;var player=$.fn.media[fn+'_player'];if(!o.params) o.params={};if(player){var num=player.autoplayAttr=='autostart';o.params[player.autoplayAttr||'autoplay']=num?(o.autoplay?1:0):o.autoplay?true:false}
var $div=$.fn.media[fn](this,o);$div.css('backgroundColor',o.bgColor).width(o.width);if(o.canUndo){var $temp=$('<div></div>').append(this);$div.data('media.origHTML',$temp.html())}
if(typeof f2=='function') f2(this,$div[0],o,player.name);break}})};$.fn.media.mapFormat=function(format,player){if(!format||!player||!$.fn.media.defaults.players[player]) return;format=format.toLowerCase();if(isDigit(format[0])) format='fn'+format;$.fn.media[format]=$.fn.media[player];$.fn.media[format+'_player']=$.fn.media.defaults.players[player]};$.fn.media.defaults={standards:true,canUndo:true,width:400,height:400,autoplay:0,bgColor:'#ffffff',params:{wmode:'transparent'},attrs:{},flvKeyName:'file',flashvars:{},flashVersion:'7',expressInstaller:null,flvPlayer:'mediaplayer.swf',mp3Player:'mediaplayer.swf',silverlight:{inplaceInstallPrompt:'true',isWindowless:'true',framerate:'24',version:'0.9',onError:null,onLoad:null,initParams:null,userContext:null}};$.fn.media.defaults.players={flash:{name:'flash',title:'Flash',types:'flv,mp3,swf',mimetype:'application/x-shockwave-flash',pluginspage:'http://www.adobe.com/go/getflashplayer',ieAttrs:{classid:'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',type:'application/x-oleobject',codebase:'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='+$.fn.media.defaults.flashVersion}},quicktime:{name:'quicktime',title:'QuickTime',mimetype:'video/quicktime',pluginspage:'http://www.apple.com/quicktime/download/',types:'aif,aiff,aac,au,bmp,gsm,mov,mid,midi,mpg,mpeg,mp4,m4a,psd,qt,qtif,qif,qti,snd,tif,tiff,wav,3g2,3gp',ieAttrs:{classid:'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',codebase:'http://www.apple.com/qtactivex/qtplugin.cab'}},realplayer:{name:'real',title:'RealPlayer',types:'ra,ram,rm,rpm,rv,smi,smil',mimetype:'audio/x-pn-realaudio-plugin',pluginspage:'http://www.real.com/player/',autoplayAttr:'autostart',ieAttrs:{classid:'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'}},winmedia:{name:'winmedia',title:'Windows Media',types:'asx,asf,avi,wma,wmv',mimetype:$.browser.mozilla&&isFirefoxWMPPluginInstalled()?'application/x-ms-wmp':'application/x-mplayer2',pluginspage:'http://www.microsoft.com/Windows/MediaPlayer/',autoplayAttr:'autostart',oUrl:'url',ieAttrs:{classid:'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6',type:'application/x-oleobject'}},img:{name:'img',title:'Image',types:'gif,png,jpg'},iframe:{name:'iframe',types:'html,pdf'},silverlight:{name:'silverlight',types:'xaml'}};
function isFirefoxWMPPluginInstalled(){var plugs=navigator.plugins;for(var i=0;i<plugs.length;i++){var plugin=plugs[i];if(plugin['filename']=='np-mswmp.dll')
return true}
return false}
var counter=1;for(var player in $.fn.media.defaults.players){var types=$.fn.media.defaults.players[player].types;$.each(types.split(','), function(i,o){if(isDigit(o[0])) o='fn'+o;$.fn.media[o]=$.fn.media[player]=getGenerator(player);$.fn.media[o+'_player']=$.fn.media.defaults.players[player]})};
function getTypesRegExp(){var types='';for(var player in $.fn.media.defaults.players){if(types.length) types+=',';types+=$.fn.media.defaults.players[player].types};return new RegExp('\\.('+types.replace(/,/ig,'|')+')\\b')};
function getGenerator(player){return function(el,options){return generate(el,options,player)}};
function isDigit(c){return '0123456789'.indexOf(c)>-1};
function getSettings(el,options){options=options||{};var $el=$(el);var cls=el.className||'';var meta=$.metadata?$el.metadata():$.meta?$el.data():{};meta=meta||{};var w=meta.width||parseInt(((cls.match(/\bw:(\d+)/)||[])[1]||0)) || parseInt(((cls.match(/\bwidth:(\d+)/)||[])[1]||0));var h=meta.height||parseInt(((cls.match(/\bh:(\d+)/)||[])[1]||0)) || parseInt(((cls.match(/\bheight:(\d+)/)||[])[1]||0))
if(w) meta.width=w;if(h) meta.height=h;if(cls) meta.cls=cls;var dataName='data-';for(var i=0;i<el.attributes.length;i++){var a=el.attributes[i],n=$.trim(a.name);var index=n.indexOf(dataName);if(index===0){n=n.substring(dataName.length);meta[n]=a.value}}
var a=$.fn.media.defaults;var b=options;var c=meta;var p={params:{bgColor:options.bgColor||$.fn.media.defaults.bgColor}};var opts=$.extend({},a,b,c);$.each(['attrs','params','flashvars','silverlight'], function(i,o){opts[o]=$.extend({},p[o]||{},a[o]||{},b[o]||{},c[o]||{})});if(typeof opts.caption=='undefined') opts.caption=$el.text();opts.src=opts.src||$el.attr('href')||$el.attr('src')||'unknown';return opts};$.fn.media.swf=function(el,opts){if(!window.SWFObject&&!window.swfobject){if(opts.flashvars){var a=[];for(var f in opts.flashvars)
a.push(f+'='+opts.flashvars[f]);if(!opts.params) opts.params={};opts.params.flashvars=a.join('&')}
return generate(el,opts,'flash')}
var id=el.id?(' id="'+el.id+'"'):'';var cls=opts.cls?(' class="'+opts.cls+'"'):'';var $div=$('<div'+id+cls+'>');if(window.swfobject){$(el).after($div).appendTo($div);if(!el.id) el.id='movie_player_'+counter++;swfobject.embedSWF(opts.src,el.id,opts.width,opts.height,opts.flashVersion,opts.expressInstaller,opts.flashvars,opts.params,opts.attrs)}
else{$(el).after($div).remove();var so=new SWFObject(opts.src,'movie_player_'+counter++,opts.width,opts.height,opts.flashVersion,opts.bgColor);if(opts.expressInstaller) so.useExpressInstall(opts.expressInstaller);for(var p in opts.params)
if(p!='bgColor') so.addParam(p,opts.params[p]);for(var f in opts.flashvars)
so.addVariable(f,opts.flashvars[f]);so.write($div[0])}
if(opts.caption) $('<div>').appendTo($div).html(opts.caption);return $div};$.fn.media.flv=$.fn.media.mp3=function(el,opts){var src=opts.src;var player=/\.mp3\b/i.test(src)?$.fn.media.defaults.mp3Player:$.fn.media.defaults.flvPlayer;var key=opts.flvKeyName;src=encodeURIComponent(src);opts.src=player;opts.src=opts.src+'?'+key+'='+(src);var srcObj={};srcObj[key]=src;opts.flashvars=$.extend({},srcObj,opts.flashvars);return $.fn.media.swf(el,opts)};$.fn.media.xaml=function(el,opts){if(!window.Sys||!window.Sys.Silverlight){if($.fn.media.xaml.warning) return;$.fn.media.xaml.warning=1;alert('You must include the Silverlight.js script.');return}
var props={width:opts.width,height:opts.height,background:opts.bgColor,inplaceInstallPrompt:opts.silverlight.inplaceInstallPrompt,isWindowless:opts.silverlight.isWindowless,framerate:opts.silverlight.framerate,version:opts.silverlight.version};var events={onError:opts.silverlight.onError,onLoad:opts.silverlight.onLoad};var id1=el.id?(' id="'+el.id+'"'):'';var id2=opts.id||'AG'+counter++;var cls=opts.cls?(' class="'+opts.cls+'"'):'';var $div=$('<div'+id1+cls+'>');$(el).after($div).remove();Sys.Silverlight.createObjectEx({source:opts.src,initParams:opts.silverlight.initParams,userContext:opts.silverlight.userContext,id:id2,parentElement:$div[0],properties:props,events:events});if(opts.caption) $('<div>').appendTo($div).html(opts.caption);return $div};
function generate(el,opts,player){var $el=$(el);var o=$.fn.media.defaults.players[player];if(player=='iframe'){o=$('<iframe'+' width="'+opts.width+'" height="'+opts.height+'" >');o.attr('src',opts.src);o.css('backgroundColor',o.bgColor)}
else if(player=='img'){o=$('<img>');o.attr('src',opts.src);opts.width&&o.attr('width',opts.width);opts.height&&o.attr('height',opts.height);o.css('backgroundColor',o.bgColor)}
else if(lameIE){var a=['<object width="'+opts.width+'" height="'+opts.height+'" '];for(var key in opts.attrs)
a.push(key+'="'+opts.attrs[key]+'" ');for(var key in o.ieAttrs||{}){var v=o.ieAttrs[key];if(key=='codebase'&&window.location.protocol=='https:')
v=v.replace('http','https');a.push(key+'="'+v+'" ')}
a.push('></ob'+'ject'+'>');var p=['<param name="'+(o.oUrl||'src')+'" value="'+opts.src+'">'];for(var key in opts.params)
p.push('<param name="'+key+'" value="'+opts.params[key]+'">');var o=document.createElement(a.join(''));for(var i=0;i<p.length;i++)
o.appendChild(document.createElement(p[i]))}
else if(opts.standards){var a=['<object type="'+o.mimetype+'" width="'+opts.width+'" height="'+opts.height+'"'];if(opts.src) a.push(' data="'+opts.src+'" ');if($.browser.msie){for(var key in o.ieAttrs||{}){var v=o.ieAttrs[key];if(key=='codebase'&&window.location.protocol=='https:')
v=v.replace('http','https');a.push(key+'="'+v+'" ')}}
a.push('>');a.push('<param name="'+(o.oUrl||'src')+'" value="'+opts.src+'">');for(var key in opts.params){if(key=='wmode'&&player!='flash')
continue;a.push('<param name="'+key+'" value="'+opts.params[key]+'">')}
a.push('<div><p><strong>'+o.title+' Required</strong></p><p>'+o.title+' is required to view this media. <a href="'+o.pluginspage+'">Download Here</a>.</p></div>');a.push('</ob'+'ject'+'>')}
else{var a=['<embed width="'+opts.width+'" height="'+opts.height+'" style="display:block"'];if(opts.src) a.push(' src="'+opts.src+'" ');for(var key in opts.attrs)
a.push(key+'="'+opts.attrs[key]+'" ');for(var key in o.eAttrs||{})
a.push(key+'="'+o.eAttrs[key]+'" ');for(var key in opts.params){if(key=='wmode'&&player!='flash')
continue;a.push(key+'="'+opts.params[key]+'" ')}
a.push('></em'+'bed'+'>')}
var id=el.id?(' id="'+el.id+'"'):'';var cls=opts.cls?(' class="'+opts.cls+'"'):'';var $div=$('<div'+id+cls+'>');$el.after($div).remove();(lameIE||player=='iframe'||player=='img')?$div.append(o):$div.html(a.join(''));if(opts.caption) $('<div>').appendTo($div).html(opts.caption);return $div}})(jQuery);

/* - jquery.jeditable.js - */
/*
 * Jeditable - jQuery in place edit plugin
 *
 * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul
 *
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Project home:
 *   http://www.appelsiini.net/projects/jeditable
 *
 * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
 *    http://www.dyve.net/jquery/?editable
 *
 */

/**
  * Version 1.7.1
  *
  * ** means there is basic unit tests for this parameter. 
  *
  * @name  Jeditable
  * @type  jQuery
  * @param String  target             (POST) URL or function to send edited content to **
  * @param Hash    options            additional options 
  * @param String  options[method]    method to use to send edited content (POST or PUT) **
  * @param Function options[callback] Function to run after submitting edited content **
  * @param String  options[name]      POST parameter name of edited content
  * @param String  options[id]        POST parameter name of edited div id
  * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.
  * @param String  options[type]      text, textarea or select (or any 3rd party input type) **
  * @param Integer options[rows]      number of rows if using textarea ** 
  * @param Integer options[cols]      number of columns if using textarea **
  * @param Mixed   options[height]    'auto', 'none' or height in pixels **
  * @param Mixed   options[width]     'auto', 'none' or width in pixels **
  * @param String  options[loadurl]   URL to fetch input content before editing **
  * @param String  options[loadtype]  Request type for load url. Should be GET or POST.
  * @param String  options[loadtext]  Text to display while loading external content.
  * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.
  * @param Mixed   options[data]      Or content given as paramameter. String or function.**
  * @param String  options[indicator] indicator html to show when saving
  * @param String  options[tooltip]   optional tooltip text via title attribute **
  * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **
  * @param String  options[submit]    submit button value, empty means no button **
  * @param String  options[cancel]    cancel button value, empty means no button **
  * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **
  * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **
  * @param String  options[select]    true or false, when true text is highlighted ??
  * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **
  * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??
  *             
  * @param Function options[onsubmit] function(settings, original) { ... } called before submit
  * @param Function options[onreset]  function(settings, original) { ... } called before reset
  * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error
  *             
  * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.
  *             
  */

(function($) {

    $.fn.editable = function(target, options) {
            
        if ('disable' == target) {
            $(this).data('disabled.editable', true);
            return;
        }
        if ('enable' == target) {
            $(this).data('disabled.editable', false);
            return;
        }
        if ('destroy' == target) {
            $(this)
                .unbind($(this).data('event.editable'))
                .removeData('disabled.editable')
                .removeData('event.editable');
            return;
        }
        
        var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
        
        /* setup some functions */
        var plugin   = $.editable.types[settings.type].plugin || function() { };
        var submit   = $.editable.types[settings.type].submit || function() { };
        var buttons  = $.editable.types[settings.type].buttons 
                    || $.editable.types['defaults'].buttons;
        var content  = $.editable.types[settings.type].content 
                    || $.editable.types['defaults'].content;
        var element  = $.editable.types[settings.type].element 
                    || $.editable.types['defaults'].element;
        var reset    = $.editable.types[settings.type].reset 
                    || $.editable.types['defaults'].reset;
        var callback = settings.callback || function() { };
        var onedit   = settings.onedit   || function() { }; 
        var onsubmit = settings.onsubmit || function() { };
        var onreset  = settings.onreset  || function() { };
        var onerror  = settings.onerror  || reset;
          
        /* show tooltip */
        if (settings.tooltip) {
            $(this).attr('title', settings.tooltip);
        }
        
        settings.autowidth  = 'auto' == settings.width;
        settings.autoheight = 'auto' == settings.height;
        
        return this.each(function() {
                        
            /* save this to self because this changes when scope changes */
            var self = this;  
                   
            /* inlined block elements lose their width and height after first edit */
            /* save them for later use as workaround */
            var savedwidth  = $(self).width();
            var savedheight = $(self).height();
            
            /* save so it can be later used by $.editable('destroy') */
            $(this).data('event.editable', settings.event);
            
            /* if element is empty add something clickable (if requested) */
            if (!$.trim($(this).html())) {
                $(this).html(settings.placeholder);
            }
            
            $(this).bind(settings.event, function(e) {
                
                /* abort if disabled for this element */
                if (true === $(this).data('disabled.editable')) {
                    return;
                }
                
                /* prevent throwing an exeption if edit field is clicked again */
                if (self.editing) {
                    return;
                }
                
                /* abort if onedit hook returns false */
                if (false === onedit.apply(this, [settings, self])) {
                   return;
                }
                
                /* prevent default action and bubbling */
                e.preventDefault();
                e.stopPropagation();
                
                /* remove tooltip */
                if (settings.tooltip) {
                    $(self).removeAttr('title');
                }
                
                /* figure out how wide and tall we are, saved width and height */
                /* are workaround for http://dev.jquery.com/ticket/2190 */
                if (0 == $(self).width()) {
                    //$(self).css('visibility', 'hidden');
                    settings.width  = savedwidth;
                    settings.height = savedheight;
                } else {
                    if (settings.width != 'none') {
                        settings.width = 
                            settings.autowidth ? $(self).width()  : settings.width;
                    }
                    if (settings.height != 'none') {
                        settings.height = 
                            settings.autoheight ? $(self).height() : settings.height;
                    }
                }
                //$(this).css('visibility', '');
                
                /* remove placeholder text, replace is here because of IE */
                if ($(this).html().toLowerCase().replace(/(;|")/g, '') == 
                    settings.placeholder.toLowerCase().replace(/(;|")/g, '')) {
                        $(this).html('');
                }
                                
                self.editing    = true;
                self.revert     = $(self).html();
                $(self).html('');

                /* create the form object */
                var form = $('<form />');
                
                /* apply css or style or both */
                if (settings.cssclass) {
                    if ('inherit' == settings.cssclass) {
                        form.attr('class', $(self).attr('class'));
                    } else {
                        form.attr('class', settings.cssclass);
                    }
                }

                if (settings.style) {
                    if ('inherit' == settings.style) {
                        form.attr('style', $(self).attr('style'));
                        /* IE needs the second line or display wont be inherited */
                        form.css('display', $(self).css('display'));                
                    } else {
                        form.attr('style', settings.style);
                    }
                }

                /* add main input element to form and store it in input */
                var input = element.apply(form, [settings, self]);

                /* set input content via POST, GET, given data or existing value */
                var input_content;
                
                if (settings.loadurl) {
                    var t = setTimeout(function() {
                        input.disabled = true;
                        content.apply(form, [settings.loadtext, settings, self]);
                    }, 100);

                    var loaddata = {};
                    loaddata[settings.id] = self.id;
                    if ($.isFunction(settings.loaddata)) {
                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
                    } else {
                        $.extend(loaddata, settings.loaddata);
                    }
                    $.ajax({
                       type : settings.loadtype,
                       url  : settings.loadurl,
                       data : loaddata,
                       async : false,
                       success: function(result) {
                          window.clearTimeout(t);
                          input_content = result;
                          input.disabled = false;
                       }
                    });
                } else if (settings.data) {
                    input_content = settings.data;
                    if ($.isFunction(settings.data)) {
                        input_content = settings.data.apply(self, [self.revert, settings]);
                    }
                } else {
                    input_content = self.revert; 
                }
                content.apply(form, [input_content, settings, self]);

                input.attr('name', settings.name);
        
                /* add buttons to the form */
                buttons.apply(form, [settings, self]);
         
                /* add created form to self */
                $(self).append(form);
         
                /* attach 3rd party plugin if requested */
                plugin.apply(form, [settings, self]);

                /* focus to first visible form element */
                $(':input:visible:enabled:first', form).focus();

                /* highlight input contents when requested */
                if (settings.select) {
                    input.select();
                }
        
                /* discard changes if pressing esc */
                input.keydown(function(e) {
                    if (e.keyCode == 27) {
                        e.preventDefault();
                        //self.reset();
                        reset.apply(form, [settings, self]);
                    }
                });

                /* discard, submit or nothing with changes when clicking outside */
                /* do nothing is usable when navigating with tab */
                var t;
                if ('cancel' == settings.onblur) {
                    input.blur(function(e) {
                        /* prevent canceling if submit was clicked */
                        t = setTimeout(function() {
                            reset.apply(form, [settings, self]);
                        }, 500);
                    });
                } else if ('submit' == settings.onblur) {
                    input.blur(function(e) {
                        /* prevent double submit if submit was clicked */
                        t = setTimeout(function() {
                            form.submit();
                        }, 200);
                    });
                } else if ($.isFunction(settings.onblur)) {
                    input.blur(function(e) {
                        settings.onblur.apply(self, [input.val(), settings]);
                    });
                } else {
                    input.blur(function(e) {
                      /* TODO: maybe something here */
                    });
                }

                form.submit(function(e) {

                    if (t) { 
                        clearTimeout(t);
                    }

                    /* do no submit */
                    e.preventDefault(); 
            
                    /* call before submit hook. */
                    /* if it returns false abort submitting */                    
                    if (false !== onsubmit.apply(form, [settings, self])) { 
                        /* custom inputs call before submit hook. */
                        /* if it returns false abort submitting */
                        if (false !== submit.apply(form, [settings, self])) { 

                          /* check if given target is function */
                          if ($.isFunction(settings.target)) {
                              var str = settings.target.apply(self, [input.val(), settings]);
                              $(self).html(str);
                              self.editing = false;
                              callback.apply(self, [self.innerHTML, settings]);
                              /* TODO: this is not dry */                              
                              if (!$.trim($(self).html())) {
                                  $(self).html(settings.placeholder);
                              }
                          } else {
                              /* add edited content and id of edited element to POST */
                              var submitdata = {};
                              submitdata[settings.name] = input.val();
                              submitdata[settings.id] = self.id;
                              /* add extra data to be POST:ed */
                              if ($.isFunction(settings.submitdata)) {
                                  $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
                              } else {
                                  $.extend(submitdata, settings.submitdata);
                              }

                              /* quick and dirty PUT support */
                              if ('PUT' == settings.method) {
                                  submitdata['_method'] = 'put';
                              }

                              /* show the saving indicator */
                              $(self).html(settings.indicator);
                              
                              /* defaults for ajaxoptions */
                              var ajaxoptions = {
                                  type    : 'POST',
                                  data    : submitdata,
                                  dataType: 'html',
                                  url     : settings.target,
                                  success : function(result, status) {
                                      if (ajaxoptions.dataType == 'html') {
                                        $(self).html(result);
                                      }
                                      self.editing = false;
                                      callback.apply(self, [result, settings]);
                                      if (!$.trim($(self).html())) {
                                          $(self).html(settings.placeholder);
                                      }
                                  },
                                  error   : function(xhr, status, error) {
                                      onerror.apply(form, [settings, self, xhr]);
                                  }
                              };
                              
                              /* override with what is given in settings.ajaxoptions */
                              $.extend(ajaxoptions, settings.ajaxoptions);   
                              $.ajax(ajaxoptions);          
                              
                            }
                        }
                    }
                    
                    /* show tooltip again */
                    $(self).attr('title', settings.tooltip);
                    
                    return false;
                });
            });
            
            /* privileged methods */
            this.reset = function(form) {
                /* prevent calling reset twice when blurring */
                if (this.editing) {
                    /* before reset hook, if it returns false abort reseting */
                    if (false !== onreset.apply(form, [settings, self])) { 
                        $(self).html(self.revert);
                        self.editing   = false;
                        if (!$.trim($(self).html())) {
                            $(self).html(settings.placeholder);
                        }
                        /* show tooltip again */
                        if (settings.tooltip) {
                            $(self).attr('title', settings.tooltip);                
                        }
                    }                    
                }
            };            
        });

    };


    $.editable = {
        types: {
            defaults: {
                element : function(settings, original) {
                    var input = $('<input type="hidden"></input>');                
                    $(this).append(input);
                    return(input);
                },
                content : function(string, settings, original) {
                    $(':input:first', this).val(string);
                },
                reset : function(settings, original) {
                  original.reset(this);
                },
                buttons : function(settings, original) {
                    var form = this;
                    if (settings.submit) {
                        /* if given html string use that */
                        if (settings.submit.match(/>$/)) {
                            var submit = $(settings.submit).click(function() {
                                if (submit.attr("type") != "submit") {
                                    form.submit();
                                }
                            });
                        /* otherwise use button with given string as text */
                        } else {
                            var submit = $('<button type="submit" />');
                            submit.html(settings.submit);                            
                        }
                        $(this).append(submit);
                    }
                    if (settings.cancel) {
                        /* if given html string use that */
                        if (settings.cancel.match(/>$/)) {
                            var cancel = $(settings.cancel);
                        /* otherwise use button with given string as text */
                        } else {
                            var cancel = $('<button type="cancel" />');
                            cancel.html(settings.cancel);
                        }
                        $(this).append(cancel);

                        $(cancel).click(function(event) {
                            //original.reset();
                            if ($.isFunction($.editable.types[settings.type].reset)) {
                                var reset = $.editable.types[settings.type].reset;                                                                
                            } else {
                                var reset = $.editable.types['defaults'].reset;                                
                            }
                            reset.apply(form, [settings, original]);
                            return false;
                        });
                    }
                }
            },
            text: {
                element : function(settings, original) {
                    var input = $('<input />');
                    if (settings.width  != 'none') { input.width(settings.width);  }
                    if (settings.height != 'none') { input.height(settings.height); }
                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
                    //input[0].setAttribute('autocomplete','off');
                    input.attr('autocomplete','off');
                    $(this).append(input);
                    return(input);
                }
            },
            textarea: {
                element : function(settings, original) {
                    var textarea = $('<textarea />');
                    if (settings.rows) {
                        textarea.attr('rows', settings.rows);
                    } else if (settings.height != "none") {
                        textarea.height(settings.height);
                    }
                    if (settings.cols) {
                        textarea.attr('cols', settings.cols);
                    } else if (settings.width != "none") {
                        textarea.width(settings.width);
                    }
                    $(this).append(textarea);
                    return(textarea);
                }
            },
            select: {
               element : function(settings, original) {
                    var select = $('<select />');
                    $(this).append(select);
                    return(select);
                },
                content : function(data, settings, original) {
                    /* If it is string assume it is json. */
                    if (String == data.constructor) {      
                        eval ('var json = ' + data);
                    } else {
                    /* Otherwise assume it is a hash already. */
                        var json = data;
                    }
                    for (var key in json) {
                        if (!json.hasOwnProperty(key)) {
                            continue;
                        }
                        if ('selected' == key) {
                            continue;
                        } 
                        var option = $('<option />').val(key).append(json[key]);
                        $('select', this).append(option);    
                    }                    
                    /* Loop option again to set selected. IE needed this... */ 
                    $('select', this).children().each(function() {
                        if ($(this).val() == json['selected'] || 
                            $(this).text() == $.trim(original.revert)) {
                                $(this).attr('selected', 'selected');
                        }
                    });
                }
            }
        },

        /* Add new input type */
        addInputType: function(name, input) {
            $.editable.types[name] = input;
        }
    };

    // publicly accessible defaults
    $.fn.editable.defaults = {
        name       : 'value',
        id         : 'id',
        type       : 'text',
        width      : 'auto',
        height     : 'auto',
        event      : 'click.editable',
        onblur     : 'cancel',
        loadtype   : 'GET',
        loadtext   : 'Loading...',
        placeholder: 'Click to edit',
        loaddata   : {},
        submitdata : {},
        ajaxoptions: {}
    };

})(jQuery);


