var base; var jsPath='js/'; // jquery/jquery-1.7.1.min.js /*! jQuery v1.7.1 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);// jquery/jquery_no_conflict.js jQuery.noConflict();// sjs/sjs.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require * @use sjs.Debug * @optional **/ (function() { var Class = { /* * Each new class(and its instances) has following: * * Properties * parent : points to the object where the class is originaly created * * Methods * extend : a way to add more functionality * toString : give the class path and its name * instances : return the count of the instances of the class * classInstance: return the class (only for instances) * * If the new class has method initialize it will be used * for initialization of each instance of the class * */ create : function(classPath, props, prv, rewrite) { if (!classPath) { this.log('classPath is missing'); } else if (this.getClass(classPath) && !rewrite) { this.log(classPath+' already exists'); } else { var classPath_arr = classPath.split('.'); var className = classPath_arr.pop(); var s_count = 0; var parent; if (classPath_arr.length) { parent = this.getClass(classPath_arr); // create the parent of the class is not existing if (!parent) { var path = '', tmp_className, tmp_class; while (classPath_arr.length) { tmp_className = classPath_arr.shift(); if (path.length) { path += '.'; } path += tmp_className; tmp_class = this.getClass(path); if (!tmp_class) { tmp_class = this.create(path); } } parent = tmp_class; } } parent = parent || window; function toString(name) { return (parent != window ? parent + '.' : '') + (name || className); }; // create the class var cls = parent[className] = function () { // PRIVATE PROPS this.parent = cls.parent; // PUBLIC METHODS var instance_num = s_count++; this.toString = function() { return toString(className + instance_num); }; this.classInstance = function() { return cls; }; this.instances = function() { return cls.instances(); }; this.extend = cls.extend; // call constructor of the class if (cls.initialize) { try { cls.initialize.apply(this, arguments); } catch (error) { var e = error.description || error; Class.log(e); } } return this; }; // STATIC PROPS cls.parent = parent; // STATIC METHODS cls.toString = toString; cls.extend = function(obj, rewrite) { for (var prop in obj) { if (rewrite || this[prop] === undefined) { this[prop] = obj[prop]; } else { var e = 'WARNING: "'+prop+'" already exists!'; this.log(e); } } return this; }; cls.instances = function() { return s_count; }; // add static props and methods or rewrite the predefined ones cls.extend(props, true); return cls; } }, getClass : function(classPath) { var path_arr; if (String(typeof(classPath)).toLowerCase() == 'string') { path_arr = classPath.split('.'); } else if (classPath.length) { // is array path_arr = classPath; } else { return false; } var parent = window; for (var i = 0, len = path_arr.length; i < len; i++) { parent = parent[path_arr[i]]; if (!parent) { return false; } } return parent; }, log : function(e, skipAlert) { if (window.sjs && window.sjs.Debug) { $logError(e); } else if (window.console) { // firebug window.console.log(e); } else if (!skipAlert){ alert(e); } } }; var userAgent = navigator.userAgent.toLowerCase(); Class.create('sjs', { isPageLoaded : false, base : window.base || '', jsPath : window.jsPath || 'js/', cssPath : window.cssPath || 'css/', browser : { version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], safari: /webkit/.test(userAgent), opera: /opera/.test(userAgent), msie: /msie/.test(userAgent) && !/opera/.test(userAgent), msie6: /msie 6/.test(userAgent) && !/opera/.test(userAgent), msie7: /msie 7/.test(userAgent) && !/opera/.test(userAgent), mozilla: /mozilla/i.test(userAgent) && !/(compatible|webkit)/.test(userAgent), firefox: /firefox/i.test(userAgent) }, onLoad : function() { $log(this+'.onLoad'); this.isPageLoaded = true; }, create : function() { return Class.create.apply(Class, arguments) } }); })();// sjs/ShortcutCall.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.ShortcutCall', { // PUBLIC STATIC METHODS add : function(shortcut, target, method) { var t = target; var m = method; var shortcuts = typeof(shortcut) == 'string' ? [shortcut] : shortcut; var len = shortcuts.length; for (var i = 0; i < len; i++) { window['$'+shortcuts[i]] = function(shortcut) { try { return (typeof(m) == 'string' ? t[m] : m).apply(t, arguments); } catch (error) { try { $logError('WARNING: shortcut "'+shortcuts+'" delegate error on method '+t+'.'+m+ '; description: '+(error.description || error)); } catch(e) {}; } }; } }, remove : function(shortcut) { var s = _get(shortcut); if (s) { delete s; } else { delete this.shotcuts[shortcut]; } }, disable : function() { var s = _get(shortcut); if (s) { _shotcuts[shortcut] = s; delete s; } }, enable : function() { var s = _get(shortcut); if (s) { _shotcuts[shortcut] = s; delete s; } } }); // PRIVATE STATIC VARS var _shotcuts = {}; // PRIVATE STATIC METHODS function _get(shortcut, local) { return local ? _shotcuts['$'+shortcut] : window['$'+shortcut]; }; function _delete(shortcut) { delete window['$'+shortcut]; }; sjs.ShortcutCall.add('shortcut', sjs.ShortcutCall, 'add'); })();// sjs/Delegate.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.ShortcutCall * @use sjs.Utils, sjs.Debug * @optional **/ (function() { sjs.create('sjs.Delegate', { /** * @param target object or null for window * @param method string or function * @param ...rest arguments that will be passed to the method on every call * * @return function * * @usage: * var obj = { * name : 'testObject', * method : function() { * alert(this.name+'.method'); * for (var i = 0; i < arguments.length; i++) { * alert('arg'+i+'='+arguments[i]); * } * } * } * var delegate = $delegate(obj, 'method', 1, 2); * //var delegate = Delegate.create(obj, 'method', 1, 2); * delegate(3, 4); **/ create : function(target, method) { var t = target; var m = method; var args = []; for (var i = 2; i < arguments.length; i++) { args.push(arguments[i]); } return function() { var arr = [].concat(args); for (var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); } try { switch (typeof(m)) { case "string": return ($element(t)[m] || eval(m)).apply($element(t), arr); case "function": return m.apply($element(t), arr); default: if (sjs.Debug) { $logError('WARNING: Delegate.create unexpected method type: '+typeof(m)); } } } catch (error) { if (sjs.isPageLoaded && sjs.Debug) { $logError('ERROR in '+t+'.'+m+' => '+(error.description || error)); } } return null; }; } }); if ($shortcut) { $shortcut(['d', 'delegate'], sjs.Delegate, 'create'); } })();// sjs/Objects.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use * @optional **/ (function() { sjs.create('sjs.Objects', { // PUBLIC STATIC METHODS each : function(obj, method, target) { if (typeof(obj) == 'object') { for (var prop in obj) { if (typeof(obj[prop]) != 'function') { var result = method.apply(target || obj, [prop, obj[prop], obj]); if (result !== null && result !== undefined) { return result; } } } } }, copy : function(fromObj, toObj, includeMethods) { if (!toObj) { toObj = {}; } for (var prop in fromObj) { if (includeMethods || typeof(fromObj[prop]) != 'function') { toObj[prop] = fromObj[prop]; } } return toObj; } }); })();// sjs/Arrays.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use sjs.Objects * @optional **/ (function() { sjs.create('sjs.Arrays', { copyArray : function(arr) { var a = []; for (var i = 0; i < arr.length; i++) { a[i] = arr[i]; } return a; }, isArray : function(arr) { return typeof(arr) == "object" && arr.length !== null; }, inArray : function(arr, val) { var result = sjs.Objects.each( arr, function(prop, value, obj) { if (value == val) { return true; } } ); return result || false; }, createPhpArray : function(arrName, arr) { sjs.Objects.each( arr, function(num, value, arr) { arr[i] = encodeURI(value).replace('&', '%26'); } ); return requestData = arrName+'[]='+arr.join('&'+arrName+'[]='); }, indexOf : function(arr, value) { var len = arr.length; for (var i = 0; i < len; i++) { if (arr[i] === value) { return i; } } return null; }, shuffle : function(a, b, c, d) { //array,placeholder,placeholder,placeholder c = a.length; while(c) { b = Math.random() * c-- | 0, d=a[c], a[c]=a[b], a[b]=d; } } }); })();// sjs/Strings.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require init * use * @optional **/ (function() { sjs.create('sjs.Strings', { // PUBLIC STATIC METHODS htmlEntities : function(str) { str = String(str); var len = chars.length; for (var i = 0; i < len; i++) { var myRegExp = new RegExp(); myRegExp.compile(chars[i],'g'); str = str.replace(myRegExp, '&' + entities[i] + ';'); } return str; }, trim : function(str) { if (arguments.length < 2) { arguments[1] = '\\s'; } for (var i = 1; i < arguments.length; i++) { str = String(str).replace(new RegExp().compile(String('^' + String(arguments[i]) + '+|' + String(arguments[i]) + '+$'),'g'), ''); } return str; }, ltrim : function(str) { return str.replace(/^\s+/, ''); }, rtrim : function(str) { return str.replace(/\s+$/, ''); }, upperFirst : function(str) { return str.slice(0, 1).toUpperCase()+str.slice(1); }, isValidEmail : function(str) { return !!str.match(/\w+@\w+\.\w+/); }, zeroPad : function(str, num, zeroChar) { if (zeroChar == null || !zeroChar.length) zeroChar = '0'; var result = String(str); var len = result.length; for (var i = 0; i < num-len; i++) { result = zeroChar + result; } return result; }, getNumberFromString : function(val) { val = String(val); var c; var firstDot = true; var str=""; var len = val.length; for (var i = 0; i 0) { str += '.0'; } if (n > 0) { var str_arr = str.split('.'); str_arr[1] = str_arr[1].slice(0, Math.min(str_arr[1].length, n)); while (str_arr[1].length < n) { str_arr[1] += '0'; } str = str_arr.join('.'); } return str; }, cssToObj : function(str) { var cssObj = {}; var cssArr = str.split(';'); var prop_arr; var propName_arr; for (var i = 0, len = cssArr.length; i < len; i++) { if (i == 0) { cssArr[i] = this.trim(cssArr[i], '{'); } else if (i == len-1) { cssArr[i] = this.trim(cssArr[i], '}'); } cssArr[i] = this.trim(cssArr[i]); if (cssArr[i].length) { prop_arr = cssArr[i].split(':'); if (prop_arr[0].indexOf('-') != -1) { propName_arr = prop_arr[0].split('-'); prop_arr[0] = propName_arr[0] + this.upperFirst(propName_arr[1]); } cssObj[this.trim(prop_arr[0])] = this.trim(prop_arr[1]); } } return cssObj; } }); // PRIVATE STATIC VARS var chars = [ '&','à','á','â','ã','ä','å','æ','ç','è','é', 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô', 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À', 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë', 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö', 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\"','ß','<', '>','¢','£','¤','¥','¦','§','¨','©','ª','«', '¬','­','®','¯','°','±','²','³','´','µ','¶', '·','¸','¹','º','»','¼','½','¾' ]; var entities = [ 'amp','agrave','aacute','acirc','atilde','auml','aring', 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave', 'iacute','icirc','iuml','eth','ntilde','ograve','oacute', 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc', 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc', 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute', 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde', 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave', 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig', 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml', 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn', 'sup2','sup3','acute','micro','para','middot','cedil','sup1', 'ordm','raquo','frac14','frac12','frac34' ]; })();// sjs/Numbers.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use * @optional **/ (function() { sjs.create('sjs.Numbers', { // PUBLIC STATIC METHODS isNumber : function(num) { return !(isNaN(num) || !String(num).length); }, getNumberBtw : function(num, min, max) { return Math.min(Math.max(num, min), max); }, isNumberBtw : function(num, min, max) { return num >= min && num <= max; } }); })();// sjs/MouseEvent.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use sjs.Utils * @optional **/ (function() { sjs.create('sjs.MouseEvent', { // CONSTRUCTOR initialize : function(e) { e = window.event || e; // PRIVATE VARS var oldToString = this.toString; // PUBLIC VARS this.x = (sjs.Utils.isIE() ? sjs.Utils.getPageXScroll() : 0) + (e.pageX || e.clientX); this.y = (sjs.Utils.isIE() ? sjs.Utils.getPageYScroll() : 0) + (e.pageY || e.clientY); this.offsetX = e.offsetX || e.layerX; this.offsetY = e.offsetY || e.layerY; this.target = e.target || e.srcElement; this.delta = 0; // wheel if (e.wheelDelta) { // IE/Opera. this.delta = e.wheelDelta/120; // In Opera 9, delta differs in sign as compared to IE. if (window.opera) { this.delta = -delta; } } else if (e.detail) { // Mozilla case. // In Mozilla, sign of delta is different than in IE. Also, delta is multiple of 3. this.delta = -e.detail/3; } // PUBLIC METHODS this.toString = function() { return oldToString()+':{ x:'+this.x+' y:'+this.y+' offsetX:'+this.offsetX+' offsetY:'+this.offsetY+' delta:'+this.delta+' target:'+this.target+' }'; } } }); })();// sjs/Cookies.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.ShortcutCall * @use * @optional **/ (function() { sjs.create('sjs.Cookies', { getCookie : function(name) { if (typeof(name) != 'string') { return document.cookie; } var start = document.cookie.indexOf(name + '='); var len = start + name.length + 1; //if (start && name != document.cookie.substring(0, name.length)) return null; if (start == -1) { return null; } var end = document.cookie.indexOf(';', len); if (end == -1) { end = document.cookie.length; } return unescape(document.cookie.substring(len, end)); }, setCookie : function(name, value, expires, path, domain, secure) { var today = new Date(); today.setTime(today.getTime()); expires = (expires || 365)*1000*60*60*24; var expires_date = new Date(today.getTime() + expires); document.cookie = name + '=' + escape(value) + (expires ? ';expires='+expires_date.toGMTString() : '') + (path ? ';path=' + path : '') + (domain ? ';domain=' + domain : '') + (secure ? ';secure' : ''); }, deleteCookie : function(name, path, domain) { if (getCookie(name)) { document.cookie = name + '=' + (path ? ';path=' + path : '') + (domain ? ';domain=' + domain : '') + ';expires=Thu, 01-Jan-1970 00:00:01 GMT'; } } }); if ($shortcut) { $shortcut('cookie', sjs.Cookies, function() { return sjs.Cookies[arguments.length < 2 ? 'getCookie' : 'setCookie'].apply(sjs.Cookies, arguments); }); } })();// sjs/Box.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use sjs.Utils, sjs.Debug * @optional **/ (function() { sjs.create('sjs.Box', { initialize : function(el, xMin, xMax, yMin, yMax) { this.xMin = xMin || 0; this.xMax = xMax || 0; this.yMin = yMin || 0; this.yMax = yMax || 0; if (el) { var x = sjs.Utils.getElementX(el); var y = sjs.Utils.getElementY(el); var w = sjs.Utils.getElementWidth(el); var h = sjs.Utils.getElementHeight(el); this.xMin = x; this.xMax = x+w; this.yMin = y; this.yMax = y+h; } this.toString = function() { return '{ xMin:'+this.xMin+', xMax:'+this.xMax+', yMin:'+this.yMin+', yMax:'+this.yMax+' }'; }; this.combine = function(box) { if (box) { return new Box( null, Math.min(this.xMin, box.xMin), Math.max(this.xMax, box.xMax), Math.min(this.yMin, box.yMin), Math.max(this.yMax, box.yMax) ); } $log('ERROR: undefined box: '+box); return null; }; this.intersect = function(box) { if (box) { return new Box( null, Math.max(this.xMin, box.xMin), Math.min(this.xMax, box.xMax), Math.max(this.yMin, box.yMin), Math.min(this.yMax, box.yMax) ); } $log('ERROR: undefined box: '+box); return null; }; this.hitTest = function(point) { return point.x >= this.xMin && point.x <= this.xMax && point.y >= this.yMin && point.y <= this.yMax; }; } }); })();// sjs/Styles.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.ShortcutCall * @use sjs.Strings, sjs.Utils * @optional **/ (function() { sjs.create('sjs.Styles', { // PUBLIC STATIC METHODS setStyles : function(el, styles) { for (var i = 0; i < styles.length; i++) { $style(el, styles[i][0], styles[i][1]); } }, setStyle : function(el, style, value) { el = $element(el); if (el && el.style) { el.style[style] = value; } }, getStyle : function(el, style) { el = $element(el); style = String(style).toLowerCase(); if (el && el.currentStyle) { return el.currentStyle[this.formatStyle(style)]; } else if (window.getComputedStyle) { return document.defaultView.getComputedStyle(el, null).getPropertyValue(style); } else if (el.style) { return el.style[this.formatStyle(style)]; } return null; }, formatStyle : function(str) { var _arr = str.split("-"); for (var i = 1, len = _arr.length; i < len; i++) { _arr[i] = sjs.Strings.upperFirst(_arr[i]); } return _arr.join(''); }, styleToNum : function(val) { val = String(val); var c; var str = ''; var len = val.length; for (var i = 0; i -1) ? q.indexOf('&', startIndex) : q.length; if (q.length > 1 && startIndex > -1) { return q.substring(q.indexOf('=', startIndex)+1, endIndex); } } return ''; }, getQueryObj : function(str) { var q = str || document.location.search || document.location.hash || document.location.href.hash; if (!q.indexOf('?')) q = q.substr(1); var obj = {}; if (q) { var arr = q.split('&'); var arr1; for (var i = 0,len = arr.length; i < len; i++) { arr1 = arr[i].split('='); if (arr1[0].indexOf('?') != -1) { arr1[0] = arr1[0].substr(arr1[0].indexOf('?')+1); } obj[arr1[0]] = arr1[1]; } } return obj; }, isLocal : function() { return document.location.href.indexOf('file:') == 0; }, // CUSTOMIZING // even/odd styling stripe : function(layer, tags, evenClass, oddClass, everyN, oddIsFirst, leaveHeights) { if (!everyN) everyN = 1; var even = oddIsFirst; var mainObj; if (!(mainObj = $element(layer))) { return; } if (!evenClass) { evenClass = 'even'; } if (!oddClass) { oddClass = 'odd'; } var elements = this.getElementsIn(mainObj, tags, 0); var el; var tmp = []; var maxH = 0; for (var i = 0; i < elements.length; i++) { el = elements[i]; if (!(i%everyN)) { even = !even; el.style.clear = 'left'; } else { el.style.clear = ''; } el.className = even ? evenClass : oddClass; if (!leaveHeights) { $style(el, 'height', this.isIE6() ? 0 : 'auto'); //$style(el, 'height', 'auto'); if (el.style.clear == 'left') { for (var n = 0; n < tmp.length; n++) { $style(tmp[n], 'height', maxH+'px'); } tmp = []; maxH = 0; } maxH = Math.max(this.getElementHeight(el), maxH); //Debug.log(el.innerHTML+' '+this.getElementHeight(el)+' '+maxH); tmp.push(el); } } }, getElementsIn : function(obj, tags, depth, elements) { if (!elements) { elements = []; } if (!depth) { depth = 0; } var els = obj.getElementsByTagName(tags[depth]); if (tags[depth+1]) { for (var i = 0; i < els.length; i++) { elements = arguments.callee(els[i], tags, depth+1, elements); } } else { for (var i = 0; i < els.length; i++) { elements.push(els[i]); } } return elements; }, // OTHERS // remove the flickering fixBgImageCache : function() { try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} } }); sjs.Utils.fixBgImageCache(); if ($shortcut) { $shortcut(['e', 'element'], sjs.Utils, 'element'); $shortcut('body', sjs.Utils, 'getBody'); $shortcut('stripe', sjs.Utils, 'stripe'); $shortcut('head', sjs.Utils, 'getHead'); $shortcut('html', sjs.Utils, function(){ if (arguments.length == 1) { return sjs.Utils.getHtml.apply(sjs.Utils, arguments); } else { sjs.Utils.setHtml.apply(sjs.Utils, arguments); } }); } })();// sjs/Events.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Utils, sjs.Delegate * @use sjs.Arrays, sjs.Debug * @optional **/ (function() { sjs.create('sjs.Events', { // PUBLIC STATIC METHODS addEvent : function(objName, eventName, method) { //$log(this+'.addEvent objName='+objName+' eventName='+eventName); if (!getRealObj(objName)) { return null; } var eObj = getEventObj(objName, eventName); var id = eObj.ids++; eObj.methods.push({ id:id, method:method }); return id; }, removeEvent : function(objName, eventName, id) { var eObj = getEventObj(objName, eventName); var len = eObj.methods.length; for (var i = 0; i < len; i++) { if (id == eObj.methods[i].id) { eObj.methods.splice(i, 1); if (!eObj.methods.length) { var rObj = getRealObj(objName); var obj = getObj(objName); // remove event rObj[eventName] = null; obj[eventName] = null; // remove object if no other events var haveEvents = false; for (var evt in obj) { if (typeof(obj[evt]) != 'function') { if (obj[evt] !== null) { haveEvents = true; break; } } } if (!haveEvents) { this.removeObj(objName); } } break; } } }, //usefull for onclick or methods that will be called last setReturnValue : function(objName, eventName, value) { var eObj = getEventObj(objName, eventName); eObj.returnValue = value; }, removeObj : function(objName) { if (objects[objName]) { var rObj = getRealObj(objName); var obj = getObj(objName); sjs.Objects.each( obj, function(prop, value, obj) { try { delete rObj[prop]; } catch (e) { rObj[prop] = null; } } ); objects[objName] = null; } }, removeAll : function() { sjs.Objects.each( objects, function(prop, value, obj) { this.removeObj(prop); }, this ); } }); // PRIVATE STATIC VARS var objects = {}; // PRIVATE STATIC METHODS function getRealObj(objName) { return $element(objName) || eval(objName); }; function getObj(objName) { if (!objects[objName]) { objects[objName] = {}; } return objects[objName]; }; function getEventObj(objName, eventName) { var obj = getObj(objName); if (!obj[eventName]) { obj[eventName] = { ids:0, methods:[], returnValue:null }; getRealObj(objName)[eventName] = $delegate(this, callEvent, objName, eventName); } return obj[eventName]; }; function callEvent(objName, eventName) { //$log(this+'.callEvent objName='+objName+' eventName='+eventName); var eObj = getEventObj(objName, eventName); var rObj = getRealObj(objName); var args = sjs.Arrays.copyArray(arguments).slice(2); var len = eObj.methods.length; for (var i = 0; i < len; i++) { eObj.methods[i].method.apply(rObj ,args); } //$log(eventName+" returnValue type: "+typeof(eObj.returnValue)); return typeof(eObj.returnValue) == "function" ? eObj.returnValue() : eObj.returnValue; }; // call sjs.onLoad function onLoad() { if (this.parent && this.parent != window && this.parent.onLoad) { this.parent.onLoad(); } }; sjs.Events.addEvent('window', 'onload', $delegate(sjs.Events, onLoad)); // memory leak if (sjs.browser.msie) { sjs.Events.addEvent('window', 'onunload', $delegate(sjs.Events, 'removeAll')); } })();// sjs/Keyboard.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require init sjs.ShortcutCall * use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Keyboard', { // PUBLIC STATIC VARS PAUsE:19, PG_UP:33, PG_DOWN:34, END:35, HOME:36, LEFT:37, UP:38, RIGHT:39, DOWN:40, PRINTSCREEN:44, INSERT:45, DELETE:46, DEL:46, ESCAPE:27, TAB:9, CAPS:20, SHIFT:16, CONTROL:17, ALT:18, SPACE:32, UNDERLINE:109, EQUALS:61, BACKSPACE:8, ENTER:13, K_0:48, K_1:49, K_2:50, K_3:51, K_4:52, K_5:53, K_6:54, K_7:55, K_8:56, K_9:57, A:65, B:66, C:67, D:68, E:69, F:70, G:71, H:72, I:73, J:74, K:75, L:76, M:77, N:78, O:79, P:80, Q:81, R:82, S:83, T:84, U:85, V:86, W:87, X:88, Y:89, Z:90, TILDA:92, WIN:91, WIN_CONTEXT:93, NUM_LOCK:144, NUM_0:96, NUM_1:97, NUM_2:98, NUM_3:99, NUM_4:100, NUM_5:101, NUM_6:102, NUM_7:103, NUM_8:104, NUM_9:105, NUM_DEVIDE:111, NUM_MULTIPLY:106, NUM_SUBTRACT:109, NUM_ADD:107, NUM_PERIOD:110, F1:112, F2:113, F3:114, F4:115, F5:116, F6:117, F7:118, F8:119, F9:120, F10:121, F11:122, F12:123, SCROLL_LOCK:145, SEMICOLON:59, COMMA:188, PERIOD:190, SLASH:191, BACK_QUOTE:192, BRACKET:219, BACK_SLASH:220, CLOSE_BRACKET:221, QUOTE:222, BACK_SLASH_LEFT:226, // PUBLIC STATIC METHODS getCode : function(name) { return this[name]; }, getCodeName : function(code) { return keys[code]; }, isKeyPressed : function(name) { var code = this.getCode(name.toUpperCase()); if (code) { var len = pressedKeys.length; for(var i = 0; i < len; i++) { if (pressedKeys[i].code == code) { return true; } } } return false; } }); // PRIVATE STATIC VARS var keys = {}; var pressedKeys = []; // PRIVATE STATIC METHODS function onKeyDown(e) { e = window.event || e; var found = false; var len = pressedKeys.length; for (var i = 0; i < len; i++) { if (pressedKeys[i].code == e.keyCode) { pressedKeys[i].count++; found = true; break; } } if (!found) { pressedKeys.push({ code:e.keyCode, count:1 }); } }; function onKeyUp(e) { e = window.event || e; var len = pressedKeys.length; for (var i = 0; i < len; i++) { if (pressedKeys[i].code == e.keyCode) { if (--pressedKeys[i].count <= 0) { pressedKeys.splice(i, 1); } break; } } }; // populate sjs.Keyboard.keys object for (var prop in sjs.Keyboard) { if (typeof(sjs.Keyboard[prop]) == 'number') { keys[sjs.Keyboard[prop]] = prop; } } // shortcuts if ($shortcut) { $shortcut(['keyboard', 'kbd'], sjs.Keyboard, function(value) { while (typeof(value) == 'function') { value = value(); } switch (typeof(value)) { case 'string': return sjs.Keyboard.getCode(value); case 'number': return sjs.Keyboard.getCodeName(value); default: return sjs.Keyboard; } }); // keyboard events sjs.Events.addEvent('document', "onkeydown", $delegate(sjs.Keyboard, onKeyDown)); sjs.Events.addEvent('document', "onkeyup", $delegate(sjs.Keyboard, onKeyUp)); } })();// sjs/Debug.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.ShortcutCall, sjs.Delegate, sjs.Events * @use sjs.Strings, sjs.Styles, sjs.Keyboard, sjs.Utils, sjs.Objects, sjs.Ajax * @optional **/ (function() { sjs.create('sjs.Debug', { // PUBLIC STATIC VARS consoleWraped : false, consoleLog : null, buffer : 500, areaBuffer : 500, showAlert : false, logErrors : true, showTime : true, showMsgNum : true, jsError : 'jsError', id : 'log', mode : 'testing', //mode : 'online', // PUBLIC STATIC METHODS log : function(msg, showAlert) { var obj = { time:new Date().getTime(), msg:msg }; if (inited && this.mode == 'testing') { this.showMsg(obj); } data.push(obj); if (data.length > this.buffer) { data.shift(); } if (showAlert || (showAlert !== false && this.showAlert)) { alert((this.showTime ? this.getTimeStr(obj.time)+' - ' : '')+obj.msg); } }, logError : function(error, props) { if (this.logErrors && sjs.Ajax) { $delegate(sjs.Ajax, 'call', $delegate(this, 'sendError', this.getLastMessages()+'\n'+error, props))(); } this.log(error); }, clear : function() { data = []; $html(this.id, ''); }, getTimeStr : function(time) { var timer = (time-initTime); var milisecs = sjs.Strings.zeroPad(timer%1000, 3); var secs = sjs.Strings.zeroPad((timer-milisecs)/1000%60, 2); var mins = sjs.Strings.zeroPad(Math.floor((timer-milisecs)/1000/60), 2); return '['+mins+':'+secs+':'+milisecs+']'; }, getLastMessages : function(num) { if (!num) { num = 5; } var logs = data.slice(Math.max(data.length-1-num, 0), data.length-1); var str = ''; var len = logs.length; for (var i = 0; i < len; i++) { str += (!i ? '' : '\n')+this.getTimeStr(logs[i].time)+': '+logs[i].msg; } return str; }, // PRIVATE STATIC METHODS initDebugger : function() { $log('initDebugger'); if (this.mode == 'testing') { bg_node = document.createElement('div'); bg_node.setAttribute('id', this.id+'_bg'); debug_node = document.createElement('div'); debug_node.setAttribute('id', this.id); $body().appendChild(bg_node); $body().appendChild(debug_node); // debug style if (sjs.Utils.isIE()) { var textStyle_obj = sjs.Strings.cssToObj(textStyle); sjs.Objects.each(textStyle_obj, function(prop, value, obj) { $style(sjs.Debug.id, prop, value); }); var textBgStyle_obj = sjs.Strings.cssToObj(textBgStyle); sjs.Objects.each(textBgStyle_obj, function(prop, value, obj) { $style(sjs.Debug.id+'_bg', prop, value); }); } else { var styleText = ' #'+this.id+' '+textStyle+'\n'; styleText += ' #'+this.id+'_bg '+textBgStyle+'\n'; var styleNode = document.createElement('style'); styleNode.setAttribute('type', 'text/css'); var styleTextNode = document.createTextNode(styleText); styleNode.appendChild(styleTextNode); $body().appendChild(styleNode); } sjs.Events.addEvent('document', 'onkeydown', $delegate(this, 'switchArea')); var len = data.length; for (var i = 0; i < len; i++) { this.showMsg(data[i]); } } inited = true; }, showMsg : function(obj) { msgNum++; var p = document.createElement('p'); var d = debug_node; if (d.childNodes.length) { d.insertBefore(p, d.childNodes[0]); } else { d.appendChild(p); } var str = (this.showMsgNum ? msgNum+': ' : '')+(this.showTime ? this.getTimeStr(obj.time)+' - ' : '')+sjs.Strings.htmlEntities(obj.msg); p.innerHTML = str; $style(p, [['lineHeight', '100%'],['margin', '0'],['fontSize', '10px'],['padding', '.5em 0 0 0']]); if (this.consoleWraped) { this.consoleLog(str); } while (d.childNodes.length > this.areaBuffer) { d.removeChild(d.lastChild); } }, switchArea : function(e) { e = window.event ? window.event : e; if ($keyboard !== null) { if (e.keyCode == $keyboard('ESCAPE')) { if ($style(this.id, 'display') != 'block') { $style(this.id, 'display', 'block'); $style(this.id+'_bg', 'display', 'block'); scrollId = sjs.Events.addEvent('window', 'onscroll', $delegate(this, 'update')); resizeId = sjs.Events.addEvent('window', 'onresize', $delegate(this, 'update')); this.update(); if (sjs.Utils.isIE6()) { sjs.Utils.hideSelects(); } } else { $style(this.id, 'display', 'none'); $style(this.id+'_bg', 'display', 'none'); sjs.Events.removeEvent('window', 'onscroll', scrollId); sjs.Events.removeEvent('window', 'onresize', resizeId); if (sjs.Utils.isIE6()) { sjs.Utils.showSelects(); } } } } }, update : function(e) { //$style(this.id+'_bg', [['left', sjs.Utils.getPageXScroll()+'px'], ['top', sjs.Utils.getPageYScroll()+'px']]); $style(this.id+'_bg', 'height', sjs.Utils.getDocumentHeight()+'px'); $style(this.id+'_bg', 'width', sjs.Utils.getDocumentWidth()+'px'); }, sendError : function(error, props) { var errAjax = new sjs.Ajax(); if (!props) { props = {}; } props.page = window.location.href; props.error = error; errAjax.post((sjs.base || '')+this.jsError, props, null, null, true); } }); // PRIVATE STATIC VARS var initTime = new Date().getTime(); var data = []; var inited = false; var msgNum = 0; var scrollId = null; var resizeId = null; var bg_node = null; var debug_node = null; // style var textStyle = '{ position:absolute; display:none; left:0; top:0; margin:0; padding:0; width:100%; height:100%; background:white; z-index:99999; text-align:left; font:14px Verdana,Arial,sans-serif; color:black; }'; var textBgStyle = '{ position:absolute; display:none; left:0; top:0; margin:0; padding:0; width:100%; height:100%; background:white; z-index:99998; }'; // shortcuts if ($shortcut) { $shortcut('log', sjs.Debug, 'log'); $shortcut('logError', sjs.Debug, 'logError'); } // firebug console integration if (window.console && window.console.log) { sjs.Debug.consoleWraped = true; sjs.Debug.consoleLog = $delegate(window.console, window.console.log); } if (!window.console) { window.console = {} } window.console.log = $delegate(sjs.Debug, 'log'); // onlaod sjs.Events.addEvent('window', 'onload', $delegate(sjs.Debug, 'initDebugger')); })();// sjs/Ajax.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.ShortcutCall * @use sjs.Utils, sjs.Objects, sjs.Delegate, sjs.Debug * @optional **/ (function (){ sjs.create('sjs.Ajax', { // CONSTRUCTOR initialize : function() { // PRIVATE PROPS var requestObj = null; // current request object var queue = []; // waiting requests var loading = false; // PUBLIC METHODS this.get = function(link, props, onSuccess, onError, leavePrev, useCache) { //$log(this+'.get link='+link+' leavePrev='+leavePrev+' useCache='+useCache); addRequest(link, props, onSuccess, onError, 'GET', null, leavePrev, useCache); }; this.post = function(link, props, onSuccess, onError, encoding, leavePrev, useCache) { //$log(this+'.get link='+link+' leavePrev='+leavePrev+' useCache='+useCache); addRequest(link, props, onSuccess, onError, 'POST', encoding, leavePrev, useCache); }; this.cancel = function() { //$log(this+'.cancel loading='+loading+' requestObj='+requestObj); if (loading && requestObj != null) { //requestObj.request.onreadystatechange = null; requestObj.request.onreadystatechange = function() {}; requestObj.request.abort(); requestObj = null; } }; // PRIVATE METHODS function addRequest(link, props, onSuccess, onError, method, encoding, leavePrev, useCache) { //$log(this+'.addRequest link='+link+' method='+method+' encoding='+encoding+' leavePrev='+leavePrev+' useCache='+useCache); var obj = { link:link, props:props, onSuccess:onSuccess, onError:onError, method:method, encoding:encoding, useCache:useCache }; // (useCache ? '' : (link.indexOf('?') == -1 ? '?' : '&')+'cache='+(new Date().getTime())); if (loading && leavePrev) { queue.push(obj); } else { if (loading) this.cancel(); loading = true; doRequest(obj); } return true; }; function doRequest(obj) { $log(this+'.doRequest link='+obj.link+' props='+this.classInstance().propsToString(obj.props)+' method='+obj.method); requestObj = obj; requestObj.request = this.classInstance().getAjax(); var req = requestObj.request; req.onreadystatechange = $delegate(this, onReadyStateChange); if (!obj.useCashe && obj.method != 'POST') { var time = new Date().getTime(); if (obj.props.cache != null) { obj.props['cache'+time] = time; } else { obj.props.cache = time; } } var props = this.classInstance().propsToString(obj.props, true); switch (obj.method) { case 'GET': if (props.length) obj.link += (obj.link.indexOf('?') == -1 ? '?' : '&')+props; req.open(obj.method, obj.link, true); sjs.Utils.isIE() ? req.send() : req.send(null); break; case 'POST': req.open(obj.method, obj.link, true); //req.setRequestHeader('Content-Encoding', 'windows-1251'); //req.setRequestHeader('If-Modified-Since', 'Thu, 01 Jan 1970 00:00:00 GMT' ); req.setRequestHeader('Method', 'POST ' + obj.link + ' HTTP/1.1'); req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset='+(obj.encoding || 'UTF-8')); req.send(props); break; } }; function onReadyStateChange() { //$log(this+'.onReadyStateChange readyState='+requestObj.request.readyState); if (requestObj == null) return; var reqObj = requestObj; var req = reqObj.request; if (req.aborted) return; if (reqObj != null && req.readyState == 4) { delete req['onreadystatechange']; requestObj = null; loading = false; var haveError = false; try { if ((req.status == 200 || (util.isLocal() && req.status == 0))) { if (typeof(reqObj.onSuccess)=='function') { reqObj.onSuccess(req, reqObj); } } else if (typeof(reqObj.onError)=='function') { haveError = true } } catch(er) { haveError = true; } if (haveError && typeof(reqObj.onError)=='function') { reqObj.onError(req, reqObj); } reqObj.xmlHttpRequest = null; // call next if (queue.length) { doRequest(queue.shift()); } else { loading = false; } } }; }, // STATIC METHODS /** * Static method which check for ajax availability * if ajax is not supported the onclick will return true and the href will be executed * * usage: * link.onclick = $delegate(sjs.Ajax, 'call', $delegate(target, 'method')); * or * onclick="$delegate(sjs.Ajax, 'call', $delegate(target, 'method')).apply(null, arugments)" */ call : function(callback, event) { if (!this.available) { return true; } if (callback) { $delegate(window, callback, event)(); } return false; }, getAjax : function() { var req = false; if (window.XMLHttpRequest) { try { req = new XMLHttpRequest(); } catch(e) { req = false; }; } else if (window.ActiveXObject) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) { try { req = new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) { req = false; }; }; }; return req; }, propsToString : function(props, encode) { //$log('propsToString props='+props+' encode='+encode); var str = ''; var tmp_str = ''; var type; for (var prop in props) { type = typeof(props[prop]); switch (type.toLowerCase()) { case 'string': case 'number': str += (str.length ? '&' : '')+this.formatVar(prop, props[prop], encode); break; case 'object': tmp_str = this.formatObject((encode ? encodeURIComponent(prop) : prop), props[prop], encode, props[prop] instanceof Array); if (tmp_str.length) { str += (str.length ? '&' : '')+tmp_str; } } } return str; }, formatVar : function(prop, value, encode, onlyValue) { //$log('formatVar prop='+prop+' value='+value+' encode='+encode+' onlyValue='+onlyValue); return encode ? (onlyValue ? prop : encodeURIComponent(prop))+'='+encodeURIComponent(value) : prop+'='+value; }, formatObject : function(prop, props, encode, isArray) { //$log('formatObject prop='+prop+' props='+props+' encode='+encode+' isArray='+isArray); var type; var str = ''; for (var prop in props) { type = typeof(props[prop]); switch (type.toLowerCase()) { case 'string': case 'number': str += (str.length ? '&' : '')+this.formatVar(prop+(isArray ? '[]' : '['+(encode ? encodeURIComponent(prop) : prop)+']'), props[prop], encode, true); break; case 'object': str += (str.length ? '&' : '')+this.formatObject(prop+(isArray ? '[]' : '['+(encode ? encodeURIComponent(prop) : prop)+']'), props[prop], encode, true, props[prop] instanceof Array); } } return str; } }); // STATIC PROP sjs.Ajax.available = !!sjs.Ajax.getAjax(); // create shortcuts if ($shortcut) { $shortcut(['ajax', 'ajaxCall'], sjs.Ajax, 'call'); } })();// sjs/AjaxForm.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use sjs.Ajax, sjs.Utils, sjs.Delegate, sjs.Form, json2 * @optional sjs.Debug **/ (function() { sjs.create('sjs.AjaxForm', { // CONSTRUCTOR initialize : function(form, url, useJSON) { $log(this+' constructor form='+form+' url='+url+' useJSON='+useJSON); // PUBLIC VARS this.form = $element(form); this.url = url; this.ajax = new sjs.Ajax(); this.useJSON = useJSON; // PUBLIC METHODS this.getProps = function() { //$log(this+'.getProps'); var name, value, type; var props = {}; var len = this.form.elements.length; for (var i = 0; i < len; i++) { name = this.form.elements[i].name; value = ''; if (name && (name = this.classInstance().formatName(this.form.elements[i].name))) { switch (this.form.elements[i].nodeName.toLowerCase()) { case 'button': break; case 'input': type = this.form.elements[i].type; if (type == 'button' || type == 'submit') { break; } else if (type == 'radio') { value = new sjs.Form.RadioGroup(name).getIndex(); } default: if (!value.length) { value = this.form.elements[i].value; } if (!props[name]) { props[name] = []; } props[name].push(value); } } } return props; }; this.send = function(url, success, error, prop, useJSON) { $log(this+'.send url='+url+' prop='+prop+' useJSON='+useJSON); var props = {}; if (prop) { if ((useJSON || this.useJSON) && window.JSON != null) { props[prop||'formData'] = JSON.stringify(this.getProps()); } else { props[prop] = this.getProps(); } } this.ajax.post(url || this.url, props, success, error); }; }, // PUBLIC STATIC METHODS formatName : function(name) { return name.replace(/\[\]/i, ''); } }); })();// sjs/Xml.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use * @optional **/ (function() { sjs.create('sjs.Xml', { // PUBLIC STATIC METHODS getRoot : function(_xml) { return this.getFirstChild(_xml); }, getFirstChild : function(_node) { if (_node && _node.childNodes) { for (var i = 0; i < _node.childNodes.length; i++) { switch (_node.childNodes[i].nodeType) { case 1: // node case 4: // CDATA return _node.childNodes[i]; } } } return null; }, getNextSibling : function(_node) { while (_node.nextSibling != null) { _node = _node.nextSibling; if (_node.nodeType == 1) break; } return _node; }, getPrevSibling : function(_node) { while (_node.previousSibling != null) { _node = _node.previousSibling; if (_node.nodeType == 1) break; } return _node; }, removeVersion : function(str) { return str.substr(str.indexOf("<", str.indexOf("?>"))); }, nodeToString : function(_node) { var node = document.createElement("div"); node.appendChild(_node.cloneNode(true)); return node.innerHTML; }, getNodeByNodeName : function(_node, nodeName) { for (_node = _node.firstChild; _node !== null; _node = _node.nextSibling) { if (_node.nodeName == nodeName) { return _node; } } return null; }, getNodesByNodeName : function(_node, nodeName, start, limit) { var result = []; var count = 0; var len = _node.childNodes.length; start = Math.max(0, start || 0); limit = Math.max(0, limit || len); for (var i = 0; i < len; i++) { if (_node.childNodes[i].nodeName == nodeName) { count++; if (++count >= start && result.length < len) { result.push(_node.childNodes[i]); if (result.length >= len) { break; } } } } return result; }, getNodeByAttribute : function(_node, attr) { for (_node = _node.firstChild; _node !== null; _node = _node.nextSibling) { if (this.getAttributeValue(_node, attr) != null) { return _node; } } return null; }, getNodesByAttribute : function(_node, attr, start, limit) { var result = []; var count = 0; var len = _node.childNodes.length; start = Math.max(0, start || 0); limit = Math.max(0, limit || len); for (var i = 0; i < len; i++) { if (this.getAttributeValue(_node.childNodes[i], attr) !== null) { count++; if (++count >= start && result.length < len) { result.push(_node.childNodes[i]); if (result.length >= len) { break; } } } } return result; }, getNodeByAttributeValue : function(_node, attr, value) { for (_node = _node.firstChild; _node !== null; _node = _node.nextSibling) { if (this.getAttributeValue(_node, attr) == value) { return _node; } } return null; }, getNodesByAttributeValue : function(_node, attr, value, start, limit) { var result = []; var count = 0; var len = _node.childNodes.length; start = Math.max(0, start || 0); limit = Math.max(0, limit || len); for (var i = 0; i < len; i++) { if (this.getAttributeValue(_node.childNodes[i], attr) === value) { count++; if (++count >= start && result.length < len) { result.push(_node.childNodes[i]); if (result.length >= len) { break; } } } } return result; }, getAttributeValue : function(_node, attr) { return _node.attributes[attr].value; } }); })();// sjs/Form.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Delegate, sjs.Utils, jquery * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Form', { initialize : function(form) { //$log(this+' form='+form); this.form = (typeof(form) == 'string') ? document.forms[form] : form; this.elementsCount = function() { return this.form.elements.length; }; this.element = function(num) { return this.form.elements[num]; }; this.preserveFieldsValues = function() { //$log('preserveFieldsValues form='+form); var inputs = this.form.getElementsByTagName('input'); for (var i in inputs) { switch (inputs[i].type) { case 'text': inputs[i].onfocus = $d(sjs.Form, 'onInputFocus', inputs[i], inputs[i].value); inputs[i].onblur = $d(sjs.Form, 'onInputBlur', inputs[i], inputs[i].value); break; } } var areas = this.form.getElementsByTagName('textarea'); for (var i in areas) { areas[i].onfocus = $d(sjs.Form, 'onInputFocus', areas[i], areas[i].value); areas[i].onblur = $d(sjs.Form, 'onInputBlur', areas[i], areas[i].value); } }; }, onInputFocus : function(input, value) { //$log(this+'.onInputFocus input='+input+' value='+value); if (input.value == value) { input.value = ''; } }, onInputBlur : function(input, value) { //$log(this+'.onInputBlur input='+input+' value='+value); if (!input.value.length) { input.value = value; } }, initOverLabels : function() { //$log('initOverLabels'); if (!document.getElementById) { return; } var labels, id, field; // Set focus and blur handlers to hide and show labels with 'overlabel' class names. labels = document.getElementsByTagName('label'); for (var i = 0; i < labels.length; i++) { if (labels[i].className == 'overlabel') { // Skip labels that do not have a named association with another field. id = labels[i].htmlFor || labels[i].getAttribute('for'); field = document.getElementById(id); if (!id || !field) { continue; } this.initOverLabel(labels[i]); } } }, initOverLabel : function(label) { //$log('initOverLabel label='+label); var hideLabel = function(field_id, hide) { var field_for; var labels = document.getElementsByTagName('label'); for (var i = 0; i < labels.length; i++) { field_for = labels[i].htmlFor || labels[i].getAttribute('for'); if (field_for == field_id) { labels[i].style.textIndent = (hide) ? '-10000px' : '0px'; return true; } } }; // Skip labels that do not have a named association with another field. id = label.htmlFor || label.getAttribute('for'); field = document.getElementById(id); // Change the applied class to hover the label over the form field. label.className = 'overlabel_apply'; // Hide any fields having an initial value. if (field.value !== '') { hideLabel(field.getAttribute('id'), true); } // Set handlers to show and hide labels. field.onfocus = function () { hideLabel(this.getAttribute('id'), true); }; field.onblur = function () { if (this.value === '') { hideLabel(this.getAttribute('id'), false); } }; // Handle clicks to LABEL elements (for Safari). label.onclick = function () { var id, field; id = this.getAttribute('for'); if (id && (field = document.getElementById(id))) { field.focus(); } }; } }); })();// sjs/Form/Select.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Delegate, sjs.Utils, jquery * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Form.Select', { // CONSTRUCTOR initialize : function(select, triggerHtml) { //$log(this+' select='+select); // PUBLIC VARS this.select = $(select); this.triggerHtml = triggerHtml || this.classInstance().triggerHtml; // PUBLIC METHODS this.removeOptions = function() { //$log(this+'.removeOptions'); var optionsCount = this.select.length; for (var i = 0; i < optionsCount; i++) { this.removeOption(0); } }; this.removeOption = function(index) { //$log(this+'.removeOption index='+index); var optionsCount = this.select.remove(index); }; this.getOption = function(pos) { return new sjs.Form.Option(null, this.select.options[pos]); }; this.addOptions = function(options, pos) { //$log(this+'.addOptions option='+options+' pos='+pos); var count = options.length; for (var i = 0; i < count; i++) { this.addOption(options[i], (pos||0)+i); } }; this.addOption = function(option, pos) { //$log(this+'.addOption option='+option+' pos='+pos); pos = pos == null ? this.select.length : Math.max(0, Math.min(pos||0, this.select.length)); switch (option.constructor) { case window.Option: break; case sjs.Form.Option: option = option.option; break; default: if (typeof(option) == 'object') { option = new sjs.Form.Option(option).option; } else { throw(this+'.addOption: bad option: '+option); } } try { // standards compliant; doesn't work in IE this.select.add(option, this.select.options[pos]); } catch(e) { // IE only this.select.add(option, pos); } return this.select.options[pos]; }; this.skin = function(triggerSelect, optionSelect, triggerHtml) { var select = $(this.select); select.hide().after(triggerHtml || this.triggerHtml); var htmlSelect = select.next(); htmlSelect.attr('id', 'select_'+select.attr('name')); htmlSelect.find('.select_trigger').attr('onclick', "$d(window, '"+triggerSelect+"', '"+select.attr('name')+"')()"); var options = select.find('option'); var optionsCount = options.length; var htmlOptions = htmlSelect.find('.select_options'); var optionHtml = htmlOptions.html(); htmlOptions.empty(); var attrCount, attrName, attrValue, optionClass, attrsCount, isSelected; for (var i = 0; i < optionsCount; i++) { htmlOptions.append(optionHtml); option = htmlOptions.find('>:last-child'); optionClass = ''; attrsCount = options[i].attributes.length; isSelected = false; isDisabled = false; for (var j = 0; j < attrsCount; j++) { attrName = options[i].attributes[j].name.toLowerCase(); attrValue = options[i].attributes[j].value; switch(attrName) { case 'value': option.find('.option_value').html(attrValue); break; case 'selected': isSelected = true; optionClass += (optionClass.length ? ' ' : '')+attrValue; break; case 'disabled': isDisabled = true; optionClass += (optionClass.length ? ' ' : '')+attrValue; break; case 'class': optionClass += (optionClass.length ? ' ' : '')+attrValue; break; } } option.addClass(optionClass); option.find('.option_text').html(options[i].text); option.attr('onclick', "$d(window, '"+optionSelect+"', '"+select.attr('name')+"', this, '"+options[i].text+"', "+i+", "+isDisabled+")()"); if (isSelected) { htmlSelect.find('.select_trigger').html(options[i].text); } } }; }, // PUBLIC STATIC VARS triggerHtml : '
    ' +'
  • ' +' ' +'
      ' +'
    • ' +'
    ' +'
  • ' +'
