(function($){function getElementIdentifier(el){return"[id="+el.attr("id")+"][name="+el.attr("name")+"]";}$.fn.sisyphus=function(options){var identifier=$.map(this,function(obj){return getElementIdentifier($(obj));}).join();var sisyphus=Sisyphus.getInstance(identifier);sisyphus.protect(this,options);return sisyphus;};var browserStorage={};browserStorage.isAvailable=function(){if(typeof $.jStorage==="object"){return true;}try{return localStorage.getItem;}catch(e){return false;}};browserStorage.set=function(key,value){if(typeof $.jStorage==="object"){$.jStorage.set(key,value+"");}else{try{localStorage.setItem(key,value+"");}catch(e){}}};browserStorage.get=function(key){if(typeof $.jStorage==="object"){var result=$.jStorage.get(key);return result?result.toString():result;}else{return localStorage.getItem(key);}};browserStorage.remove=function(key){if(typeof $.jStorage==="object"){$.jStorage.deleteKey(key);}else{localStorage.removeItem(key);}};Sisyphus=(function(){var params={instantiated:[],started:[]};var CKEDITOR=window.CKEDITOR;function init(){return{setInstanceIdentifier:function(identifier){this.identifier=identifier;},getInstanceIdentifier:function(){return this.identifier;},setInitialOptions:function(options){var defaults={excludeFields:[],customKeySuffix:"",locationBased:false,timeout:0,autoRelease:true,onBeforeSave:function(){},onSave:function(){},onBeforeRestore:function(){},onRestore:function(){},onRelease:function(){}};this.options=this.options||$.extend(defaults,options);this.browserStorage=browserStorage;},setOptions:function(options){this.options=this.options||this.setInitialOptions(options);this.options=$.extend(this.options,options);},protect:function(targets,options){this.setOptions(options);targets=targets||{};var self=this;this.targets=this.targets||[];if(self.options.name){this.href=self.options.name;}else{this.href=location.hostname+location.pathname+location.search+location.hash;}this.targets=$.merge(this.targets,targets);this.targets=$.unique(this.targets);this.targets=$(this.targets);if(!this.browserStorage.isAvailable()){return false;}var callback_result=self.options.onBeforeRestore.call(self);if(callback_result===undefined||callback_result){self.restoreAllData();}if(this.options.autoRelease){self.bindReleaseData();}if(!params.started[this.getInstanceIdentifier()]){if(self.isCKEditorPresent()){var intervalId=setInterval(function(){if(CKEDITOR.isLoaded){clearInterval(intervalId);self.bindSaveData();params.started[self.getInstanceIdentifier()]=true;}},100);}else{self.bindSaveData();params.started[self.getInstanceIdentifier()]=true;}}},isCKEditorPresent:function(){if(this.isCKEditorExists()){CKEDITOR.isLoaded=false;CKEDITOR.on("instanceReady",function(){CKEDITOR.isLoaded=true;});return true;}else{return false;}},isCKEditorExists:function(){return typeof CKEDITOR!=="undefined";},findFieldsToProtect:function(target){return target.find(":input").not(":submit").not(":reset").not(":button").not(":file").not(":password").not(":disabled").not("[readonly]");},bindSaveData:function(){var self=this;if(self.options.timeout){self.saveDataByTimeout();}self.targets.each(function(){var targetFormIdAndName=getElementIdentifier($(this));self.findFieldsToProtect($(this)).each(function(){if($.inArray(this,self.options.excludeFields)!==-1){return true;}var field=$(this);var prefix=(self.options.locationBased?self.href:"")+targetFormIdAndName+getElementIdentifier(field)+self.options.customKeySuffix;if(field.is(":text")||field.is("textarea")){if(!self.options.timeout){self.bindSaveDataImmediately(field,prefix);}}self.bindSaveDataOnChange(field);});});},saveAllData:function(){var self=this;self.targets.each(function(){var targetFormIdAndName=getElementIdentifier($(this));var multiCheckboxCache={};self.findFieldsToProtect($(this)).each(function(){var field=$(this);if($.inArray(this,self.options.excludeFields)!==-1||(field.attr("name")===undefined&&field.attr("id")===undefined)){return true;}var prefix=(self.options.locationBased?self.href:"")+targetFormIdAndName+getElementIdentifier(field)+self.options.customKeySuffix;var value=field.val();if(field.is(":checkbox")){var name=field.attr("name");if(name!==undefined&&name.indexOf("[")!==-1){if(multiCheckboxCache[name]===true){return;}value=[];$("[name='"+name+"']:checked").each(function(){value.push($(this).val());});multiCheckboxCache[name]=true;}else{value=field.is(":checked");}self.saveToBrowserStorage(prefix,value,false);}else{if(field.is(":radio")){if(field.is(":checked")){value=field.val();self.saveToBrowserStorage(prefix,value,false);}}else{if(self.isCKEditorExists()){var editor=CKEDITOR.instances[field.attr("name")]||CKEDITOR.instances[field.attr("id")];if(editor){editor.updateElement();self.saveToBrowserStorage(prefix,field.val(),false);}else{self.saveToBrowserStorage(prefix,value,false);}}else{self.saveToBrowserStorage(prefix,value,false);}}}});});self.options.onSave.call(self);},restoreAllData:function(){var self=this;var restored=false;self.targets.each(function(){var target=$(this);var targetFormIdAndName=getElementIdentifier($(this));self.findFieldsToProtect(target).each(function(){if($.inArray(this,self.options.excludeFields)!==-1){return true;}var field=$(this);var prefix=(self.options.locationBased?self.href:"")+targetFormIdAndName+getElementIdentifier(field)+self.options.customKeySuffix;var resque=self.browserStorage.get(prefix);if(resque!==null){self.restoreFieldsData(field,resque);restored=true;}});});if(restored){self.options.onRestore.call(self);}},restoreFieldsData:function(field,resque){if(field.attr("name")===undefined&&field.attr("id")===undefined){return false;}var name=field.attr("name");if(field.is(":checkbox")&&resque!=="false"&&(name===undefined||name.indexOf("[")===-1)){field.prop("checked",true);}else{if(field.is(":checkbox")&&resque==="false"&&(name===undefined||name.indexOf("[")===-1)){field.prop("checked",false);}else{if(field.is(":radio")){if(field.val()===resque){field.prop("checked",true);}}else{if(name===undefined||name.indexOf("[")===-1){field.val(resque);}else{resque=resque.split(",");field.val(resque);}}}}},bindSaveDataImmediately:function(field,prefix){var self=this;if("onpropertychange" in field){field.get(0).onpropertychange=function(){self.saveToBrowserStorage(prefix,field.val());};}else{field.get(0).oninput=function(){self.saveToBrowserStorage(prefix,field.val());};}if(this.isCKEditorExists()){var editor=CKEDITOR.instances[field.attr("name")]||CKEDITOR.instances[field.attr("id")];if(editor){editor.document.on("keyup",function(){editor.updateElement();self.saveToBrowserStorage(prefix,field.val());});}}},saveToBrowserStorage:function(key,value,fireCallback){var self=this;var callback_result=self.options.onBeforeSave.call(self);if(callback_result!==undefined&&callback_result===false){return;}fireCallback=fireCallback===undefined?true:fireCallback;this.browserStorage.set(key,value);if(fireCallback&&value!==""){this.options.onSave.call(this);}},bindSaveDataOnChange:function(field){var self=this;field.change(function(){self.saveAllData();});},saveDataByTimeout:function(){var self=this;var targetForms=self.targets;setTimeout((function(){function timeout(){self.saveAllData();setTimeout(timeout,self.options.timeout*1000);}return timeout;})(targetForms),self.options.timeout*1000);},bindReleaseData:function(){var self=this;self.targets.each(function(){var target=$(this);var formIdAndName=getElementIdentifier(target);$(this).bind("submit reset",function(){self.releaseData(formIdAndName,self.findFieldsToProtect(target));});});},manuallyReleaseData:function(){var self=this;self.targets.each(function(){var target=$(this);var formIdAndName=getElementIdentifier(target);self.releaseData(formIdAndName,self.findFieldsToProtect(target));});},releaseData:function(targetFormIdAndName,fieldsToProtect){var released=false;var self=this;params.started[self.getInstanceIdentifier()]=false;fieldsToProtect.each(function(){if($.inArray(this,self.options.excludeFields)!==-1){return true;}var field=$(this);var prefix=(self.options.locationBased?self.href:"")+targetFormIdAndName+getElementIdentifier(field)+self.options.customKeySuffix;self.browserStorage.remove(prefix);released=true;});if(released){self.options.onRelease.call(self);}}};}return{getInstance:function(identifier){if(!params.instantiated[identifier]){params.instantiated[identifier]=init();params.instantiated[identifier].setInstanceIdentifier(identifier);params.instantiated[identifier].setInitialOptions();}if(identifier){return params.instantiated[identifier];}return params.instantiated[identifier];},free:function(){params={instantiated:[],started:[]};return null;},version:"1.1.2"};})();})(jQuery);