' }); })();// sjs/Form/Option.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Delegate, sjs.Utils, jquery * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Form.Option', { // CONSTRUCTOR initiallize : function(props, option) { //$log(this+' props='+props+' option='+option); // PUBLIC VARS this.option = option || new Option(); for (var prop in props) { if (typeof(props[prop]) != 'function') { switch (prop) { case 'text': case 'value': case 'disabled': case 'selected': case 'defaultSelected': case 'className': case 'id': this.option[prop] = props[prop]; break; case 'class': this.option['className'] = props[prop]; break; case 'option': break; default: //$log('WARNING: unexpected prop of option: '+prop+'='+props[prop]); } } } // PUBLIC METHODS this.getProp = function(prop) { //$log(this+'.getProp prop='+prop); return this.option[prop]; }; this.setProp = function(prop, value) { //$log(this+'.setProp prop='+prop+' value='+value); this.option[prop] = value; }; this.toObject = function() { //$log(this+'.toObject'); var attrName, attrValue; var obj = { text:this.option.text||'' }; var count = this.option.attributes.length; for (var k = 0; k < count; k++) { attrName = this.option.attributes[k].name.toLowerCase(); attrValue = this.option.attributes[k].value; switch (attrName) { case 'class': attrName = 'className'; break; case 'value': var value_arr = attrValue.split(' '); obj.type = value_arr[1]; attrValue = value_arr[0]; break; } obj[attrName] = attrValue; } return obj; }; } }); })();// sjs/Form/RadioGroup.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Delegate, sjs.Utils, jquery * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Form.RadioGroup', { // CONSTRUCTOR initialize : function(group){ //$log(this+' group='+group); // PUBLIC VARS this.group = $e(group); // PUBLIC METHODS this.getIndex = function() { var len = this.group.length; for (var i = 0; i < len; i++) { if((new sjs.Form.Radio(this.group[index])).checked()) { return i; } } return ''; }; this.value = function() { var index = this.getIndex(); var radio = new sjs.Form.Radio(this.group[index]); return radio.value(); }; } }); })();// sjs/Form/Radio.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs, sjs.Delegate, sjs.Utils, jquery * @use sjs.Debug * @optional **/ (function() { sjs.create('sjs.Form.Radio', { // CONSTRUCTOR initialize : function(radio) { //$log('Radio radio='+radio); // PUBLIC VARS this.radio = radio; // PUBLIC METHODS this.checked = function() { return this.radio.checked; }; this.value = function() { return this.radio.value; }; } }); })();// sjs/apps/Minesweeper_0.5.js /** * @author Ivan Andonov * @email: ivan.andonov[at]gmail[dot]com * * @require sjs * @use jquery, sjs.Numbers, sjs.Strings, sjs.Objects * @lastupdate **/ (function() { sjs.create('sjs.Minesweeper', { // constructor initialize : function() { // PRIVATE VARS var app = this; var initialized = false; var elements = {}; // caching of the html elements // conditional properties var gameIsStarted = false; var gameIsReady = false; var faceIsClicked = false; var mouseOverFace = false; // timer var startTime, lastTime, timerInt; var bothClickRevealTime = 200; // ms // html stuff var selectors = { // holder holder : 'div.minesweeper:eq(0)', // game game : 'div.game', head : 'div.head', mines : 'div.mines', face_btn : 'div.face-btn', face : 'div.face', timer : 'div.timer', num : 'span.num', num_prefix : 'n',// this is the 1st 'n' in numsStates num_none : 'n', // this is the 2nd 'n' in 'nn' class in numsStates // grid grid : 'table.grid:eq(0)', row : 'tr.row', cell : 'td.cell', // highscore highscore : 'div.highscore' }; var table_tmpl = '
'; var row_tmpl = ''; var cell_tmpl = ''; // css clases var borderStates = []; // css clases var faceStates = []; // css clases var cellStates = []; // css clases var numsStates = ['n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n-', 'nn']; var borderStatesObj = { // values will be copied in borderStates bIn : 'b-3d', bOut : 'b-3d-out', } for (var b in borderStatesObj) { borderStates.push(borderStatesObj[b]); } var cellStatesObj = { // values will be copied in cellStates init : 'init', none : 'none', n0 : 'n0', n1 : 'n1', n2 : 'n2', n3 : 'n3', n4 : 'n4', n5 : 'n5', n6 : 'n6', n7 : 'n7', n8 : 'n8', mine : 'mine', boom : 'boom', mark : 'mark', wrong : 'wrong' }; for (var s in cellStatesObj) { cellStates.push(cellStatesObj[s]); } var faceState; var faceStatesObj = { // values will be copied in faceStates happy : 'happy', click : 'click', sad : 'sad', win : 'win' }; for (var f in faceStatesObj) { faceStates.push(faceStatesObj[f]); } // grid var grid, gridNumbers, minesValues, emptyCellsRevealed; var minWidth = 9; var maxWidth = 30; var minHeight = 9; var maxHeight = 24; var minMines = 10; // presets var lastPreset; var defaultPreset = 'begginer'; var presets = { 'begginer' : { width: 9, height: 9, mines:10, readOnly:true }, 'intermediate' : { width:16, height:16, mines:40, readOnly:true }, 'expert' : { width:30, height:16, mines:99, readOnly:true } }; // mouse buttons var mouseButtons = { left : { down : false }, right : { down : false }, bothDown : false, lastCell : { row : - 1, col : - 1 } }; // PUBLIC VARS // PRIVATE METHODS // class attr manipulations function addClass(obj, addClasses, removeClasses) { if (typeof(addClasses) != 'object') addClasses = addClasses != null ? [addClasses] : addClasses; if (typeof(removeClasses) != 'object') removeClasses = removeClasses != null ? [removeClasses] : removeClasses; if (obj && obj.size()) { // jquery object var i, len; if (typeof(removeClasses) == 'object') { len = removeClasses.length; for (i = 0; i < len; i++) { obj.removeClass(removeClasses[i]); } } if (typeof(addClasses) == 'object') { len = addClasses.length; for (i = 0; i < len; i++) { obj.addClass(addClasses[i]); } } } }; // selectors function getElement(name, holder, index, elName, skipCache) { //$log(app+'.getElement name='+name+' holder='+holder+' index='+index+' elName='+elName+' skipCache='+skipCache); elName = elName || name; var el; if (!elements[elName] || skipCache) { elements[elName] = holder ? holder.find(selectors[name]) : jQuery(selectors[name]); if (index != null && !isNaN(index)) { elements[elName] = elements[elName].eq(index); } } return elements[elName]; }; function clearElementsCache() { elements = {}; }; function getHolder() { return getElement('holder'); }; function getGame() { return getElement('game', getHolder()); }; function getHead() { return getElement('head', getGame()); }; function getTimer() { return getElement('timer', getHead()); }; function getMinesCounter() { return getElement('mines', getHead()); }; function getFace() { return getElement('face', getHead()); }; function getGrid() { return getElement('grid', getGame()); }; function getRow(index) { // if index==null all rows var name = 'row' + (index != null && !isNaN(index) ? index : ''); return getElement('row', getGrid(), index, name); }; function getCell(rowIndex, colIndex) { // if index==null all cells var name = 'cell_' + (rowIndex != null && !isNaN(rowIndex) ? rowIndex : '') + '_' + (colIndex != null && !isNaN(colIndex) ? colIndex : ''); return getElement('cell', getRow(rowIndex), colIndex, name); }; function getHighscore() { return getElement('highscore', getHolder()); }; // actions function setFace(state, states) { states = states || faceStates; if (states.indexOf(state) != - 1) { addClass(getFace(), state, states); } else { $log('ERROR at ' + this + '.setFace(' + state + ', [' + states + ']) - posible states:' + states); } }; function setCellState(row, col, state) { //$log('setCellState row='+row+' col='+col+' state='+state); addClass(getCell(row, col), state, grid[row][col].state); grid[row][col].state = state; }; function updateMines() { var nums = getMinesCounter().find(selectors.num); var len = nums.size(); var placed = sjs.Numbers.getNumberBtw(minesValues.placed, 0, minesValues.total); var mines_left = minesValues.total - minesValues.placed; mines_left = sjs.Strings.zeroPad(mines_left, len, selectors.num_none); for (var i = 0; i < len; i++) { addClass(nums.eq(i), selectors.num_prefix + mines_left.substr(i, 1), numsStates); } }; function updateFace() { if (faceIsClicked) { setFace(mouseOverFace ? borderStatesObj.bIn : borderStatesObj.bOut, borderStates); setFace(mouseOverFace ? faceStatesObj.click : faceState); } else { setFace(borderStatesObj.bOut, borderStates); setFace(faceState || faceStatesObj.happy); } }; function resetGrid() { var preset = app.getPreset(); var cols = preset.width; var rows = preset.height; emptyCellsRevealed = 0; gridNumbers = { revealed : 0, total : 0 }; minesValues = { total : 0, placed : 0 }; grid = []; for (var r = 0; r < rows; r++) { grid[r] = new Array(cols); for (var c = 0; c < cols; c++) { grid[r][c] = { state : cellStatesObj.init, num : 0 }; } } } function generateGrid(firstCell) { $log(app+'.generateGrid firstCell='+firstCell); var addNeighbour = function (row, col, rows, cols) { if (row >= 0 && row < rows && col >= 0 && col < cols) { if (grid[row][col].num != 9) { if (!grid[row][col].num) { gridNumbers.total++; } grid[row][col].num++; return; } } }; var preset = app.getPreset(), cols = preset.width, rows = preset.height, mines = preset.mines, cells = [], len = cols * rows, num = 0, cellNum, index, col, row, name; for (var i = 0; i < len; i++) { cells[i] = i; } sjs.Arrays.shuffle(cells); while (num < mines) { cellNum = cells[num]; col = Math.floor(cellNum % cols); row = (cellNum - col) / cols; // if the cell is not a mine yet // then check for already assigned number // if no number yet then check is a neighbour of the first cell (dont place mine if it is) if (grid[row][col].num != 9 && !isNeighbour({ col : col, row : row }, firstCell)) { if (grid[row][col].num) { gridNumbers.total--; // mine is placed on a number } grid[row][col].num = 9; // 9 == mine addNeighbour(row, col + 1, rows, cols); addNeighbour(row + 1, col + 1, rows, cols); addNeighbour(row + 1, col, rows, cols); addNeighbour(row + 1, col - 1, rows, cols); addNeighbour(row, col - 1, rows, cols); addNeighbour(row - 1, col - 1, rows, cols); addNeighbour(row - 1, col, rows, cols); addNeighbour(row - 1, col + 1, rows, cols); num++; } else { // this is remove it from the array and continue cells.splice(num, 1); } } } function revealCell(row, col, event) { //$log(app + '.revealCell row=' + row + ' col=' + col); var cell = getCell(row, col); // we reveal mines before and after game is ended - we check gameIsReady coz gameIsStarted is false on first click if (gameIsReady) { if (cell.hasClass(cellStatesObj.init)) { if (isCellMine(row, col)) { setCellState(row, col, cellStatesObj.boom); onGameLose(); } else { setCellState(row, col, cellStatesObj['n' + grid[row][col].num]); if (isCellEmpty(row, col)) { emptyCellsRevealed++; revealCellNeighbours(row, col); } else { gridNumbers.revealed++; } // the game may already be over when neighbours are open if (gameIsReady) { var preset = app.getPreset(); // get last(default) preset if (gridNumbers.revealed + emptyCellsRevealed >= (preset.width * preset.height) - minesValues.total) { onGameWin(); } } } } } else if (!gameIsReady) { if (isCellMine(row, col)) { if (!cell.hasClass(cellStatesObj.mark)) { setCellState(row, col, cellStatesObj.mine); } } else if (cell.hasClass(cellStatesObj.mark)) { // here we reveal all marks that are not mines after the game is ended setCellState(row, col, cellStatesObj.wrong); } } }; function revealCellNeighbours(row, col) { //$log(app + '.revealCellNeighbours row=' + row + ' col=' + col); var n = getNeighbours(row, col); var len = n.length; for (var i = 0; i < len; i++) { if (n[i].cell.hasClass(cellStatesObj.init)) { revealCell(n[i].row, n[i].col); } } }; function revealAllMines() { var preset = app.getPreset(); var cols = preset.width; var rows = preset.height; var cell; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { cell = getCell(r, c); if ((isCellMine(r, c) && cell.hasClass(cellStatesObj.init)) || cell.hasClass(cellStatesObj.mark)) { revealCell(r, c); } } } }; function hasExactMines(row, col) { //$log(app+'.hasExactMines row='+row+' col='+col); var neededMines = grid[row][col].num; var foundMined = 0; var n = getNeighbours(row, col); var len = n.length; for (var i = 0; i < len; i++) { if (n[i].cell.hasClass(cellStatesObj.mark)) { if (++foundMined > neededMines) { return false; } } } return neededMines == foundMined; }; function getNeighbours(row, col) { //$log(app+'.getNeighbours row='+row+' col='+col); var arr = []; var preset = app.getPreset(); // row - 1 if (row > 0) { if (col > 0) arr.push({ row : row - 1, col : col - 1, cell:getCell(row - 1, col - 1) }); arr.push({ row : row - 1, col : col, cell:getCell(row - 1, col) }); if (col + 1 < preset.width) arr.push({ row : row - 1, col : col + 1, cell:getCell(row - 1, col + 1) }); } // same row if (col > 0) arr.push({ row : row, col : col - 1, cell:getCell(row, col - 1) }); if (col + 1 < preset.width) arr.push({ row : row, col : col + 1, cell:getCell(row, col + 1) }); // row + 1 if (row + 1 < preset.height) { if (col > 0) arr.push({ row : row + 1, col : col - 1, cell:getCell(row + 1, col - 1) }); arr.push({ row : row + 1, col : col, cell:getCell(row + 1, col) }); if (col + 1 < preset.width) arr.push({ row : row + 1, col : col + 1, cell:getCell(row + 1, col + 1) }); } return arr; }; function revealNeighbours(row, col) { //$log(app+'.revealNeighbours row='+row+' col='+col); var n = getNeighbours(row, col), isNumber = isCellNumber(row, col); for (var i = 0, len = n.length; i < len; i++) { if (n[i].cell.hasClass(cellStatesObj.init) && isNumber) { revealCell(n[i].row, n[i].col); } } }; function getFirstMarkedNeighbourMine(row, col) { var n = getNeighbours(row, col); for (var i = 0, len = n.length; i < len; i++) { if (isCellMine(n[i].row, n[i].col) && !n[i].cell.hasClass(cellStatesObj.mark)) { return n[i]; } } }; function updatePotentialNeighbours(row, col, show) { //$log(app+'.updatePotentialNeighbours row='+row+' col='+col+' show='+show); var n = getNeighbours(row, col); for (var i = 0, len = n.length; i < len; i++) { if (show) { if (n[i].cell.hasClass(cellStatesObj.init)) { setCellState(n[i].row, n[i].col, cellStatesObj.none); } } else { if (n[i].cell.hasClass(cellStatesObj.none)) { setCellState(n[i].row, n[i].col, cellStatesObj.init); } } } }; function updateCellState(row, col, show) { //$log(app+'.updateCellState row='+row+' col='+col+' show='+show+' left='+mouseButtons.left.down+' right='+mouseButtons.right.down); var cell; if (show) { if (mouseButtons.left.down) { cell = getCell(row, col); if (cell.hasClass(cellStatesObj.init)) { setCellState(row, col, cellStatesObj.none); } if (mouseButtons.right.down) { updatePotentialNeighbours(row, col, show); } } } else { cell = getCell(row, col); if (mouseButtons.left.down) { if (mouseButtons.lastCell.row == row && mouseButtons.lastCell.col == col && cell.hasClass(cellStatesObj.none)) { setCellState(row, col, cellStatesObj.init); } } else { if (cell.hasClass(cellStatesObj.none)) { setCellState(row, col, cellStatesObj.init); } } updatePotentialNeighbours(row, col, show); } }; function updateMouseButtonsOnUp(e) { //$log('updateMouseButtonsOnUp e='+e.which); switch (e.which) { case 1: // left if (mouseButtons.left.down) { mouseButtons.left.down = false; } break; case 3: // right if (mouseButtons.right.down) { mouseButtons.right.down = false; } break; default: } }; function isNeighbour(cell1, cell2) { return Math.abs(cell1.col - cell2.col) < 2 && Math.abs(cell1.row - cell2.row) < 2; }; function isCellNumber(row, col) { return !isCellEmpty(row, col) && !isCellMine(row, col); }; function isCellEmpty(row, col) { return grid[row][col].num == 0; }; function isCellMine(row, col) { return grid[row][col].num == 9; }; function isCellRevealed(row, col) { var cell = getCell(row, col); return !(cell.hasClass(cellStatesObj.init) || cell.hasClass(cellStatesObj.none) || cell.hasClass(cellStatesObj.mark)); }; // game events function onGameNew() { $log(app+'.onGameNew'); faceState = faceStatesObj.happy; setFace(faceState); gameIsStarted = false; stopTimer(); resetTimer(); resetGrid(); gameIsReady = true; }; function onGameStart() { $log(app+'.onGameStart'); startTimer(); gameIsStarted = true; }; function onGameEnd() { $log(app+'.onGameEnd'); stopTimer(); updateTimer(); gameIsStarted = false; gameIsReady = false; revealAllMines(); }; function onGameLose() { $log(app+'.onGameLose'); faceState = faceStatesObj.sad; setFace(faceState); onGameEnd(); }; function onGameWin() { $log(app+'.onGameWin'); faceState = faceStatesObj.win; setFace(faceState); onGameEnd(); }; // timer function resetTimer() { //$log(app+'.resetTimer'); setTimer(0); }; function updateTimer() { //$log(app+'.updateTimer'); if (lastTime <= 999) { var time = Math.round((new Date().getTime() - startTime) / 1000); if (time != lastTime) { setTimer(time); lastTime = time; } } }; function setTimer(time) { //$log(app+'.setTimer time='+time); var nums = getTimer().find(selectors.num); var len = nums.size(); var time_str = sjs.Strings.zeroPad(time, len, selectors.num_none); for (var i = 0; i < len; i++) { addClass(nums.eq(i), selectors.num_prefix + time_str.substr(i, 1), numsStates); } }; function startTimer() { //$log(app+'.startTimer'); lastTime = 0; startTime = new Date().getTime(); timerInt = setInterval(updateTimer, 100, app); }; function stopTimer() { //$log(app+'.stopTimer'); clearInterval(timerInt); }; // highscore // handlers function cellMouseUp(row, col, e) { //$log(app+'.cellMouseUp row='+row+' col='+col+' e='+e); if (gameIsReady) { updateMouseButtonsOnUp(e); updateCellState(row, col, false); // reveal neighbours if (gameIsStarted) { if (mouseButtons.bothDown) { if (isCellNumber(row, col) && hasExactMines(row, col) && isCellRevealed(row, col)) { var unmarked = getFirstMarkedNeighbourMine(row, col); if (unmarked) { revealCell(unmarked.row, unmarked.col); } else { revealNeighbours(row, col, true); } } } } // reveal cell if (e.which == 1 && !(mouseButtons.right.down || mouseButtons.bothDown)) { // left click // generate the grid if this is the first clicked cell if (getCell(row, col).hasClass(cellStatesObj.init)){ if (!gameIsStarted) { console.time('grid-generation'); //for (var i = 0; i < 100; i++) { generateGrid({ row : row, col : col }); //} console.timeEnd('grid-generation'); // start the game after first grid is generated onGameStart(); } // reveal cell revealCell(row, col); } } } }; function cellMouseDown(row, col, e) { //$log(app+'.cellMouseDown row='+row+' col='+col+' e='+e); switch (e.which) { case 1: // left mouseButtons.left.down = true; break; case 3: // right mouseButtons.right.down = true; break; default: } mouseButtons.bothDown = mouseButtons.left.down && mouseButtons.right.down; if (gameIsReady) { // update mark if (!(mouseButtons.left.down || mouseButtons.bothDown)) { var state = ''; var change = false; var cell = getCell(row, col); if (cell.hasClass(cellStatesObj.mark)) { state = cellStatesObj.init; change = true; } else if (cell.hasClass(cellStatesObj.init)) { state = cellStatesObj.mark; change = true; } if (change) { setCellState(row, col, state); // update mines counter if (state == cellStatesObj.mark) { minesValues.placed++; } else { minesValues.placed--; } updateMines(); } } updateCellState(row, col, true); } }; function cellMouseOver(row, col, e) { //$log(app+'.cellMouseOver row='+row+' col='+col+' e='+e); if (gameIsReady) { updateCellState(row, col, true); } }; function cellMouseOut(row, col, e) { //$log(app+'.cellMouseOut row='+row+' col='+col+' e='+e); mouseButtons.lastCell = { row : row, col : col }; if (gameIsReady) { updateCellState(row, col, false); } }; function cellClick(row, col, e) { //$log(app+'.cellClick row='+row+' col='+col+' e='+e); }; function cellDoubleClick(row, col, e) { //$log(app+'.cellDoubleClick row='+row+' col='+col+' e='+e); if (gameIsStarted && !(mouseButtons.right.down || mouseButtons.bothDown)) { if (isCellNumber(row, col) && hasExactMines(row, col)) { revealNeighbours(row, col); } } }; function cellRightClick(row, col, e) { //$log(app+'.cellRightClick row='+row+' col='+col+' e='+e+' left='+mouseButtons.left.down+' both='+mouseButtons.bothDown); e.preventDefault(); }; function documentMouseUp(e) { //$log(app+'.documentMouseUp e='+e+' target='+e.target+' relatedTarget='+e.relatedTarget); // face button if (faceIsClicked) { faceIsClicked = false; updateFace(); if (mouseOverFace) { app.generate(); } } // cells updateMouseButtonsOnUp(e); }; function faceMouseDown(e) { //$log(app+'.faceMouseDown e='+e+' target='+e.target+' relatedTarget='+e.relatedTarget+' which='+e.which); if (e.which === 1) { // mouse left button faceIsClicked = true; updateFace(); } }; function faceMouseLeave(e) { //$log(app+'.faceMouseLeave e='+e+' target='+e.target+' relatedTarget='+e.relatedTarget); mouseOverFace = false; if (faceIsClicked) { updateFace(); } }; function faceMouseEnter(e) { //$log(app+'.faceMouseEnter e='+e+' target='+e.target+' relatedTarget='+e.relatedTarget); mouseOverFace = true; if (faceIsClicked) { updateFace(); } }; function disableRightClick(e) { //$log(app+'.disableRightClick e='+e); e.preventDefault(); return false; }; function disableSelect(e) { //$log(app+'.disableSelect e='+e); e.preventDefault(); return false; }; // PUBLIC METHODS this.isStated = function() { return gameIsStarted; }; this.getPreset = function(preset) { lastPreset = preset || lastPreset || defaultPreset; presetObj = presets[lastPreset]; return sjs.Objects.copy(presetObj); }; this.getPresets = function() { var list = []; for (var p in presets) { if (typeof(presets[p]) == 'object') { list.push({ name : p, values : this.getPreset(p) }); } } return list; }; this.setPreset = function(name, width, height, mines) { name == name || 'random'; switch (name) { case 'begginer': case 'intermediate': case 'expert': break; case 'random': delete presets[name]; default: if (!presets[name]) presets[name] = {}; presets[name].width = sjs.Numbers.getNumberBtw(width || presets[name].width || minWidth + Math.floor(Math.random()*(maxWidth - minWidth)), minWidth, maxWidth); presets[name].height = sjs.Numbers.getNumberBtw(height || presets[name].height || minHeight + Math.floor(Math.random()*(maxHeight - minHeight)), minHeight, maxHeight); var maxMines = presets[name].width * presets[name].height - 1; presets[name].mines = sjs.Numbers.getNumberBtw(mines || presets[name].mines || minMines + Math.floor(Math.random()*(maxMines - minMines)), minMines, maxMines); } lastPreset = name; }; this.generate = function() { $log(this+'.generate'); onGameNew(); var preset = this.getPreset(); // get last(default) preset clearElementsCache(); // remove all elements from the cache mainly becouse of the cells getGrid().html(''); // remove already existing content var row, cell, table = jQuery(table_tmpl); for (var i = 0; i < preset.height; i++) { // rows row = jQuery(row_tmpl); for (var j = 0; j < preset.width; j++) { // cols cell = jQuery(cell_tmpl).addClass(cellStatesObj.init); cell.appendTo(row); cell.bind('mouseup', $delegate(cell, cellMouseUp, i, j)); cell.bind('mousedown', $delegate(cell, cellMouseDown, i, j)); cell.bind('mouseover', $delegate(cell, cellMouseOver, i, j)); cell.bind('mouseout', $delegate(cell, cellMouseOut, i, j)); cell.bind('click', $delegate(cell, cellClick, i, j)); cell.bind('contextmenu', $delegate(cell, cellRightClick, i, j)); cell.bind('dblclick', $delegate(cell, cellDoubleClick, i, j)); } row.appendTo(table); } table.appendTo(getGrid()); minesValues.total = preset.mines; minesValues.placed = 0; updateMines(); // update handlers if (!initialized) { getHolder().bind('contextmenu', disableRightClick) .bind('selectstart', disableSelect); // disable IE selecting getFace().bind('mousedown', faceMouseDown) .bind('mouseleave', faceMouseLeave) .bind('mouseenter', faceMouseEnter); jQuery(document).bind('mouseup', documentMouseUp); initialized = true; } $log(this+'.generated'); }; this.showHighscore = function() { //$log(this+'.showHighscore'); //getGame().hide(); //getHighscore().show(); }; } // PUBLIC STATIC VARS // PUBLIC STATIC METHODS }); // PRIVATE STATIC VARS // PRIVATE STATIC METHODS })();// custom/minesweeper.js if (jQuery) { (function($) { $(document).ready(function() { var app = new sjs.Minesweeper(); //app.setPreset('tacho', 15, 15, 15); //app.generate(); $('li.menu').hover( function(e) { $(this).find('.submenu-list').show(); }, function(e) { $(this).find('.submenu-list').hide(); } ); var restartBtn = $('li.restart').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.generate(); }); var begginerBtn = $('li.begginer').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.setPreset('begginer'); app.generate(); }); var intermediateBtn = $('li.intermediate').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.setPreset('intermediate'); app.generate(); }); var expertBtn = $('li.expert').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.setPreset('expert'); app.generate(); }); var randomBtn = $('li.random').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.setPreset('random'); app.generate(); }); var highscoreBtn = $('li.highscore').bind('click', function(e) { $(this).closest('.submenu-list').hide(); app.showHighscore(); }); sjs.Events.addEvent('document', 'onkeydown', function(e) { switch (e.keyCode) { case $keyboard('F2'): restartBtn.click(); break; case $keyboard('B'): begginerBtn.click(); break; case $keyboard('I'): intermediateBtn.click(); break; case $keyboard('E'): expertBtn.click(); break; case $keyboard('R'): randomBtn.click(); break; case $keyboard('H'): highscoreBtn.click(); break; default: } }); expertBtn.click(); }); })(jQuery); }