0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& !F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;Ha";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= 1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= "none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h
t -1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h =0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h =0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== 8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== "click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f -1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== "file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== 0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h 0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); (function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= l;g.sort(w);if(h)for(var i=1;i 0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p ":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- 0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n =0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& function(){var g=k,i=t.createElement("div");i.innerHTML="";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= t.createElement("div");g.innerHTML="";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h 0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e -1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e -1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, 2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, ""],legend:[1,""],thead:[1," ","
"],tr:[2,"","
"],td:[3,""],col:[2,"
"," "],area:[1,""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
"," ",""];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>$2>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f 0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===" "&&!x?r.childNodes:[];for(o=k.length- 1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/This is a p * @before $.metadata.setType("elem", "script") * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" * @desc Reads metadata from a nested script element * * @param String type The encoding type * @param String name The name of the attribute to be used to get metadata (optional) * @cat Plugins/Metadata * @descr Sets the type of encoding to be used when loading metadata for the first time * @type undefined * @see metadata() */ (function($) { $.extend({ metadata : { defaults : { type: 'class', name: 'metadata', cre: /({.*})/, single: 'metadata' }, setType: function( type, name ){ this.defaults.type = type; this.defaults.name = name; }, get: function( elem, opts ){ var settings = $.extend({},this.defaults,opts); // check for empty string in single property if ( !settings.single.length ) settings.single = 'metadata'; var data = $.data(elem, settings.single); // returned cached data if it already exists if ( data ) return data; data = "{}"; if ( settings.type == "class" ) { var m = settings.cre.exec( elem.className ); if ( m ) data = m[1]; } else if ( settings.type == "elem" ) { if( !elem.getElementsByTagName ) return undefined; var e = elem.getElementsByTagName(settings.name); if ( e.length ) data = $.trim(e[0].innerHTML); } else if ( elem.getAttribute != undefined ) { var attr = elem.getAttribute( settings.name ); if ( attr ) data = attr; } if ( data.indexOf( '{' ) <0 ) data = "{" + data + "}"; data = eval("(" + data + ")"); $.data( elem, settings.single, data ); return data; } } }); /** * Returns the metadata object for the first member of the jQuery object. * * @name metadata * @descr Returns element's metadata object * @param Object opts An object contianing settings to override the defaults * @type jQuery * @cat Plugins/Metadata */ $.fn.metadata = function( opts ){ return $.metadata.get( this[0], opts ); }; })(jQuery); CAPP_SHOP_FRONT_COMMON_UTIL = { findTargetFrame : function() { //팝업창 일경우에는 바로 opener를 반환 if (CAPP_SHOP_FRONT_COMMON_UTIL.isPopupFromThisShopFront() === true) { return window.opener; } try { var bIsIframe = false; var sUrl = document.location.pathname + document.location.search; //parent의 프레임내용에서 현재주소와 동일 url을 가진 아이프레임이 있다면 아이프레임에서 실행된것으로 판단하고 parent를 반환 $(parent.document).find('iframe').each(function() { if (sUrl === $(this).attr('src')) { bIsIframe = true; return false; }; }); if (bIsIframe === true) { return parent; } } catch(e) {} //그 이외(일반페이지, 프레임셋)에서는 현재페이지에서 이동되는것으로 함 return document; }, /** * 기존 코드와의 호환성 때문에 남겨둠 * @return bool * @deprecated */ isAdminOpener : function() { return this.isPopupFromThisShopFront(); }, /** * 현재 창이 동일 쇼핑몰 내의 프론트에서 열려진 팝업창인지 리턴 * @return bool 동일 쇼핑몰 내의 프론트에서 열려진 팝업창이면 true, 아니면 false */ isPopupFromThisShopFront : function() { try { // 팝업창이 아니면 false 리턴 if (window.opener === null) { return false; } // 현재 창의 도메인과 opener의 도메인이 다르면 false 리턴 if (window.location.host !== window.opener.location.host) { return false; } // 어드민으로부터 열려진 경우 false 리턴 var regAdminUrl = /^(\/admin\/php\/|\/disp\/admin\/)/; if (regAdminUrl.test(window.opener.location.pathname) === true) { return false; } // 프론트로부터 열려진 경우이므로 true 리턴 return true; } catch (e) { // window.opener에 접근 불가능한 케이스는 이미 본 창이 닫혔거나 도메인이 다른 것이므로 false 리턴 return false; } }, /** * url에서 파라미터 가져오기 * @param string name 파라미터명 * @return string 파라미터 값 */ getParameterByName : function (name) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regexS = "[\\?&]" + name + "=([^]*)"; var regex = new RegExp(regexS); var results = regex.exec(window.location.href); if (results == null) { return ''; } else { return decodeURIComponent(results[1].replace(/\+/g, " ")); } }, historyBack : function(sMsg) { if (typeof(sMsg) !== 'undefined' && sMsg !== '') { alert(sMsg); } if (this.isPopupFromThisShopFront() === true) { opener = window; window.close(); } else { history.back(); } } }; $(document).ready(function() { // 엔터키 감지 후 해시태그 자동완성에 대한 처리 $(this).keydown(function(event) { var oTarget = $('.autoDrop').find('li.selected'); if (event.keyCode === 13 && oTarget.length > 0) { event.preventDefault(); location.href = oTarget.children().attr('href'); } }); // 검색 input에 대한 ↑, ↓키 입력시 커서 이동 방지 $('.keyword').keydown(function(event) { if (event.keyCode === 38 || event.keyCode === 40) { event.preventDefault(); } }); FwValidator.Handler.setRequireErrorMsg('keyword', __('검색어를 입력해주세요')); var oSearchForm = $('#searchForm'); var oSearchFormKeyword = oSearchForm.find('#keyword'); var SEARCHREGISTER = { eSearchType : function() { if (this.checkSearchType() === true) { $('#except_keyword_wrap_id').show(); } else { $('#except_keyword_wrap_id').hide(); } }, eSubmit : function() { oSearchFormKeyword.removeAttr('fw-filter'); if (this.checkSearchType() === true && this.checkExceptKeyword() === false) { return false; } var iCategoryNo = 0; if ($("#category_no").length > 0) { iCategoryNo = $("#category_no option").index($("#category_no option:selected")); } if (this.checkPrice() === false && this.getKeyword() === null) { if (iCategoryNo === 0) { oSearchFormKeyword.attr('fw-filter', 'isFill'); } } return true; }, checkSearchType : function () { if ($("#search_type").length < 1) { return true; } if ($("#search_type option:selected").val() === 'product_name') { return true } else { return false; } }, checkExceptKeyword : function () { var sKeyword = this.getKeyword(); var sExceptKeyWord = $.trim($('#exceptkeyword').val()); if (sExceptKeyWord.length === 0) { return true; } if (sKeyword === null) { alert(__('제외검색어 입력 시 검색조건에 상품명을 반드시 입력하셔야 합니다.')); return false; } var iFindWord = sKeyword.indexOf(sExceptKeyWord); if (iFindWord !== -1) { alert(__('제외검색어가 검색어에 포함되어 있어 검색할 수 없습니다.\n다시 입력해주세요.')); return false; } return true; }, getKeyword : function () { var sKeyWord = $.trim(oSearchFormKeyword.val()); if (sKeyWord.length === 0) { return null; } return sKeyWord; }, checkPrice : function () { var iProduct_price_min = $.trim($('#product_price1').val()); var iProduct_price_max = $.trim($('#product_price2').val()); if (iProduct_price_min.length === 0 && iProduct_price_max.length === 0) { return false; } return true; } } SEARCHREGISTER.eSearchType(); $('#searchForm').submit(function(e) { if (SEARCHREGISTER.eSubmit() !== true) { return false; } if (FwValidator.inspection('searchForm').passed !== true) { return false; } return true; }); $('#search_type').change(function(e) { SEARCHREGISTER.eSearchType(); }); $('#btn_search').click(function() { $('#searchBarForm').submit(); }); $('input[name="keyword"]').bind('keypress.ec-keyword-event', function(e) { if (e.keyCode == 13 && $.trim($(this).val()) === '') { alert(__('검색어를 입력해주세요')); return false; } }); $('[id=searchBarForm]').submit(function(e) { if ($.trim($(this).find('#keyword').val())=='') { alert(__('검색어를 입력해주세요')); return false; } if (mobileWeb === true) { $Recentword.saveRecentWord($(this).find('#keyword').val()); } }); $('.btn_order').click(function() { $type = $(this).attr('rel'); $('#order_by').val($type); $('#searchForm').submit(); }); $('.btn_view').click(function() { $view = $(this).attr('rel'); if ($view != 'list') { $sAction = '/product/search_'+$view+'.html'; } else { $sAction = '/product/search.html'; } $('#view_type').val($view); $('#searchForm').attr('action', $sAction); $('#searchForm').submit(); }); // 검색어 관련 작업 var aSearchKey = ReWriteSearchKey(); if (aSearchKey !== false) { if (aSearchKey) {//ECHOSTING-44000 var oSearchHeader = $(".xans-layout-searchheader").parent("form"); oSearchHeader.find("#banner_action").val(aSearchKey.banner_action); oSearchHeader.find("#keyword").val(aSearchKey.msb_contents); } }; if (mobileWeb === true) { $('#search_cancel').bind('click', function() { $('html, body').css({'overflowY': 'auto', height: 'auto', width: '100%'}); $('.dimmed').toggle(); $('.xans-layout-searchheader').hide(); }); $('.xans-layout-searchheader').find('button.btnDelete').bind('click', function() { $('#keyword').attr('value', '').focus(); $('#banner_action').attr('value', ''); //ECQAINT-8961 Delete버튼 클릭시 value 초기화 }); // 검색페이지에서 삭제 $('.xans-search-form').find('button.btnDelete').bind('click', function() { $('#searchForm').find('input#keyword').attr('value', '').focus(); }); $('.header .search button').bind('click', function() { if ($('#search_box').size() > 0) { $('html, body').css({'overflowY': 'hidden', height: '100%', width: '100%'}); $('.dimmed').toggle(); $('#header .xans-layout-searchheader').toggle(); } else { $('#header .xans-layout-searchheader').toggle(); } }); } }); function ReWriteSearchKey() { if (typeof(sSearchBannerUseFlag) == "undefined") return false; if (sSearchBannerUseFlag == 'F') return false; if (typeof(aSearchBannerData) == "undefined") return false; if (aSearchBannerData.length === 0) return false; if (sSearchBannerType != 'F') return aSearchBannerData[Math.floor(Math.random() * aSearchBannerData.length)]; var aResultData = null; var sSearchKey = $.cookie('iSearchKey'); var iSearchKey = 0; // if ( sSearchKey !== null ) {//ECHOSTING-44000 if ( sSearchKey != undefined ) { iSearchKey = parseInt(sSearchKey) + parseInt(1); if ( iSearchKey >= aSearchBannerData.length ) { iSearchKey = 0; } } $.cookie('iSearchKey', iSearchKey, {path : '/'}); return aSearchBannerData[iSearchKey]; } var popProduct = { selProduct: function(product_no,iPrdImg, sPrdName,sPrdPrice, sPrdTaxText, sCategoryName, iCategoryNo) { if (this.isGiftProduct(product_no) === false) { alert(sErrorMessage); return false; } try { $('#aPrdLink', opener.document).attr('href', this.getUrl(product_no)); $('#aPrdNameLink', opener.document).attr('href', this.getUrl(product_no)); $('#product_no', opener.document).val(product_no); $('#iPrdImg', opener.document).attr('src', iPrdImg); $('#sPrdName', opener.document).html(sPrdName.replace(/[\"]/g, '"')); $('#sPrdPrice', opener.document).html(sPrdPrice); $('#sPrdCommonImg', opener.document).html(''); if ($('#sPrdTaxText', opener.document).size() > 0) { $('#sPrdTaxText', opener.document).html(sPrdTaxText); } $('#iPrdView', opener.document).removeClass('displaynone').css('display', 'inline'); } catch (e) {} // ECHOSTING-61590 var iSelectedOptionIndex = $('#subject', opener.document).attr('selectedIndex'); $('#subject option', opener.document).remove(); $('input[name^="fix_title_form_"]', opener.document).each(function (iIndex) { var sSubject = popProduct.getConvertString($(this).val(), sPrdName, sCategoryName); var sOptionTag = ''; $('#subject', opener.document).append(sOptionTag); }); $('#subject', opener.document).attr('selectedIndex', iSelectedOptionIndex); $('#cate_no', opener.document).val(iCategoryNo); /** * thunmail이미지에 링크가 걸렸을경우 링크 처리 */ var eAnchor = opener.document.getElementById('iPrdImg').parentNode; if ('A' === eAnchor.tagName.toUpperCase()) { eAnchor.href = this.getUrl(product_no); } window.close(); }, getUrl: function(product_no) { var aPrdLink = opener.document.getElementById('aPrdLink').href; var iUrlIndex = aPrdLink.indexOf('product_no='); var aPrdLinkSplit = aPrdLink.split('product_no='); var aPrdParamSplit = aPrdLinkSplit[1].split('&'); aPrdParamSplit.shift(); return aPrdLink.substr(0, iUrlIndex)+'product_no='+product_no+(aPrdParamSplit.length > 0 ? '&'+aPrdParamSplit.join('&') : ''); }, // ECHOSTING-61590 getConvertString : function(sSubject, sPrdName, sCategoryName) { sSubject = sSubject.replace('PRODUCT_NAME', sPrdName); return sSubject.replace('CATEGORY_NAME', sCategoryName); }, isGiftProduct : function(iProductNum) { if (typeof aGiftReview === 'object') { if (aGiftReview[iProductNum] === 'F') { return false; } } return true; }, END : function() {} }; /** * 상품 검색 배너 */ var SEARCH_BANNER = { /** * 상품 검색 Submit */ submitSearchBanner : function(obj) { var form = $(obj).parents('form'); if (form.find('#banner_action').val() != '') { // ECHOSTING-98878 상품검색키워드로 검색시에 폼전송이 되어 연결페이지로 이동이 안되고 검색페이지로 이동되는 오류 수정 form.submit(function () { return false; }); // 배너 연결 페이지 이동 location.replace(form.find('#banner_action').val()); } else { if ($.trim(form.find('#keyword').val())=='') { alert(__('검색어를 입력해주세요')); form.find('#keyword').focus(); return; } form.submit(); } }, /** * 검색어 입력폼 클릭 */ clickSearchForm : function(obj) { //ECHOSTING-105207 상품검색 키워드설정시 모바일에서 검색 결과 없음 var form = $(obj).parents('form'); if (mobileWeb == true && form.find('#banner_action').val() != '') { // ECHOSTING-98878 상품검색키워드로 검색시에 폼전송이 되어 연결페이지로 이동이 안되고 검색페이지로 이동되는 오류 수정 form.submit(function () { return false; }); // 배너 연결 페이지 이동 location.replace(form.find('#banner_action').val()); } form.find('#banner_action').val(''); if (mobileWeb !== true) { $(obj).val(''); } } }; /** * 최근검색어 */ var $Recentword = { // recent length recentNum : 10, // cookie expires expires : 10, // duplication key duplicateKey : 0, // recent string string : '', // recent string prefix : 'RECENT_WORD_', // sModuel sModule : 'xans-search-recentkeyword', // recent $recent : null, // recent list $recentList : null, // list size size : 0, // remove $remove : null, /** * save recent word */ init : function() { this.setObj(); this.action(); this.dimmed(); }, dimmed : function() { try { $('.xans-layout-searchheader').after(''); } catch(e) { } }, setObj : function() { this.$recent = $('.' + this.sModule); this.$recentList = this.$recent.find('ul').find('li'); this.size = this.$recentList.size(); this.$remove = this.$recent.find('p'); }, action : function() { var $hot = $('.xans-search-hotkeyword'), $title = $('#keyword_title'); if ($('.xans-layout-searchheader').find('ul.searchTab').hasClass('displaynone') === false) { this.$recent.hide(); $title.hide(); } else { $hot.hide(); } $('.xans-layout-searchheader').find('ul.searchTab').find('li').click(function() { var index = $(this).index(); $(this).addClass('selected').siblings().removeClass('selected'); if (index == 0) { $Recentword.$recent.hide(); $hot.show(); } else { $Recentword.$recent.show(); $hot.hide(); } }); }, saveRecentWord : function(s) { this.string = s; // 중복처리 if (this.duplication() === false) { this.cookieOrder(); } // 저장 this.save(); }, save : function() { var bFull = true; for (var i=1; i<=this.recentNum; i++) { if ($.cookie(this.prefix + i) == null) { bFull = false; this.add(i); break; } } if (bFull == true) { this.removeFrist(); this.add(this.recentNum); } }, duplication : function() { for (var k=1; k<=this.recentNum; k++) { if ($.cookie(this.prefix + k) == this.string) { this.duplicateKey = k; $.cookie(this.pre x + k, null, { path: '/' }); return false; } } }, cookieOrder : function() { var s = this.duplicateKey + 1; for (var i=this.duplicateKey; i<=this.recentNum; i++) { if ($.cookie(this.prefix + s) != null) { this.add(i, $.cookie(this.prefix + s)); this.removeCookie(s); s++; } } }, removeFrist : function() { for (var i=2, k=1; i<=this.recentNum; i++,k++) { $.cookie(this.prefix + k, $.cookie(this.prefix + i), { expires: this.expires, path: '/'}); } }, add : function(key, duplicateString) { $.cookie(this.prefix + key, duplicateString || this.string, { expires: this.expires, path: '/'}); }, removeCookie : function(key) { $.cookie(this.prefix + key, null, { path: '/' }); }, removeAll : function() { for (var i=1; i<=this.recentNum; i++) { $.cookie(this.prefix + i, null, { path: '/' }); } this.setNoList(); }, removeOne : function(key) { try { this.removeCookie(key); this.$recentList.each(function() { if ($(this).data('index') == key) { $(this).remove(); } }); this.size--; if (this.size == 0) { this.setNoList(); } } catch(e) { } }, setNoList : function() { try { this.$recentList.each(function() { $(this).remove(); }); this.$remove.removeClass('displaynone'); } catch(e) { } } }; /* * 해시태그 json 검색 */ var SEARCH_HASHTAG = { // 해시태그 json ajax url sAjaxHashtag: '/exec/front/shop/hashtag?type=', // 해시태그 DB oJsonDB: null, // 기본 검색어 uri sSearchUrl: '/product/search.html?keyword=', // 해시태그 json 파일 호출 // oTarget: 검색 input object // sType: 검색 대상 타입 (product 또는 category) getHashtag: function(oTarget, sType) { if (bUseElestic === false) { return; } var self = this; var sKeyword = $.trim(oTarget.val()); var oDrop = oTarget.parent().find('.autoDrop'); var event = window.event || arguments.callee.caller.arguments[0]; // 기본 타입 설정 if (typeof(sType) === 'undefined' || sType === '') { sType = 'product'; } // 자동완성 영역이 있는 경우만 실행 if (oDrop.length < 1) { return; } // ↑, ↓키를 눌렀을 경우에는 팝업에 대한 처리만 진행 if (event.keyCode === 38 || event.keyCode === 40) { oTarget.blur(); this.setKeyArrow(oDrop, event); setTimeout(function() { oTarget.focus(); }, 10); return; } // 실제 키워드에 대한 자동완성 처리 부분 if (sKeyword !== '') { if (mobileWeb === true && $('body').hasClass("eMobilePopup") === false) { $("#ec-product-searchdata-auto-list").show(); $('body').addClass("eMobilePopup"); // fullsize 레이어팝업 노출시 body에 eMobilePopup 클래스 추가 $('body').css("width", "100%"); } if (this.oJsonDB === null) { // json 파일 존재여부 체크 $.getJSON(this.sAjaxHashtag + sType, function(data) { // 파일이 존재할 경우 url 리턴 // 리턴된 url로 json object 요청 if (data.url !== false) { $.getJSON(data.url, function(data) { if (data !== false) { self.oJsonDB = TAFFY(data); self.setHashtagKeyword(oDrop, sKeyword); } }); } }); } else { this.setHashtagKeyword(oDrop, sKeyword); } } else { this.setHashtagHide(oDrop); } }, // ↑, ↓키 처리 (drop 영역 키보드 컨트롤) setKeyArrow: function(oDrop, event) { var oTarget = oDrop.children('li'); var oSelected = oDrop.children('li.selected'); var oScroll = null; if (oTarget.length > 0) { oTarget.removeClass('selected'); switch (event.keyCode) { // ↑ case 38: if (oSelected.length === 0 || oSelected.prev().length === 0) { oScroll = oTarget.last().addClass('selected'); } else { oScroll = oSelected.prev().addClass('selected'); } break; // ↓ case 40: if (oSelected.length === 0 || oSelected.next().length === 0) { oScroll = oTarget.first().addClass('selected'); } else { oScroll = oSelected.next().addClass('selected'); } break; } if (oScroll !== null && oSelected.length > 0) { oDrop.scrollTop(oScroll.position().top + oDrop.scrollTop() - oScroll.height() * 3); } } }, // 검색된 해시태그 리스트 보이기/감추기 setHashtagHide: function(oTarget, bFlag) { if (typeof(bFlag) === 'undefined' || bFlag === '') { bFlag = false; } if (bFlag === false) { oTarget.hide(); } else { oTarget.show(); } }, // 저장된 해시태그 json 파일에 대해 키워드로 검색 후 결과 출력 setHashtagKeyword: function(oDrop, sKeyword) { var self = this; var oJsonSearch = this.oJsonDB({tag: {like: sKeyword}}).order('tag asec').get(); oDrop.html(''); if (oJsonSearch.length !== 0) { this.setHashtagHide(oDrop, true); oJsonSearch.forEach(function(oResult) { // 검색된 키워드에 대해서 bold 처리 (검색 결과에서 검색어로 입력했던 문자만) if ($.trim(oResult.tag) !== '') { oDrop.append('
' + oResult.tag.replace(sKeyword, '' + sKeyword + '') + ' '); } }); } else { this.setHashtagHide(oDrop); } } }; /** * FwValidator * * @package jquery * @subpackage validator */ var FwValidator = { /** * 디버그 모드 */ DEBUG_MODE : false, /** * 결과 코드 */ CODE_SUCCESS : true, CODE_FAIL : false, /** * 어트리뷰트 명 */ ATTR_FILTER : 'fw-filter', ATTR_MSG : 'fw-msg', ATTR_LABEL : 'fw-label', ATTR_FIREON : 'fw-fireon', ATTR_ALONE : 'fw-alone', /** * 응답객체들 */ responses : {}, /** * 엘리먼트별 필수 입력 에러 메세지 */ requireMsgs : {}, /** * 엘리먼트의 특정 필터별 에러 메세지 */ elmFilterMsgs : {}, /** * Validator 기본 이벤트 등록 */ bind : function(formId, expand) { var self = this; var formInfo = this.Helper.getFormInfo(formId); if (formInfo === false) { alert('The form does not exist - bind'); return false; } var elmForm = formInfo.instance; var Response = this._response(formId); this._fireon(formId, elmForm, Response); this._submit(formId, elmForm, expand); return true; }, /** * Validator 검사 진행 * * @param string formId * @return object | false */ inspection : function(formId, expand) { expand = (expand === true) ? true : false; var self = this; var Response = this._response(formId); if (Response === false) { alert('The form does not exist - inspection'); return false; } if (Response.elmsTarget.length == 0) { return this.Helper.getResult(Response, this.CODE_SUCCESS); } Response.elmsTarget.each(function(){ self._execute(Response, this); }); if (Response.elmsCurrErrorField.length > 0) { if (expand !== true) { this.Handler.errorHandler(Response.elmsCurrErrorField[0]); } else { this.Handler.errorHandlerByExapnd(Response); } return Response.elmsCurrErrorField[0]; } return this.Helper.getResult(Response, this.CODE_SUCCESS); }, /** * submit 이벤트 등록 * * @param string formId * @param object elmForm */ _submit : function(formId, elmForm, expand) { var self = this; elmForm.unbind('submit'); elmForm.bind('submit', function(){ var result = false; try{ result = self.inspection(formId, expand); }catch(e){ alert(e); return false; } if(!result || result.passed === self.CODE_FAIL){ return false; }; var callback = self._beforeSubmit(elmForm); return callback !== false ? true : false; }); }, /** * fireon 이벤트 등록 * * @param string formId * @param object elmForm * @param FwValidator.Response Response */ _fireon : function(formId, elmForm, Response) { var self = this; var formInfo = this.Helper.getFormInfo(formId); $(formInfo.selector).find('*['+this.ATTR_FILTER+']['+this.ATTR_FIREON+']').each(function(){ var elm = $(this); var evtName = $.trim(elm.attr(self.ATTR_FIREON)); var elmMsg = ''; elm.unbind(evtName); elm.bind(evtName, function(){ var result = self._execute(Response, this); var targetField = Response.elmCurrField; //에러 메세지가 출력되 있다면 일단 지우고 체킹을 시작한다. if(typeof elmMsg == 'object'){ elmMsg.remove(); } if(result > -1){ elmMsg = self.Handler.errorHandlerByFireon(Response.elmsCurrErrorField[result]); }else{ self.Handler.successHandlerByFireon(self.Helper.getResult(Response, self.CODE_FAIL)); } }); }); }, /** * Response 객체 생성 * * @param string formId * @return FwValidator.Response | false */ _response : function(formId) { var formInfo = this.Helper.getFormInfo(formId); if (formInfo === false) { alert('The form does not exist - find'); return false; } var elmForm = formInfo.instance; var elmsTarget = $(formInfo.selector).find('*[' + this.ATTR_FILTER + ']'); this.responses[formId] = new FwValidator.Response(); this.responses[formId].formId = formId; this.responses[formId].elmForm = elmForm; this.responses[formId].elmsTarget = elmsTarget; return this.responses[formId]; }, /** * BeforeExecute 콜백함수 실행 * * @param FwValidator.Response Response */ _beforeExecute : function(Response) { var count = this.Handler.beforeExecute.length; if (count == 0) return; for (var i in this.Handler.beforeExecute) { this.Handler.beforeExecute[i].call(this, Response); } }, /** * BeforeSubmit 콜백함수 실행 * * @param object elmForm (jquery 셀렉터 문법으로 찾아낸 폼 객체) */ _beforeSubmit : function(elmForm) { if(typeof this.Handler.beforeSubmit != 'function') return true; return this.Handler.beforeSubmit.call(this, elmForm); }, /** * 엘리먼트별 유효성 검사 실행 * * @param FwValidator.Response Response * @param htmlElement elmTarget * @return int(에러가 발생한 elmCurrField 의 인덱스값) | -1(성공) */ _execute : function(Response, elmTarget) { var RESULT_SUCCESS = -1; Response.elmCurrField = $(elmTarget); Response.elmCurrLabel = Response.elmCurrField.attr(this.ATTR_LABEL); Response.elmCurrFieldType = this.Helper.getElmType(Response.elmCurrField); Response.elmCurrFieldDisabled = elmTarget.disabled; Response.elmCurrValue = this.Helper.getValue(Response.formId, Response.elmCurrField); Response.elmCurrErrorMsg = Response.elmCurrField.attr(this.ATTR_MSG); //_beforeExecute 콜백함수 실행 this._beforeExecute(Response); //필드가 disabled 일 경우는 체크하지 않음. if (Response.elmCurrFieldDisabled === true) { return RESULT_SUCCESS; } var filter = $.trim( Response.elmCurrField.attr(this.ATTR_FILTER) ); if (filter == '') { return RESULT_SUCCESS; } //is로 시작하지 않는것들은 정규표현식으로 간주 if (/^is/i.test(filter)) { var filters = filter.split('&'); var count = filters.length; //필수항목이 아닌경우 빈값이 들어왔을경우는 유효성 체크를 통과시킴 if ((/isFill/i.test(filter) === false) && !Response.elmCurrValue) { return RESULT_SUCCESS; } for (var i=0; i < count; ++i) { var filter = filters[i]; var param = ''; var filtersInfo = this.Helper.getFilterInfo(filter); filter = Response.elmCurrFilter = filtersInfo.id; param = filtersInfo.param; //필수 입력 필터의 경우 항목관리에서 사용자가 메세지를 직접 지정하는 부분이 있어 이렇게 처리 if (filter == 'isFill') { Response.elmCurrValue = $.trim(Response.elmCurrValue); Response.elmCurrErrorMsg = this.requireMsgs[elmTarget.id] ? this.requireMsgs[elmTarget.id] : this.msgs['isFill']; } else { var msg = Response.elmCurrField.attr(this.ATTR_MSG); if (msg) { Response.elmCurrErrorMsg = msg; } else if (this.Helper.getElmFilterMsg(elmTarget.id, filter)) { Response.elmCurrErrorMsg = this.Helper.getElmFilterMsg(elmTarget.id, filter); } else { Response.elmCurrErrorMsg = this.msgs[filter]; } } //존재하지 않는 필터인 경우 에러코드 반환 if(this.Filter[filter] === undefined){ Response.elmCurrErrorMsg = this.msgs['notMethod']; var result = this.Helper.getResult(Response, this.CODE_FAIL); Response.elmsCurrErrorField.push(result); return Response.elmsCurrErrorField.length - 1; } //필터 실행 var result = this.Filter[filter](Response, param); if (result == undefined || result.passed === this.CODE_FAIL) { Response.elmsCurrErrorField.push(result); //Debug를 위해 넣어둔 코드(확장형 필터를 잘못 등록해서 return값이 없는 경우를 체크하기 위함) if (result == undefined) { alert('Extension Filter Return error - ' + filter); } return Response.elmsCurrErrorField.length - 1; } } } else { var msg = Response.elmCurrErrorMsg; Response.elmCurrErrorMsg = msg ? msg : this.msgs['isRegex']; var result = this.Filter.isRegex(Response, filter); if(result.passed === this.CODE_FAIL){ Response.elmsCurrErrorField.push(result); return Response.elmsCurrErrorField.length - 1; } } return RESULT_SUCCESS; } }; /** * FwValidator.Response * * @package jquery * @subpackage validator */ FwValidator.Response = function() { this.formId = null; this.elmForm = null; this.elmsTarget = null; this.elmsCurrErrorField = []; this.elmCurrField = null; this.elmCurrFieldType = null; this.elmCurrFieldDisabled = null; this.elmCurrLabel = null; this.elmCurrValue = null; this.elmCurrFilter = null; this.elmCurrErrorMsg = null; this.requireMsgs = {}; }; /** * FwValidator.Helper * * @package jquery * @subpackage validator */ FwValidator.Helper = { parent : FwValidator, /** * 메세지 엘리먼트의 아이디 prefix */ msgIdPrefix : 'msg_', /** * 메세지 엘리먼트의 클래스 명 prefix */ msgClassNamePrefix : 'msg_error_mark_', /** * 결과 반환 */ getResult : function(Response, code, param) { //특수 파라미터 정보(특정 필터에서만 사용함) param = param != undefined ? param : {}; var msg = ''; if (code === this.parent.CODE_FAIL) { try { msg = Response.elmCurrErrorMsg.replace(/\{label\}/i, Response.elmCurrLabel); } catch(e) { msg = 'No Message'; } } else { msg = 'success'; } var result = {}; result.passed = code; result.formid = Response.formId; result.msg = msg; result.param = param; try { result.element = Response.elmCurrField; result.elmid = Response.elmCurrField.attr('id'); result.filter = Response.elmCurrFilter; } catch(e) {} return result; }, /** * 필터 정보 반환(필터이름, 파라미터) */ getFilterInfo : function(filter) { var matches = filter.match(/(is[a-z]*)((?:\[.*?\])*)/i); return { id : matches[1], param : this.getFilterParams(matches[2]) }; }, /** * 필터의 파라미터 스트링 파싱 * isFill[a=1][b=1][c=1] 이런식의 멀티 파라미터가 지정되어 있는 경우는 배열로 반환함 * isFill[a=1] 단일 파라미터는 파라미터로 지정된 스트링값만 반환함 */ getFilterParams : function(paramStr) { if (paramStr == undefined || paramStr == null || paramStr == '') { return ''; } var matches = paramStr.match(/\[.*?\]/ig); if (matches == null) { return ''; } var count = matches.length; var result = []; for (var i=0; i < count; i++) { var p = matches[i].match(/\[(.*?)\]/); result.push(p[1]); } if (result.length == 1) { return result[0]; } return result; }, /** * 필드 타입 반환(select, checkbox, radio, textbox) */ getElmType : function(elmField) { elmField = $(elmField); var elTag = elmField[0].tagName; var result = null; switch (elTag) { case 'SELECT' : result = 'select'; break; case 'INPUT' : var _type = elmField.attr('type').toLowerCase(); if(_type == 'checkbox') result = 'checkbox'; else if(_type =='radio') result = 'radio'; else result = 'textbox'; break; case 'TEXTAREA' : result = 'textbox'; break; default : result = 'textbox'; break; } return result; }, /** * 필드 값 반환 */ getValue : function(formId, elmField) { var result = ''; var elmName = elmField.attr('name'); var fieldType = this.getElmType(elmField); //checkbox 나 radio 박스는 value값을 반환하지 않음 if (fieldType == 'checkbox' || fieldType == 'radio') { if(elmField.get(0).checked === true){ result = elmField.val(); } return result; } //alonefilter 속성이 Y 로 되어 있다면 해당 엘리먼트의 값만 반환함 var aloneFilter = elmField.attr(this.parent.ATTR_ALONE); if(aloneFilter == 'Y' || aloneFilter == 'y'){ return elmField.val(); } //name이 배열형태로 되어 있다면 값을 모두 합쳐서 반환 if( /\[.*?\]/.test(elmName) ){ var formInfo = this.getFormInfo(formId); var groupElms = $(formInfo.selector +' [name="'+elmName+'"]'); groupElms.each(function(i){ var elm = $(this); result += elm.val(); }); }else{ result = elmField.val(); } return result; }, /** * 에러메세지 엘리먼트 생성 */ createMsg : function(elm, msg, formId) { var elmMsg = document.createElement('span'); elmMsg.id = this.msgIdPrefix + elm.attr('id'); elmMsg.className = this.msgClassNamePrefix + formId; elmMsg.innerHTML = msg; return $(elmMsg); }, /** * 에러메세지 엘리먼트 제거 */ removeMsg : function(elm) { var id = this.msgIdPrefix + elm.attr('id'); var elmErr = $('#'+id); if (elmErr) elmErr.remove(); }, /** * 에러메세지 엘리먼트 모두 제거 */ removeAllMsg : function(formId) { var className = this.msgClassNamePrefix + formId; $('.' + className).remove(); }, /** * 문자열의 Byte 수 반환 */ getByte : function(str) { var encode = encodeURIComponent(str); var totalBytes = 0; var chr; var bytes; var code; for(var i = 0; i < encode.length; i++) { chr = encode.charAt(i); if(chr != "%") totalBytes++; else { code = parseInt(encode.substr(i+1,2),16); if(!(code & 0x80)) totalBytes++; else { if((code & 0xE0) == 0xC0) bytes = 2; else if((code & 0xF0) == 0xE0) bytes = 3; else if((code & 0xF8) == 0xF0) bytes = 4; else return -1; i += 3 * (bytes - 1); totalBytes += 2; } i += 2; } } return totalBytes; }, /** * 지정한 엘리먼트의 필터 메세지가 존재하는가 * * @param elmId (엘리먼트 아이디) * @param filter (필터명) * @return string | false */ getElmFilterMsg : function(elmId, filter) { if (this.parent.elmFilterMsgs[elmId] == undefined) return false; if (this.parent.elmFilterMsgs[elmId][filter] == undefined) return false; return this.parent.elmFilterMsgs[elmId][filter]; }, /** * 폼 정보 반환 * * @param formId (폼 아이디 혹은 네임) * @return array( * 'selector' => 셀렉터 문자, * 'instance' => 셀렉터 문법으로 검색해낸 폼 객체 * ) | false */ getFormInfo : function(formId) { var result = {}; var selector = '#' + formId; var instance = $(selector); if (instance.length > 0) { result.selector = selector; result.instance = instance; return result; } selector = 'form[name="' + formId + '"]'; instance = $(selector); if (instance.length > 0) { result.selector = selector; result.instance = instance; return result; } return false; }, /** * 숫자형태의 문자열로 바꿔줌 * 123,123,123 * 123123,123 * 123% * 123 % * 123.4 * -123 * ,123 * * @param value * @return float */ getNumberConv : function(value) { if (!value || value == undefined || value == null) return ''; value = value + ""; value = value.replace(/,/g, ''); value = value.replace(/%/g, ''); value = value.replace(/[\s]/g, ''); if (this.parent.Verify.isFloat(value) === false) return ''; return parseFloat(value); } }; /** * FwValidator.Handler * * @package jquery * @subpackage validator */ FwValidator.Handler = { parent : FwValidator, /** * 사용자 정의형 에러핸들러(엘리먼트 아이디별로 저장됨) */ customErrorHandler : {}, /** * 사용자 정의형 에러핸들러(필터별로 저장됨) */ customErrorHandlerByFilter : {}, /** * 사용자 정의형 성공핸들러(엘리먼트 아이디별로 저장됨) */ customSuccessHandler : {}, /** * 사용자 정의형 성공핸들러(필터별로 저장됨) */ customSuccessHandlerByFilter : {}, /** * FwValidator._execute에 의해 검사되기 전 실행되는 콜백함수 */ beforeExecute : [], /** * FwValidator._submit에서 바인딩한 onsubmit 이벤트 발생후 실행되는 콜백함수 * {폼아이디 : 콜백함수, ...} */ beforeSubmit : {}, /** * 기본 메세지 전체를 오버라이딩 */ overrideMsgs : function(msgs) { if (typeof msgs != 'object') return; this.parent.msgs = msgs; }, /** * 필드에 따른 필수 입력 에러메세지 설정 */ setRequireErrorMsg : function(field, msg) { this.parent.requireMsgs[field] = msg; }, /** * 필터 타입에 따른 에러메세지 설정 */ setFilterErrorMsg : function(filter, msg) { this.parent.msgs[filter] = msg; }, /** * 엘리먼트의 특정 필터에만 에러메세지를 설정 */ setFilterErrorMsgByElement : function(elmId, filter, msg) { if (this.parent.elmFilterMsgs[elmId] == undefined) { this.parent.elmFilterMsgs[elmId] = {}; } this.parent.elmFilterMsgs[elmId][filter] = msg; }, /** * 엘리먼트 아이디별 사용자정의형 에러핸들러 등록 */ setCustomErrorHandler : function(elmId, func) { if (typeof func != 'function') return; this.customErrorHandler[elmId] = func; }, /** * 필터 타입별 사용자정의형 에러핸들러 등록 */ setCustomErrorHandlerByFilter : function(filter, func) { if (typeof func != 'function') return; this.customErrorHandlerByFilter[filter] = func; }, /** * 엘리먼트 아이디별 사용자정의형 성공핸들러 등록 */ setCustomSuccessHandler : function(elmId, func) { if (typeof func != 'function') return; this.customSuccessHandler[elmId] = func; }, /** * 필터 타입별 사용자정의형 성공핸들러 등록 */ setCustomSuccessHandlerByFilter : function(filter, func) { if (typeof func != 'function') return; this.customSuccessHandlerByFilter[filter] = func; }, /** * 확장형 필터 등록 */ setExtensionFilter : function(filter, func) { if (typeof func != 'function') return; if (this.parent.Filter[filter] == undefined) { this.parent.Filter[filter] = func; } }, /** * 각 엘리먼트가 FwValidator._execute에 의해 검사되기 전 실행되는 콜백함수 등록 */ setBeforeExecute : function(func) { if (typeof func != 'function') return; this.beforeExecute.push(func); }, /** * FwValidator._submit 에서 바인딩된 onsubmit 이벤트의 콜백함수 등록(유효성 검사가 성공하면 호출됨) */ setBeforeSubmit : function(func) { if (typeof func != 'function') return; this.beforeSubmit = func; }, /** * 에러핸들러 - 기본 */ errorHandler : function(resultData) { if (this._callCustomErrorHandler(resultData) === true) return; alert(resultData.msg); resultData.element.focus(); }, /** * 에러핸들러 - 전체 펼침 모드 */ errorHandlerByExapnd : function(Response) { var count = Response.elmsCurrErrorField.length; //해당 폼에 출력된 에러메세지를 일단 모두 지운다. this.parent.Helper.removeAllMsg(Response.formId); for (var i=0; i < count; ++i) { var resultData = Response.elmsCurrErrorField[i]; if (this._callCustomErrorHandler(resultData) === true) continue; var elmMsg = this.parent.Helper.createMsg(resultData.element, resultData.msg, resultData.formid).css({'color':'#FF3300'}); elmMsg.appendTo(resultData.element.parent()); } }, /** * 에러핸들러 - fireon */ errorHandlerByFireon : function(resultData) { if (this._callCustomErrorHandler(resultData) === true) return; //해당 항목의 에러메세지 엘리먼트가 있다면 먼저 삭제한다. this.parent.Helper.removeMsg(resultData.element); var elmMsg = this.parent.Helper.createMsg(resultData.element, resultData.msg, resultData.formid).css({'color':'#FF3300'}); elmMsg.appendTo(resultData.element.parent()); return elmMsg; }, /** * 성공핸들러 - fireon */ successHandlerByFireon : function(resultData) { this._callCustomSuccessHandler(resultData); }, /** * 정의형 에러 핸들러 호출 * * @return boolean (정의형 에러핸들러를 호출했을 경우 true 반환) */ _callCustomErrorHandler : function(resultData) { //resultData 가 정의되어 있지 않은 경우 if (resultData == undefined) { alert('errorHandler - resultData is not found'); return true; } //해당 엘리먼트에 대한 Custom에러핸들러가 등록되어 있다면 탈출 if (this.customErrorHandler[resultData.elmid] != undefined) { this.customErrorHandler[resultData.elmid].call(this.parent, resultData); return true; } //해당 필터에 대한 Custom에러핸들러가 등록되어 있다면 탈출 if (this.customErrorHandlerByFilter[resultData.filter] != undefined) { this.customErrorHandlerByFilter[resultData.filter].call(this.parent, resultData); return true; } return false; }, /** * 정의형 성공 핸들러 호출 - 기본적으로 fireon 속성이 적용된 엘리먼트에만 적용됨. */ _callCustomSuccessHandler : function(resultData) { if (this.customSuccessHandler[resultData.elmid] != undefined) { this.customSuccessHandler[resultData.elmid].call(this.parent, resultData); return; } if (this.customSuccessHandlerByFilter[resultData.filter] != undefined) { this.customSuccessHandlerByFilter[resultData.filter].call(this.parent, resultData); return; } } }; /** * FwValidator.Verify * * @package jquery * @subpackage validator */ FwValidator.Verify = { parent : FwValidator, isNumber : function(value, cond) { if (value == '') return true; if (!cond) { cond = 1; } cond = parseInt(cond); pos = 1; nga = 2; minpos = 4; minnga = 8; result = 0; if ((/^[0-9]+$/).test(value) === true) { result = pos; } else if ((/^[-][0-9]+$/).test(value) === true) { result = nga; } else if ((/^[0-9]+[.][0-9]+$/).test(value) === true) { result = minpos; } else if ((/^[-][0-9]+[.][0-9]+$/).test(value) === true) { result = minnga; } if (result & cond) { return true; } return false; }, isFloat : function(value) { if (value == '') return true; return (/^[\-0-9]([0-9]+[\.]?)*$/).test(value); }, isIdentity : function(value) { if (value == '') return true; return (/^[a-z]+[a-z0-9_]+$/i).test(value); }, isKorean : function(value) { if (value == '') return true; var count = value.length; for(var i=0; i < count; ++i){ var cCode = value.charCodeAt(i); //공백은 무시 if(cCode == 0x20) continue; if(cCode < 0x80){ return false; } } return true; }, isAlpha : function(value) { if (value == '') return true; return (/^[a-z]+$/i).test(value); }, isAlphaUpper : function(value) { if (value == '') return true; return (/^[A-Z]+$/).test(value); }, isAlphaLower : function(value) { if (value == '') return true; return (/^[a-z]+$/).test(value); }, isAlphaNum : function(value) { if (value == '') return true; return (/^[a-z0-9]+$/i).test(value); }, isAlphaNumUpper : function(value) { if (value == '') return true; return (/^[A-Z0-9]+$/).test(value); }, isAlphaNumLower : function(value) { if (value == '') return true; return (/^[a-z0-9]+$/).test(value); }, isAlphaDash : function(value) { if (value == '') return true; return (/^[a-z0-9_-]+$/i).test(value); }, isAlphaDashUpper : function(value) { if (value == '') return true; return (/^[A-Z0-9_-]+$/).test(value); }, isAlphaDashLower : function(value) { if (value == '') return true; return (/^[a-z0-9_-]+$/).test(value); }, isSsn : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; if ( (/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[1234]{1}[0-9]{6}$/).test(value) === false ) { return false; } var sum = 0; var last = value.charCodeAt(12) - 0x30; var bases = "234567892345"; for (var i=0; i<12; i++) { sum += (value.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30); }; var mod = sum % 11; if ( (11 - mod) % 10 != last ) { return false; } return true; }, isForeignerNo : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; if ( (/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[5678]{1}[0-9]{1}[02468]{1}[0-9]{2}[6789]{1}[0-9]{1}$/).test(value) === false ) { return false; } var sum = 0; var last = value.charCodeAt(12) - 0x30; var bases = "234567892345"; for (var i=0; i<12; i++) { sum += (value.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30); }; var mod = sum % 11; if ( (11 - mod + 2) % 10 != last ) { return false; } return true; }, isBizNo : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; if ( (/[0-9]{3}[0-9]{2}[0-9]{5}$/).test(value) === false ) { return false; } var sum = parseInt(value.charAt(0)); var chkno = [0, 3, 7, 1, 3, 7, 1, 3]; for (var i = 1; i < 8; i++) { sum += (parseInt(value.charAt(i)) * chkno[i]) % 10; } sum += Math.floor(parseInt(parseInt(value.charAt(8))) * 5 / 10); sum += (parseInt(value.charAt(8)) * 5) % 10 + parseInt(value.charAt(9)); if (sum % 10 != 0) { return false; } return true; }, isJuriNo : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; if ( (/^([0-9]{6})-?([0-9]{7})$/).test(value) === false ) { return false; } var sum = 0; var last = parseInt(value.charAt(12), 10); for (var i=0; i<12; i++) { if (i % 2 == 0) { // * 1 sum += parseInt(value.charAt(i), 10); } else { // * 2 sum += parseInt(value.charAt(i), 10) * 2; }; }; var mod = sum % 10; if( (10 - mod) % 10 != last ){ return false; } return true; }, isPhone : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; return (/^(02|0[0-9]{2,3})[1-9]{1}[0-9]{2,3}[0-9]{4}$/).test(value); }, isMobile : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; return (/^01[016789][1-9]{1}[0-9]{2,3}[0-9]{4}$/).test(value); }, isZipcode : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; return (/^[0-9]{3}[0-9]{3}$/).test(value); }, isIp : function(value) { if (value == '') return true; return (/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){2,}$/).test(value); }, isEmail : function(value) { if (value == '') return true; return (/^([a-z0-9\_\-\.]+)@([a-z0-9\_\-]+\.)+[a-z]{2,63}$/i).test(value); }, isUrl : function(value) { if (value == '') return true; return (/http[s]?:\/\/[a-z0-9_\-]+(\.[a-z0-9_\-]+)+/i).test(value); }, isDate : function(value) { value = value.replace(/-/g, ''); if (value == '') return true; return (/^[12][0-9]{3}(([0]?[1-9])|([1][012]))[0-3]?[0-9]$/).test(value); }, isPassport : function(value) { if (value == '') return true; //일반 여권 if ( (/^[A-Z]{2}[0-9]{7}$/).test(value) === true ) { return true; } //전자 여권 if ( (/^[A-Z]{1}[0-9]{8}$/).test(value) === true ) { return true; } return false; }, isNumberMin : function(value, limit) { value = this.parent.Helper.getNumberConv(value); limit = this.parent.Helper.getNumberConv(limit); if (value < limit) { return false; } return true; }, isNumberMax : function(value, limit) { value = this.parent.Helper.getNumberConv(value); limit = this.parent.Helper.getNumberConv(limit); if (value > limit) { return false; } return true; }, isNumberRange : function(value, min, max) { value = this.parent.Helper.getNumberConv(value); min = this.parent.Helper.getNumberConv(min); max = this.parent.Helper.getNumberConv(max); if (value < min || value > max) { return false; } return true; } }; /** * FwValidator.Filter * * @package jquery * @subpackage validator */ FwValidator.Filter = { parent : FwValidator, isFill : function(Response, cond) { if (typeof cond != 'string') { var count = cond.length; var result = this.parent.Helper.getResult(Response, parent.CODE_SUCCESS); for (var i = 0; i < count; ++i) { result = this._fillConditionCheck(Response, cond[i]); if (result.passed === true) { return result; } } return result; } return this._fillConditionCheck(Response, cond); }, isMatch : function(Response, sField) { if(Response.elmCurrValue == ''){ return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); } //Radio 나 Checkbox의 경우 무시 if(Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox'){ return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); } var elmTarget = $('#'+sField); var elmTargetValue = elmTarget.val(); if (Response.elmCurrValue != elmTargetValue) { var label = elmTarget.attr(this.parent.ATTR_LABEL); var match = label ? label : sField; Response.elmCurrErrorMsg = Response.elmCurrErrorMsg.replace(/\{match\}/i, match); return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isMax : function(Response, iLen) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); if (Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox') { var chkCount = 0; var sName = Response.elmCurrField.attr('name'); $('input[name="'+sName+'"]').each(function(i){ if ($(this).get(0).checked === true) { ++chkCount; } }); if (chkCount > iLen) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } } else { var len = Response.elmCurrValue.length; if (len > iLen) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } } if (result.passed === this.parent.CODE_FAIL) { result.msg = result.msg.replace(/\{max\}/i, iLen); } return result; }, isMin : function(Response, iLen) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); if(Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox'){ var chkCount = 0; var sName = Response.elmCurrField.attr('name'); $('input[name="'+sName+'"]').each(function(i){ if($(this).get(0).checked === true){ ++chkCount; } }); if (chkCount < iLen) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } }else{ var len = Response.elmCurrValue.length; if(len < iLen){ result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } } if(result.passed === this.parent.CODE_FAIL){ result.msg = result.msg.replace(/\{min\}/i, iLen); } return result; }, isNumber : function(Response, iCond) { var result = this.parent.Verify.isNumber(Response.elmCurrValue, iCond); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isIdentity : function(Response){ var result = this.parent.Verify.isIdentity(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isKorean : function(Response){ var result = this.parent.Verify.isKorean(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlpha : function(Response){ var result = this.parent.Verify.isAlpha(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaLower : function(Response){ var result = this.parent.Verify.isAlphaLower(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaUpper : function(Response){ var result = this.parent.Verify.isAlphaUpper(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaNum : function(Response){ var result = this.parent.Verify.isAlphaNum(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaNumLower : function(Response){ var result = this.parent.Verify.isAlphaNumLower(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaNumUpper : function(Response){ var result = this.parent.Verify.isAlphaNumUpper(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaDash : function(Response){ var result = this.parent.Verify.isAlphaDash(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaDashLower : function(Response){ var result = this.parent.Verify.isAlphaDashLower(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isAlphaDashUpper : function(Response){ var result = this.parent.Verify.isAlphaDashUpper(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isSsn : function(Response){ var result = this.parent.Verify.isSsn(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isForeignerNo : function(Response){ var result = this.parent.Verify.isForeignerNo(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isBizNo : function(Response){ var result = this.parent.Verify.isBizNo(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isJuriNo : function(Response){ var result = this.parent.Verify.isJuriNo(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isPhone : function(Response){ var result = this.parent.Verify.isPhone(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isMobile : function(Response){ var result = this.parent.Verify.isMobile(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isZipcode : function(Response){ var result = this.parent.Verify.isZipcode(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isIp : function(Response){ var result = this.parent.Verify.isIp(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isEmail : function(Response){ var result = this.parent.Verify.isEmail(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isUrl : function(Response){ var result = this.parent.Verify.isUrl(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isDate : function(Response){ var result = this.parent.Verify.isDate(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isRegex : function(Response, regex){ regex = eval(regex); if( regex.test(Response.elmCurrValue) === false ){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isPassport : function(Response){ var result = this.parent.Verify.isPassport(Response.elmCurrValue); if(result === false){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isSimplexEditorFill : function(Response){ var result = eval(Response.elmCurrValue + ".isEmptyContent();"); if(result === true){ return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); } return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); }, isMaxByte : function(Response, iLen) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); var len = this.parent.Helper.getByte(Response.elmCurrValue); if (len > iLen) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{max\}/i, iLen); } return result; }, isMinByte : function(Response, iLen) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); var len = this.parent.Helper.getByte(Response.elmCurrValue); if (len < iLen) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{min\}/i, iLen); } return result; }, isByteRange : function(Response, range) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); var rangeInfo = this._getRangeNum(range); var iMin = rangeInfo.min; var iMax = rangeInfo.max; var len = this.parent.Helper.getByte(Response.elmCurrValue); if (len < iMin || len > iMax) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{min\}/i, iMin); result.msg = result.msg.replace(/\{max\}/i, iMax); } return result; }, isLengthRange : function(Response, range) { var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); var rangeInfo = this._getRangeNum(range); var iMin = rangeInfo.min; var iMax = rangeInfo.max; var resultMin = this.isMin(Response, iMin); var resultMax = this.isMax(Response, iMax); if (resultMin.passed === this.parent.CODE_FAIL || resultMax.passed === this.parent.CODE_FAIL) { result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{min\}/i, iMin); result.msg = result.msg.replace(/\{max\}/i, iMax); } return result; }, isNumberMin : function(Response, iLimit) { var check = this.parent.Verify.isNumberMin(Response.elmCurrValue, iLimit); var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); if(check === false){ result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{min\}/i, iLimit); } return result; }, isNumberMax : function(Response, iLimit) { var check = this.parent.Verify.isNumberMax(Response.elmCurrValue, iLimit); var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); if(check === false){ result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{max\}/i, iLimit); } return result; }, isNumberRange : function(Response, range) { var iMin = range[0]; var iMax = range[1]; var check = this.parent.Verify.isNumberRange(Response.elmCurrValue, iMin, iMax); var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); if(check === false){ result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); result.msg = result.msg.replace(/\{min\}/i, iMin); result.msg = result.msg.replace(/\{max\}/i, iMax); } return result; }, _getRangeNum : function(range) { var result = {}; result.min = range[0] <= 0 ? 0 : parseInt(range[0]); result.max = range[1] <= 0 ? 0 : parseInt(range[1]); return result; }, _fillConditionCheck : function(Response, cond) { cond = $.trim(cond); var parent = this.parent; //조건식이 들어오면 조건식에 맞을 경우만 필수값을 체크함 if (cond) { var conditions = cond.split('='); var fieldId = $.trim(conditions[0]); var fieldVal = $.trim(conditions[1]); try { var val = parent.Helper.getValue(Response.formId, $('#'+fieldId)); val = $.trim(val); if(fieldVal != val) { return parent.Helper.getResult(Response, parent.CODE_SUCCESS); } } catch(e) { if (parent.DEBUG_MODE == true) { Response.elmCurrErrorMsg = parent.msgs['isFillError']; Response.elmCurrErrorMsg = Response.elmCurrErrorMsg.replace(/\{condition\}/i, cond); return parent.Helper.getResult(Response, parent.CODE_FAIL); } return parent.Helper.getResult(Response, parent.CODE_SUCCESS); } } //Radio 나 Checkbox의 경우 선택한값이 있는지 여부를 체크함 if (Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox') { var sName = Response.elmCurrField.attr('name'); var result = parent.Helper.getResult(Response, parent.CODE_FAIL); $('input[name="'+sName+'"]').each(function(i){ if ($(this).get(0).checked === true) { result = parent.Helper.getResult(Response, parent.CODE_SUCCESS); } }); return result; } //일반 텍스트 박스 if (Response.elmCurrValue != '') { return parent.Helper.getResult(Response, parent.CODE_SUCCESS); } return parent.Helper.getResult(Response, parent.CODE_FAIL); } }; FwValidator.msgs = { //기본 'isFill' : '{label} 항목은 필수 입력값입니다.', 'isNumber' : '{label} 항목이 숫자 형식이 아닙니다.', 'isEmail' : '{label} 항목이 이메일 형식이 아닙니다.', 'isIdentity' : '{label} 항목이 아이디 형식이 아닙니다.', 'isMax' : '{label} 항목이 {max}자(개) 이하로 해주십시오.', 'isMin' : '{label} 항목이 {min}자(개) 이상으로 해주십시오 .', 'isRegex' : '{label} 항목이 올바른 입력값이 아닙니다.', 'isAlpha' : '{label} 항목이 영문이 아닙니다', 'isAlphaLower' : '{label} 항목이 영문 소문자 형식이 아닙니다', 'isAlphaUpper' : '{label} 항목이 영문 대문자 형식이 아닙니다', 'isAlphaNum' : '{label} 항목이 영문이나 숫자 형식이 아닙니다.', 'isAlphaNumLower' : '{label} 항목이 영문 소문자 혹은 숫자 형식이 아닙니다.', 'isAlphaNumUpper' : '{label} 항목이 영문 대문자 혹은 숫자 형식이 아닙니다.', 'isAlphaDash' : '{label} 항목이 [영문,숫자,_,-] 형식이 아닙니다.', 'isAlphaDashLower' : '{label} 항목이 [영문 소문자,숫자,_,-] 형식이 아닙니다.', 'isAlphaDashUpper' : '{label} 항목이 [영문 대문자,숫자,_,-] 형식이 아닙니다.', 'isKorean' : '{label} 항목이 한국어 형식이 아닙니다.', 'isUrl' : '{label} 항목이 URL 형식이 아닙니다.', 'isSsn' : '{label} 항목이 주민등록번호 형식이 아닙니다.', 'isForeignerNo' : '{label} 항목이 외국인등록번호 형식이 아닙니다.', 'isBizNo' : '{label} 항목이 사업자번호 형식이 아닙니다.', 'isPhone' : '{label} 항목이 전화번호 형식이 아닙니다.', 'isMobile' : '{label} 항목이 핸드폰 형식이 아닙니다.', 'isZipcode' : '{label} 항목이 우편번호 형식이 아닙니다.', 'isJuriNo' : '{label} 항목이 법인번호 형식이 아닙니다.', 'isIp' : '{label} 항목이 아이피 형식이 아닙니다.', 'isDate' : '{label} 항목이 날짜 형식이 아닙니다.', 'isMatch' : '{label} 항목과 {match} 항목이 같지 않습니다.', 'isSuccess' : '{label} 항목의 데이터는 전송할 수 없습니다.', 'isSimplexEditorFill' : '{label}(을/를) 입력하세요', 'isPassport' : '{label} 항목이 여권번호 형식이 아닙니다.', 'isMaxByte' : '{label} 항목은 {max}bytes 이하로 해주십시오.', 'isMinByte' : '{label} 항목은 {min}bytes 이상으로 해주십시오.', 'isByteRange' : '{label} 항목은 {min} ~ {max}bytes 범위로 해주십시오.', 'isLengthRange' : '{label} 항목은 {min} ~ {max}자(개) 범위로 해주십시오.', 'isNumberMin' : '{label} 항목은 {min} 이상으로 해주십시오.', 'isNumberMax' : '{label} 항목은 {max} 이하로 해주십시오.', 'isNumberRange' : '{label} 항목은 {min} ~ {max} 범위로 해주십시오.', //디버깅 'notMethod' : '{label} 항목에 존재하지 않는 필터를 사용했습니다.', 'isFillError' : "[{label}] 필드의 isFill {condition} 문장이 잘못되었습니다.\r\n해당 필드의 아이디를 확인하세요." }; FwValidator.Handler.overrideMsgs({ //기본 'isFill' : sprintf(__('%s 항목은 필수 입력값입니다.'), '{label}'), 'isNumber' : sprintf(__('%s 항목이 숫자 형식이 아닙니다.'), '{label}'), 'isEmail' : sprintf(__('%s 항목이 이메일 형식이 아닙니다.'), '{label}'), 'isIdentity' : sprintf(__('%s 항목이 아이디 형식이 아닙니다.'), '{label}'), 'isMax' : sprintf(__('%1$s 항목이 %2$s자(개) 이하로 해주십시오.'), '{label}', '{max}'), 'isMin' : sprintf(__('%1$s 항목이 %2$s자(개) 이상으로 해주십시오.'), '{label}', '{min}'), 'isRegex' : sprintf(__('%s 항목이 올바른 입력값이 아닙니다.'), '{label}'), 'isAlpha' : sprintf(__('%s 항목이 영문이 아닙니다.'), '{label}'), 'isAlphaLower' : sprintf(__('%s 항목이 영문 소문자 형식이 아닙니다.'), '{label}'), 'isAlphaUpper' : sprintf(__('%s 항목이 영문 대문자 형식이 아닙니다.'), '{label}'), 'isAlphaNum' : sprintf(__('%s 항목이 영문이나 숫자 형식이 아닙니다.'), '{label}'), 'isAlphaNumLower' : sprintf(__('%s 항목이 영문 소문자 혹은 숫자 형식이 아닙니다.'), '{label}'), 'isAlphaNumUpper' : sprintf(__('%s 항목이 영문 대문자 혹은 숫자 형식이 아닙니다.'), '{label}'), 'isAlphaDash' : sprintf(__('%s 항목이 [영문,숫자,_,-] 형식이 아닙니다.'), '{label}'), 'isAlphaDashLower' : sprintf(__('%s 항목이 [영문 소문자,숫자,_,-] 형식이 아닙니다.'), '{label}'), 'isAlphaDashUpper' : sprintf(__('%s 항목이 [영문 대문자,숫자,_,-] 형식이 아닙니다.'), '{label}'), 'isKorean' : sprintf(__('%s 항목이 한국어 형식이 아닙니다.'), '{label}'), 'isUrl' : sprintf(__('%s 항목이 URL 형식이 아닙니다.'), '{label}'), 'isSsn' : sprintf(__('%s 항목이 주민등록번호 형식이 아닙니다.'), '{label}'), 'isForeignerNo' : sprintf(__('%s 항목이 외국인등록번호 형식이 아닙니다.'), '{label}'), 'isBizNo' : sprintf(__('%s 항목이 사업자번호 형식이 아닙니다.'), '{label}'), 'isPhone' : sprintf(__('%s 항목이 전화번호 형식이 아닙니다.'), '{label}'), 'isMobile' : sprintf(__('%s 항목이 핸드폰 형식이 아닙니다.'), '{label}'), 'isZipcode' : sprintf(__('%s 항목이 우편번호 형식이 아닙니다.'), '{label}'), 'isJuriNo' : sprintf(__('%s 항목이 법인번호 형식이 아닙니다.'), '{label}'), 'isIp' : sprintf(__('%s 항목이 아이피 형식이 아닙니다.'), '{label}'), 'isDate' : sprintf(__('%s 항목이 날짜 형식이 아닙니다.'), '{label}'), 'isMatch' : sprintf(__('%1$s 항목과 %2$s 항목이 같지 않습니다.'), '{label}', '{match}'), 'isSuccess' : sprintf(__('%s 항목의 데이터는 전송할 수 없습니다.'), '{label}'), 'isSimplexEditorFill' : sprintf(__('%s(을/를) 입력하세요.'), '{label}'), 'isPassport' : sprintf(__('%s 항목이 여권번호 형식이 아닙니다.'), '{label}'), 'isMaxByte' : sprintf(__('%1$s 항목은 %2$sbytes 이하로 해주십시오.'), '{label}', '{max}'), 'isMinByte' : sprintf(__('%1$s 항목은 %2$sbytes 이상으로 해주십시오.'), '{label}', '{min}'), 'isByteRange' : sprintf(__('%1$s 항목은 %2$s ~ %3$sbytes 범위로 해주십시오.'), '{label}', '{min}', '{max}'), 'isLengthRange' : sprintf(__('%1$s 항목은 %2$s ~ %3$s자(개) 범위로 해주십시오.'), '{label}', '{min}', '{max}'), 'isNumberMin' : sprintf(__('%1$s 항목은 %2$s 이상으로 해주십시오.'), '{label}', '{min}'), 'isNumberMax' : sprintf(__('%1$s 항목은 %2$s 이하로 해주십시오.'), '{label}', '{max}'), 'isNumberRange' : sprintf(__('%1$s 항목은 %2$s ~ %3$s 범위로 해주십시오.'), '{label}', '{min}', '{max}'), //디버깅 'notMethod' : sprintf(__('%s 항목에 존재하지 않는 필터를 사용했습니다.'), '{label}'), 'isFillError' : sprintf(__('[%1$s] 필드의 isFill %2$s 문장이 잘못되었습니다.\r\n해당 필드의 아이디를 확인하세요.'), '{label}', '{condition}') }); $(document).ready(function(){ /** * 이미지 롤오버 * */ $('img[id^="cate_img_"]') .parent() .mouseover(function(){ var $img = $(this).find('img'); if (!$img.attr('org_src')) $img.attr('org_src', $img.attr('src')); $img.attr('src', $img.attr('rollover')); }) .mouseout(function(){ var $img = $(this).find('img'); $img.attr('src', $img.attr('org_src')); }); /** * 카테고리 상세분류를 보기위한 처리 * 모바일은 온마우스 안됨 * -구스킨은 레이어 무조건 노출중이라사용안함 */ if (mobileWeb != true) { $('.xans-product-displaycategory .button').hover( function() { $(this).addClass('selected'); }, function() { $(this).removeClass('selected'); } ); } else { $('.icoClose').live('click', function(v) { $('.xans-product-displaycategory .button').removeClass('selected'); // event bubbling으로 추가 return false; }); $('.xans-product-displaycategory .button').live('click', function(v) { $('.xans-product-displaycategory .button').removeClass('selected'); $(this).closest('div .button').addClass('selected'); }); } /** * 서브카테고리 display - mouseOver * */ /* $('.xans-product-listcategory a').mouseover(function(){ var pNode = $(this).parents('li'); var sHref = $(this).attr('href') sHref = sHref.substr(sHref.indexOf('?')); var sUrl = '/product/sub_category.html'+sHref; $.get(sUrl, '', function(result) { if (result != '') { $('#product-listcategory-read').remove(); $(pNode).append(''+result+''); $('.xans-product-subcategory').css('left', '100px'); subTop = $('.xans-product-subcategory').css('top').replace('px','') - 20; $('.xans-product-subcategory').css('top', subTop); $('.xans-product-subcategory').mouseover(function() { $('.xans-product-subcategory').show(); }); } }); }); $('.xans-product-listcategory a').mouseout(function(){ //$('#product-listcategory-read').remove(); }); $('[id^="sub_cate"]').mouseout(function(){ $(this).css('display:none;'); }); */ }); /** * 게시판 관련 JS */ $(document).ready(function(){ BOARD.event_bind(); // 게시판메뉴 이미지 롤오버 BOARD.board_img_over(); }); var BOARD = { /** * 게시판 첨부 이미지 로드큐 */ aAttachImageLoadQueue : [], /** * 이벤트 바인딩을 합니다. */ event_bind : function () { $(".eReplyStatusChangeBtn, #eReplyStatusChangeBtn").click(function (event) { event.preventDefault(); // 기존 a 태그 href 동작 해제 BOARD.setReplyStatus(); }); //상품분류 검색 셀렉터 이벤트 바인딩 BOARD.setProductCategorySelector.setEvent(); }, /** * ECHOSTING-70918 * 처리상태에 대한 값을 UPDATE 합니다. */ setReplyStatus : function() { $.ajax({ type : 'post', dataType : 'json', url : getMultiShopUrl("/exec/admin/board/ReplyStatusAjax"), data : { mode : 'UPDATE', board_no : $("#board_no").val(), no : $("#no").val(), reply_status : $("#eReplyStatusChangeTarget").val() }, success : function(aOutputData) { if (aOutputData['result'] == 'T') { BOARD.setSuccessResult(aOutputData); } else { alert("잘못된 접근입니다."); } }, error : function() { alert("네트워크 상태가 불안정 합니다. 잠시 후 다시 시도해주세요"); } }); }, /** * ECHOSTING-70918 * 성공 결과에 대한 피드백을 합니다. */ setSuccessResult : function (aResult) { switch (aResult['status']) { case "N" : alert("처리중 상태가 해제되었습니다."); break; default : alert("처리중으로 변경되었습니다."); break; } // 새로운 상태로 갱신 $("#eReplyStatusText, .eReplyStatusText").html(aResult['new_status_icon']); // 상태 $("#eReplyStatusText, .eReplyStatusText").attr("class", aResult['new_status_style']); // 상태 스타일 $("#eReplyStatusChangeBtn, .eReplyStatusChangeBtn").html(aResult['new_status_btn_icon']); // 버튼 텍스트 $("#eReplyStatusChangeTarget").val(aResult['new_target_status']); // 변경될 값 }, /** * 공지글 보기 */ show_notice : function() { var bFlag = $('input:[type="checkbox"][name="showNotice"]')[0].checked; if (bFlag === true) { $('.mNoticeFlag').each(function(index, node){ $(node).show(); }); } else { $('.mNoticeFlag').each(function(index, node){ $(node).hide(); }); } }, /** * 게시물 복사 * @param link * @param board_no * @param listName */ article_copy : function(link, board_no, listName, aNo, return_url) { if (!aNo) { var aNo = this.check_nos( listName ); if ( aNo.length <= 0 ) { alert(__('복사할 글을 선택하여 주세요.')); return; } } var dest_board_no = $("#boardGroup option:selected").val(); if ( confirm(__("복사하시겠습니까?"))) { location.href = link + "?board_no=" + board_no + "&board_target=" + aNo + "&dest_board_no=" + dest_board_no + "&return_url=" + return_url; } }, /** * 게시물 이동 * @param link * @param board_no * @param listName */ article_move : function(link, board_no, listName, aNo, return_url) { if (!aNo) { var aNo = this.check_nos( listName ); if ( aNo.length <= 0 ) { alert(__('이동할 글을 선택하여 주세요.')); return; } } var dest_board_no = $("#boardGroup option:selected").val(); if (board_no == dest_board_no) { alert(__('동일한 게시판으로 게시물을 이동 할 수 없습니다.')); return false; } location.href = link + "?board_no=" + board_no + "&board_target=" + aNo + "&dest_board_no=" + dest_board_no + "&return_url=" + return_url; }, /** * 카테고리 이동 * @param link * @param board_no * @param listName */ category_move : function(link, board_no, listName, return_url) { var aNo = this.check_nos( listName ); if ( aNo.length <= 0 ) { alert(__('이동할 글을 선택하여 주세요.')); return; } var dest_category = $("#board_category_move option:selected").val(); location.href = link + "?board_no=" + board_no + "&board_target=" + aNo + "&dest_category=" + dest_category + "&return_url=" + return_url; }, is_spam : function(mode, bbs_no, bbs_type, listName, return_url) { if (bbs_no == ''){ var bbs_no = this.check_nos(listName); if (bbs_no.length <= 0) { alert(__('댓글을 선택하여 주세요.')); return; } } if (mode == 'move') { return_url = (return_url)? '&return_url='+return_url : ''; this.OpenWindow('/admin/php/b/board_spam_regist.php?mode='+mode+'&bbs_type='+bbs_type+'&bbs_no='+bbs_no+return_url, 'spamRegist', '450', '350','no'); } else { this.OpenWindow('/admin/php/b/board_spam_restore.php?mode='+mode+'&bbs_type='+bbs_type+'&bbs_no='+bbs_no, 'spamRestore', '470', '350','yes'); } }, /** * 관리자 설정에 따른 제목, 컨텐츠 고정하기 */ fix_subject_content : function(sAgent) { $("select[name='subject']").change(function(){ if ($("#fix_content_" + this.selectedIndex).val() != undefined) { var content = $("#fix_content_" + this.selectedIndex).val() + $("#fix_add_content").val(); } else { if ($("#fix_add_content").val() != undefined) { var content = $("#fix_add_content").val(); } else { var content = ''; } } // 답변, 수정 모드에서는 컨텐츠 영역이 수정되지 않도록 한다. if ($('#no').length == 0 && content != '') { if (sAgent == true) { $("#content").val(content); } else { $("#content_IFRAME").get(0).contentWindow.document.body.innerHTML = content; } } }); }, /** * 항상 비밀글 사용하기 */ disable_secret : function() { $("#secure0").attr({ "checked": "", "disabled" : "disabled" }); $("#secure1").attr("checked", "checked"); }, /** * 게시판메뉴 이미지 롤오버 */ board_img_over : function() { $(".board_img_over").hover(function(){ $(this).attr('src',$(this).attr('eImgOver')) }, function(){ $(this).attr('src',$(this).attr('eImgout')) }) }, /** * 폼 submit * @param string sFormName 폼 name */ form_submit : function(sFormName) { // 서밋 위치를 BOARD_WRITE로 변경 $('#'+sFormName).submit(); }, /** * 리스트 정렬 submit * @param string sFormName 폼 name */ change_sort : function(sFormName, obj) { $('#'+sFormName+' [id="board_sort"]').val(obj.value); $('#'+sFormName).submit(); }, /** * 답변여부 선택 select * @param element obj select element */ change_reply_sort: function(obj) { var sQueryString = document.location.search.substr(1); var aParams = {}; $.each(sQueryString.split('&'), function(i, str){ var sKey = str.substr(0, str.indexOf('=')); if ('page' !== sKey) { var sVal = str.substr(str.indexOf('=')+1); aParams[sKey] = sVal; } }); aParams['is_reply_sort'] = $(obj).val(); var aUrls = []; $.each(aParams, function(sKey, sVal){ if ('' !== $.trim(sVal)) { aUrls.push(sKey+'='+$.trim(sVal)); } }); document.location.href = document.location.pathname+'?'+aUrls.join('&'); }, /** * 상품후기 리스트 펼침 * @param int iNo 글번호 * @param int iBoardNo 게시판번호 * @param object obj */ viewTarget : function(iNo, iBoardNo, obj) { var self = this; var elmTarget = $(obj); if (elmTarget.parents('tr').next().attr('id') == 'content_view') { elmTarget.find('img').attr('src', function() { return this.src.replace('_fold','_unfold'); }); self.changeFoldImg(obj); $('#content_view').remove(); return; } else { $('#content_view').remove(); var aData = { 'no' : iNo, 'board_no' : iBoardNo } $.get('/exec/front/board/Get/'+iBoardNo, aData, function(req) { if (req.failed == false) { var rData = req.data; elmTarget.find('img').attr('src', function() { return this.src.replace('_unfold','_fold'); }); self.changeFoldImg(obj); var aHtml = []; aHtml.push(''); aHtml.push(' '); elmTarget.parents('tr').after(aHtml.join('')); } else { BOARD.setBulletinSpreadFail(req.data); }; }, 'json'); } }, setBulletinSpreadFail : function (sFailType) { switch(sFailType) { case 'S' : alert(__('비밀글은 미리보기가 불가 합니다.')); break; case 'M' : alert(__('회원에게만 읽기 권한이 있습니다')); break; case 'A' : alert(__('관리자에게만 읽기 권한이 있습니다')); break; } }, /** * 폴딩 이미지 변환 * 현재 클릭한 이미지 이외에는 모두 '닫힘' 이미지로 만들기 위함 * * @param HtmlElement obj */ changeFoldImg : function(obj) { var elmEventList = $('[onclick*="BOARD.viewTarget"]'); elmEventList.each(function(){ if (obj !== this) { $(this).find('img').attr('src', function() { return this.src.replace('_fold','_unfold'); }); } }); }, /** * 관리자 댓글보기 (관리자전용) */ pre_comment : function() { this.OpenWindow('/admin/php/b/board_admin_pre_comment_l.php?mode=popup', 'pre_comment', '800', '500','auto'); }, /** * 첨부이미지 미리보기 * @param sId * @param sFlag */ afile_display : function (sId, sFlag) { if (sFlag == 1) { $('#'+sId).css('display', ''); $('#'+sId).css('position', 'absolute'); } else { $('#'+sId).css('display', 'none'); } }, /** * 첨부이미지 로딩 * @param sId 로드될 타겟 아이디 * @param sFlag 노출여부 * @param iBoardNo 게시판 번호 */ load_attached_image : function(sId, sFlag, iBoardNo) { /* * 게시물 번호 계산 * sId는 항상 "afile_" 이 prefix 됨 */ var iBulletinNo = sId.substr(6,sId.length); //큐에서 해당 게시물의 이미지가 로드중 또는 로드되었는지 체크 var iPosition = $.inArray(iBulletinNo, this.aAttachImageLoadQueue); var oTarget = $('#'+sId); //큐 체크 if (iPosition === -1) { this.aAttachImageLoadQueue.push(iBulletinNo); var sRequestUrl = '/exec/front/Board/Get?no='+ iBulletinNo +'&board_no='+iBoardNo; $.get(sRequestUrl, function(oResponse){ //로드 성공 if (oResponse.failed === false) { oTarget.append(oResponse.data.thumbnail_image); BOARD.afile_display(sId, sFlag); } //로드 실패 else { //큐에서 제거처리하여, 다시 로드 가능하도록 변경 BOARD.aAttachImageLoadQueue.splice(iPosition,1); } },'json'); } //이미지 존재 체크 if (oTarget.children().is('img') === true) { BOARD.afile_display(sId, sFlag); } }, /** * 게시판 목록 선택 갯수 체크 * @param listName * @returns {Array} */ check_nos : function(listName) { var aNo = []; $("." + listName).each(function(){ if ( this.checked ) { aNo.push( this.value ); } }); return aNo; }, /** * window.open * @param StrPage * @param StrName * @param w * @param h * @param scrolls */ OpenWindow : function(StrPage, StrName, w, h,scrolls) { var win = null; var winl = (screen.width-w)/2; var wint = (screen.height-h)/3; settings = 'height='+h+','; settings += 'width='+w+','; settings += 'top='+wint+','; settings += 'left='+winl+','; settings += 'scrollbars='+scrolls+','; settings += 'resizable=no,'; settings += 'status=no'; // SSL 적용 (ECHOSTING-214739) if (StrPage.indexOf('http') != 0) { StrPage = window.location.protocol + '//' + window.location.host + StrPage; } win = window.open(StrPage, StrName, settings); if (parseInt(navigator.appVersion)>=4) { win.window.focus(); } }, /** * 상품 분류 검색 셀렉터 */ setProductCategorySelector : { /* * 중,소,세 분류 초기화 */ resetCategory : function(oSelectBox) { for (var i=oSelectBox.children().length - 1; i>0; i--) { oSelectBox.children().eq(i).remove(); } }, /* * 하위분류 가져오기 */ getChildCategory : function(iProductCategoryNumber, oSelectBox) { var regexp = /[0-9]+/; if (regexp.test(iProductCategoryNumber) === false || oSelectBox.length === 0) return ; var sUrl = "/exec/front/Product/SubCategory?parent_cate_no="+iProductCategoryNumber; $.get(sUrl, function(oResponse) { BOARD.setProductCategorySelector.setChildCategory(oSelectBox, oResponse); }, 'json'); }, /* * 하위분류 가져오기 Callback 함수 * 하위분류 셀렉트박스 옵션추가 */ setChildCategory : function(oSelectBox, aChildCategory) { if (aChildCategory.length === 0 || oSelectBox.length === 0) return ; var sOption = ''; for (var i=0; i'); if (rData.content_image != null) aHtml.push(''+rData.content_image+' '); aHtml.push('
'); if (typeof(rData.content) != 'undefined') { aHtml.push(rData.content); } aHtml.push('"+ aChildCategory[i]['category_name'] +""; } oSelectBox.append(sOption); }, /** * 이벤트 바인딩 */ setEvent : function() { var oSelector = BOARD.setProductCategorySelector; /* * 1뎁스 변경처리 * - 중,소,세 분류 초기화 * - 중분류 옵션 추가 */ $("#product_category_depth1").change(function(){ if ($(this).val() !== $(this).attr("history")) { oSelector.resetCategory($("#product_category_depth2")); oSelector.resetCategory($("#product_category_depth3")); oSelector.resetCategory($("#product_category_depth4")); $(this).attr("history", $(this).val()); } oSelector.getChildCategory($(this).val(), $("#product_category_depth2")); }); /* * 2뎁스 변경처리 * - 소,세분류 초기화 * - 소분류 옵션 추가 */ $("#product_category_depth2").change(function(){ if ($(this).val() !== $(this).attr("history")) { oSelector.resetCategory($("#product_category_depth3")); oSelector.resetCategory($("#product_category_depth4")); $(this).attr("history", $(this).val()); } oSelector.getChildCategory($(this).val(), $("#product_category_depth3")); }); /* * 3뎁스 변경처리 * - 세분류 초기화 * - 세분류 옵션 추가 */ $("#product_category_depth3").change(function(){ if ($(this).val() !== $(this).attr("history")) { oSelector.resetCategory($("#product_category_depth4")); $(this).attr("history", $(this).val()); } oSelector.getChildCategory($(this).val(), $("#product_category_depth4")); }); } }, /** * 캡차 새로고침 */ refresh_captcha : function(sType, iNo) { var sCaptchaId = 'captcha_' + sType; if (iNo != '') sCaptchaId += '_' + iNo; $('#'+sCaptchaId).attr('src', '/exec/front/board/captcha?no='+iNo+'&type='+sType+'&'+new Date().getTime()); }, END : function() {} }; /** * jQuery JSON Plugin * version: 2.3 (2011-09-17) * * This document is licensed as free software under the terms of the * MIT License: http://www.opensource.org/licenses/mit-license.php * * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org * website's http://www.json.org/json2.js, which proclaims: * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that * I uphold. * * It is also influenced heavily by MochiKit's serializeJSON, which is * copyrighted 2005 by Bob Ippolito. */ (function( $ ) { var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g, meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }; /** * jQuery.toJSON * Converts the given argument into a JSON respresentation. * * @param o {Mixed} The json-serializble *thing* to be converted * * If an object has a toJSON prototype, that will be used to get the representation. * Non-integer/string keys are skipped in the object, as are keys that point to a * function. * */ $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function( o ) { if ( o === null ) { return 'null'; } var type = typeof o; if ( type === 'undefined' ) { return undefined; } if ( type === 'number' || type === 'boolean' ) { return '' + o; } if ( type === 'string') { return $.quoteString( o ); } if ( type === 'object' ) { if ( typeof o.toJSON === 'function' ) { return $.toJSON( o.toJSON() ); } if ( o.constructor === Date ) { var month = o.getUTCMonth() + 1, day = o.getUTCDate(), year = o.getUTCFullYear(), hours = o.getUTCHours(), minutes = o.getUTCMinutes(), seconds = o.getUTCSeconds(), milli = o.getUTCMilliseconds(); if ( month < 10 ) { month = '0' + month; } if ( day < 10 ) { day = '0' + day; } if ( hours < 10 ) { hours = '0' + hours; } if ( minutes < 10 ) { minutes = '0' + minutes; } if ( seconds < 10 ) { seconds = '0' + seconds; } if ( milli < 100 ) { milli = '0' + milli; } if ( milli < 10 ) { milli = '0' + milli; } return '"' + year + '-' + month + '-' + day + 'T' + hours + ':' + minutes + ':' + seconds + '.' + milli + 'Z"'; } if ( o.constructor === Array ) { var ret = []; for ( var i = 0; i < o.length; i++ ) { ret.push( $.toJSON( o[i] ) || 'null' ); } return '[' + ret.join(',') + ']'; } var name, val, pairs = []; for ( var k in o ) { type = typeof k; if ( type === 'number' ) { name = '"' + k + '"'; } else if (type === 'string') { name = $.quoteString(k); } else { // Keys must be numerical or string. Skip others continue; } type = typeof o[k]; if ( type === 'function' || type === 'undefined' ) { // Invalid values like these return undefined // from toJSON, however those object members // shouldn't be included in the JSON string at all. continue; } val = $.toJSON( o[k] ); pairs.push( name + ':' + val ); } return '{' + pairs.join( ',' ) + '}'; } }; /** * jQuery.evalJSON * Evaluates a given piece of json source. * * @param src {String} */ $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function( src ) { return eval('(' + src + ')'); }; /** * jQuery.secureEvalJSON * Evals JSON in a way that is *more* secure. * * @param src {String} */ $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function( src ) { var filtered = src .replace( /\\["\\\/bfnrtu]/g, '@' ) .replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') .replace( /(?:^|:|,)(?:\s*\[)+/g, ''); if ( /^[\],:{}\s]*$/.test( filtered ) ) { return eval( '(' + src + ')' ); } else { throw new SyntaxError( 'Error parsing JSON, source is not valid.' ); } }; /** * jQuery.quoteString * Returns a string-repr of a string, escaping quotes intelligently. * Mostly a support function for toJSON. * Examples: * >>> jQuery.quoteString('apple') * "apple" * * >>> jQuery.quoteString('"Where are we going?", she asked.') * "\"Where are we going?\", she asked." */ $.quoteString = function( string ) { if ( string.match( escapeable ) ) { return '"' + string.replace( escapeable, function( a ) { var c = meta[a]; if ( typeof c === 'string' ) { return c; } c = a.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; } return '"' + string + '"'; }; })( jQuery ); /** * 상품연동형 js - for 프론트 */ ;(function($) { var $Olnk = { iOlinkTotalPrice : 0, // 저장형 옵션의 가격 iAddOptionTotalPrice : 0, // 추가 구성상품의 가격 aOptionData : new Array(), // 순차적 로딩을 위한 배열 iOptionAddNum : 1, // 필수값을 표시하기 위한 번호 iOptionAddProductNum : 1, aOptionAddProductNum : new Array(), aOptionProductData : new Array(), aOptionProductDataListKey : new Array(), bAllSelectedOption : false, getOlnkSelectedItem : function(aStockData, bButton, sDispNonePrice, iProductPrice) { var aOption = new Array(); var bItemSelected = false; var bResult = true; var sOptionId = ''; var iOptPrice = 0; var iPrdPrice = SHOP_PRICE.toShopPrice(iProductPrice); // 운영방식설정 > 회원/비회원 가격표시 설정 반영 if (sDispNonePrice == 'T') { iTotalPrice = 0; } else { $('select[id^="product_option_id"]').each(function() { var iValNo = parseInt($(this).val()); if (isNaN(iValNo) === true) { return; } iOptPrice += SHOP_PRICE.toShopPrice(aStockData[iValNo].option_price); sOptionId = iValNo; }); iTotalPrice = iPrdPrice + iOptPrice; } $('select[id^="' + product_option_id + '"]').each(function() { if (Boolean($(this).attr('required')) === false && $(this).val() === '*') { return true; } aOption.push($(this).val()); }); // 전부 선택인 옵션만 있고 선택된 옵션이 없을때 if ((Olnk.bAllSelectedOption === true || bButton === true) && aOption.length === 0) { bItemSelected = true; sOptionId = sProductCode; } else if (ITEM.isOptionSelected(aOption) === true) { bItemSelected = true; } // 버튼으로 처리 했을때 선택이 모두 되어 있지 않다면 튕겨 내자 if (bButton === true && bItemSelected === false && aOption.length > 0) { alert(__('필수 옵션을 선택해주세요.')); bResult = false; } // 추가입력옵션 체크!! if (bButton === true && checkAddOption() === false) { bItemSelected = false; } return {'bResult' : bResult, 'bItemSelected' : bItemSelected, 'aOption' : aOption, 'sOptionId' : sOptionId, 'iTotalPrice' : iTotalPrice}; }, /** * 최종가격 표시 핸들링 - 상품상세 */ handleTotalPrice : function(sOptionStockData, iProductPrice, sDispNonePrice, bButton, iManualQuantity) { var aStockData = $.parseJSON(sOptionStockData); var sOptionId = ''; var iTotalPrice = 0; var iCnt = 1; var sQuantity = '('+sprintf(__('%s개'), iCnt)+')'; var sPrice = ''; // 옵션 선택 완료 되었을때 check var aOption = new Array(); var aRequiredData = new Array(); var sOptionText = ''; var aOptionText = new Array(); var bItemSelected = false, bSoldOut = false; var iTotalQuantity = 0; var aItemSelectInfo = Olnk.getOlnkSelectedItem(aStockData, bButton, sDispNonePrice, iProductPrice); bResult = aItemSelectInfo.bResult; bItemSelected = aItemSelectInfo.bItemSelected; aOption = aItemSelectInfo.aOption; if (aItemSelectInfo.sOptionId !== '') { sOptionId = aItemSelectInfo.sOptionId; } iTotalPrice = aItemSelectInfo.iTotalPrice; if (bItemSelected === true) { var sOptionText = ''; var iStockNumber = aStockData[sOptionId].stock_number; var bStock = aStockData[sOptionId].use_stock; var useSoldOut = aStockData[sOptionId].use_soldout; var sIsDisplay = aStockData[sOptionId].is_display; var sIsSelling = aStockData[sOptionId].is_selling; var sIsReserveStat = aStockData[sOptionId].is_reserve_stat; //예약주문R|Q당일발송 var iBuyUnit = EC_FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity('base'); var iProductMin = EC_FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); var iQuantity = (iBuyUnit >= iProductMin ? iBuyUnit : iProductMin); if (typeof(iManualQuantity) !== 'undefined') { iQuantity = iManualQuantity; } if (sIsSelling == 'F' || ((iStockNumber < buy_unit || iStockNumber <= 0) && ( (bStock === true && useSoldOut === 'T' ) || sIsDisplay == 'F'))) { bSoldOut = true; sOptionText = ' ['+__('품절')+']'; } if (bSoldOut === true && isNewProductSkin() === false) { alert(__('이 상품은 현재 재고가 부족하여 판매가 잠시 중단되고 있습니다.') + '\n\n' + __('제품명') + ' : ' + product_name ); return; } //( 품절 or 추가메시지) if (aReserveStockMessage['show_stock_message'] === 'T' && sIsReserveStat !== 'N') { var sReserveStockMessage = ''; bSoldOut = false; //품절 사용 안함 sReserveStockMessage = aReserveStockMessage[sIsReserveStat]; sReserveStockMessage = sReserveStockMessage.replace(aReserveStockMessage['stock_message_replace_name'], iStockNumber); sOptionText = sOptionText.replace(sReserveStockMessage, '') + ' '+sReserveStockMessage+''; } // 옵션 선택시 재고 수량이 현재 선택되어진 수량보다 적을 경우 alert처리후에 return합니다. $('.option_box_id').each(function(i) { iTotalQuantity += parseInt($('#' + $(this).attr('id').replace('id','quantity')).val()); }); if (iTotalQuantity > 0) { iTotalQuantity += iQuantity; if (((iStockNumber < iTotalQuantity || iStockNumber <= 0) && ((bStock === true && useSoldOut === 'T' ) || sIsDisplay == 'F'))) { alert(__('재고 수량이 부족하여 더이상 옵션을 추가하실 수 없습니다.')); return; } } sOptionId = ''; if ((Olnk.bAllSelectedOption === true || bButton === true) && aOption.length === 0) { $('select[id^="' + product_option_id + '"]').each(function() { sSelectedOptionId = $(this).attr('id'); sOptionId += $(this).val() + '_'+$(this).attr('option_code') +'||'; }); aOptionText.push( __('선택한 옵션 없음')); } else { $('select[id^="' + product_option_id + '"]').each(function() { if ($(this).attr('required') === false && $(this).val() === '*') { return true; } if (Olnk.getCheckValue($(this).val(),'') === true) { sSelectedOptionId = $(this).attr('id'); aOptionText.push( $('#'+sSelectedOptionId+ ' option:selected').text()); } sOptionId += $(this).val() + '_'+$(this).attr('option_code') +'||'; }); } iProductPrice = getProductPrice(iQuantity, iTotalPrice, sOptionId, bSoldOut, function(iProductPrice){ if (isNewProductSkin() === false) { if (sIsDisplayNonmemberPrice == 'T') { $('#span_product_price_text').html(sNonmemberPrice); } else { $('#span_product_price_text').html(SHOP_PRICE_FORMAT.toShopPrice(iProductPrice)); } } else { setOptionBox(sOptionId, (aOptionText.join('/')) + ' ' + sOptionText , iProductPrice, bSoldOut, sSelectedOptionId, sIsReserveStat, iManualQuantity); } }); } }, getOlinkOptionKey : function() { var sOptionId = ''; $('select[id^="' + product_option_id + '"]').each(function() { if ($(this).attr('required') === false && $(this).val() === '*') { return true; } sOptionId += $(this).val() + '_'+$(this).attr('option_code') +'||'; }); return sOptionId; }, /** * 장바구니 담기시 필요한 파라미터 생성 */ getSelectedItemForBasket : function(sProductCode, oTargets, iQuantity) { var options = {}; var aOptionData ,aOptionTmp; var bCheckNum = false; oTargets.each(function() { aOptionData = {}; if ($(this).val().indexOf('||') >= 0) { aOptionTmp = $(this).val().split('||'); for (i = 0 ; i < aOptionTmp.length ; i++) { if (aOptionTmp[i] !== '') { aOptionData = aOptionTmp[i].split('_'); } if (Olnk.getCheckValue(aOptionData[0],'') === true) { options[aOptionData[1]] = aOptionData[0]; bCheckNum = true; } } } else { var optCode = $(this).attr('option_code'); var optValNo = parseInt($(this).val()); if (optCode == '' || optCode == null) { return null; } if (isNaN(optValNo) === true) { optValNo = ''; } if (optValNo !== '') { options[optCode] = optValNo; bCheckNum = true; } } }); return { 'product_code' : sProductCode, 'quantity' : iQuantity, 'options' : options, 'bCheckNum' : bCheckNum }; }, /** * 관심상품 담기시 필요한 파라미터 생성 */ getSelectedItemForWish : function(sProductCode, oTargets) { var options = {}; var bCheckNum = false; var aOptionData ,aOptionTmp; $(oTargets).each(function() { aOptionTmp = $(this).val().split('||'); aOptionData = {}; options = {}; for (i = 0 ; i < aOptionTmp.length ; i++) { if (aOptionTmp[i] !== '') { aOptionData = aOptionTmp[i].split('_'); } //if (/^\*+$/.test(aOptionData[0]) === false) { if (Olnk.getCheckValue(aOptionData[0],'') === true) { options[aOptionData[1]] = aOptionData[0]; bCheckNum = true; } } }); return { 'product_code' : sProductCode, 'options' : options, 'bCheckNum' : bCheckNum }; }, /** * 선택된 품목정보 반환 * 상품연동형에서는 item_code 가 선택한 옵션을 뜻하지 않으므로 * 호환성을 위한 모조 값만 할당해준다. */ getMockItemInfo : function(aInfo) { var aResult = { 'product_no' : aInfo.product_no, 'item_code' : aInfo.product_code + '000A', 'opt_id' : '000A', 'opt_str' : '' }; return aResult; }, /** * 상품연동형 옵션인지 여부 반환 */ isLinkageType : function(sOptionType) { if (typeof sOptionType == 'string' && sOptionType == 'E') { return true; } return false; }, /** * 상품상세(NewProductAction) 관련 js 스크립트를 보면, create_layer 라는 함수가 있다. * 해당 함수는 ajax 콜을 해서 레이어 팝업으로 띄울 소스코드를 불러오게 되는데, 이때 스크립트 태그도 같이 따라온다. * 해당 스크립트 태그에서 불러오는 js 파일내부에는 동일한 jquery 코드가 다시한번 오버라이딩이 되는데 * 이렇게 되면 기존에 물려있던 extension 메소드들은 초기화되어 날아가게 된다. * * 레이어 팝업이 뜨고 나서, $ 내에 존재해야할 메소드나 멤버변수들이 사라졌다면 이와 같은 현상때문이다. * 가장 이상적인 처리는 스크립트 태그를 없애는게 가장 좋으나 호출되는 스크립트에 의존적인 코드가 존재하는것으로 보인다. * 해당영역이 완전히 파악되기 전까진 필요한 부분에서만 예외적으로 동작할 수 있도록 한다. */ bugfixCreateLayerForWish : function() { var __nil = jQuery.noConflict(true); }, /** * 장바구니 담기시 필요한 파라미터를 일부 조작 */ hookParamForBasket : function(aParam, aInfo) { if (aInfo.option_type != 'E') { return aParam; } var aItemCode = this.getSelectedItemForBasket(aInfo.product_code, aInfo.targets, aInfo.quantity); aParam['item_code_before'] = ''; aParam['option_type'] = 'E'; aParam['selected_item_by_etype[]'] = $.toJSON(aItemCode); return aParam; }, /** * 관심상품 담기시 필요한 파라미터를 일부 조작 */ hookParamForWish : function(aParam, aInfo) { if (aInfo.option_type != 'E') { return aParam; } var aItemCode = {}; // // aInfo.targets 는 구스킨을 사용했을 때 출력되는 옵션 셀렉트 박스의 엘리먼트 객체인데, // 현재 뉴스킨과 구스킨 구분을 아이디값이 wishlist_option_modify_layer_ 에 해당되는 노드가 // 있는지로 판별하기 때문에 모호함이 존재한다. // 즉, 뉴스킨을 사용해도 해당 노드가 존재하지 않는 조건이 발생할 수 있기 때문이다. // 예를 들면, 관심상품상에 담긴 리스트가 모두 옵션이 없는 상품만 있는 경우이거나 아니면 // 옵션이 존재하지만 아무것도 선택되지 않은 상품인 경우 발견이 되지 않을 수 있다. // 그러므로 이런 경우엔 셀렉트박스를 통해 선택된 옵션을 파악하는 것이 아니라, // 현재 할당되어 있는 데이터를 기준으로 파라미터를 세팅하도록 한다. // if (aInfo.targets.length > 0) { aItemCode = this.getSelectedItemForBasket(aInfo.product_code, aInfo.targets, aInfo.quantity); } else { aItemCode = aInfo.selected_item_by_etype; } aParam.push('option_type=E'); aParam.push('selected_item_by_etype[]=' + $.toJSON(aItemCode)); return aParam; }, /** * 장바구니 담기시 필요한 파라미터 생성 - 구스킨 전용 뉴스킨 사용안함. */ getSelectedItemForBasketOldSkin : function(sProductCode, oTargets, iQuantity) { var options = {}; var optCode = ''; var optValNo = ''; var bCheckNum = false; oTargets.each(function() { optCode = $(this).attr('option_code'); optValNo = parseInt($(this).val()); if (optCode == '' || optCode == null) { return null; } if (isNaN(optValNo) === false) { options[optCode] = $(this).val(); bCheckNum = true; } }); return { 'product_code' : sProductCode, 'quantity' : iQuantity, 'options' : options, 'bCheckNum' : bCheckNum }; }, /** * 관심상품 담기시 필요한 파라미터 생성 */ getSelectedItemForWishOldSkin : function(sProductCode, oTargets) { var options = {}; var isReturn = true; var bCheckNum = false; oTargets.each(function() { if (isReturn === false) { isReturn = false; return; } var optCode = $(this).attr('option_code'); var optValNo = parseInt($(this).val()); // // 필수입력값 체크 // if (Boolean($(this).attr('required')) === true) { if (isNaN(optValNo) === true) { isReturn = false; return false; } } if (optCode == '' || optCode == null) { isReturn = false; return; } if (isNaN(optValNo) === false) { options[optCode] = optValNo; bCheckNum = true; } }); if (isReturn === true) { return { 'product_code' : sProductCode, 'options' : options, 'bCheckNum' : bCheckNum }; } return false; }, /* * 상단 옵션 선택후 alert후 옵션 재세팅 ( 상위 옵션이 재 세팅되면 해당 옵션에 하단 옵션들은 reset) */ getOptionCheckData : function(oTarget) { //if ((/^\*+$/.test(oTarget.val()) === true && Boolean(oTarget.attr('required')) === true) || oTarget.attr('id') === undefined) { if ((Olnk.getCheckValue(oTarget.val(),'') === false && Boolean(oTarget.attr('required')) === true) || oTarget.attr('id') === undefined) { return false; } return true; }, /** * 재고 체크 ( 구스킨에서 action시에 필요함. * 각각의 수량을 전부 합치고 그 합친 수량과 재고 체크 * @param sOptionId 옵션 id * @returns 품절여부 */ getStockValidate : function (sOptionId , iQuantity) { var aStockData = $.parseJSON(option_stock_data); var bSoldOut = false; var iStockNumber , bStock , bStockSoldOut; // get_stock_info if (aStockData[sOptionId] == undefined) { iStockNumber = -1; bStock = false; bStockSoldOut = 'F'; } else { iStockNumber = aStockData[sOptionId].stock_number; bStock = aStockData[sOptionId].use_stock; bStockSoldOut = aStockData[sOptionId].use_soldout; } if (bStockSoldOut == 'T' && bStock === true && (iStockNumber < iQuantity)) { bSoldOut = true; } return bSoldOut; }, /* * check value */ getCheckValue : function (oTargetValue , oTarget) { if (/^\*+$/.test(oTargetValue) === true) { if (oTarget !== '') { oTarget.val('*'); } return false; } return true; }, /* * 추가 구성상품의 재고 체크 * @param aOptionBoxInfo 추가 구성상품 데이터 */ getAddProductStock : function (aOptionBoxInfo) { var iTotalQuantity = aOptionBoxInfo['iTotalQuantity']; if (this.isLinkageType(aOptionBoxInfo['option_type']) === true) { $('.option_add_box_'+aOptionBoxInfo['product_no']).each(function() { // 수량 증가시 본인꺼는 빼야 한다.. if (aOptionBoxInfo['sOptionBoxId'] !== $(this).attr('id')) { iTotalQuantity += parseInt(iQuantity = $('#' + $(this).attr('id').replace('id','quantity')).val()); } }); if (aOptionBoxInfo['is_stock'] === true && aOptionBoxInfo['use_soldout'] === true && aOptionBoxInfo['stock_number'] < iTotalQuantity) { alert(sprintf(__('%s 의 재고가 부족합니다.'), aOptionBoxInfo['title'])); //alert(aOptionBoxInfo['title'] + ' - ' + __('의 재고가 부족합니다.')); return false; } } }, /* * 모든 상품의 옵션이 선택일때 옵션박스가 떨궈ption = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedElement(oOptionChoose); if (typeof(oSelectedOption.attr('link_image')) === 'undefined' || oSelectedOption.attr('link_image').length < 1) { return; } $(this.sDetailImageClass).attr('src', oSelectedOption.attr('link_image')); }, /** * 옵션 전체 선택완료후 해당 옵션품목에 연결된 이미지를 상세이미지에 반영되도록 함 * @todo 이거 아직 안했어여 ㅠㅠ * @param oOptionChoose 구분할 옵션박스 object * @returns null */ completeCallback : function(oOptionChoose) { //연동형은 제외 if (Olnk.isLinkageType(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose)) === true) { return ; } if (this.isDisplayImage(oOptionChoose) === false) { return; } var sItemCode = EC_SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(oOptionChoose); if (sItemCode === false) { return; } var iProductNo = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); var aStockData = EC_SHOP_FRONT_NEW_OPTION_DATA.getProductStockData(iProductNo); if (typeof(aStockData[sItemCode].item_image_file) !== 'undefined' && $.trim(aStockData[sItemCode].item_image_file) !== '') { $(this.sDetailImageClass).attr('src', aStockData[sItemCode].item_image_file); } }, /** * 이미지 출력이 가능한지 확인 */ isDisplayImage : function(oOptionChoose) { if (typeof(mobileWeb) !== 'undefined' && mobileWeb === true) { this.sDetailImageClass = '.bigImage'; } else { this.sDetailImageClass = '.BigImage'; } //상세이미지가 없다면 패스 if ($(this.sDetailImageClass).length < 1) { return false; } //추가구성상품등은 모두 제외하고 상품상세의 대표상품만 변경 if (/^product_option_+/.test(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectGroup(oOptionChoose)) === false) { return false; } return true; } }; /** * 버튼 또는 미리보기 옵션일 경우 지정된 엘리먼트에 선택한 옵션값 보여주기 */ var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM = { TARGET_ELEMENT_CLASS : '.ec-shop-front-product-option-desc-trigger', /** * 각 옵션선택시마다 이미지가 있다면 상세이미지에 반영되도록 함 * @param oOptionChoose 구분할 옵션박스 object * @returns null */ eachCallback : function(oOptionChoose) { //버튼 또는 미리보기 옵션이 아니면 리턴 if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) { return; } //셀렉터에 ""를 안붙이면 가끔 특정상횡에서 스크립트오류 var oTarget = $(oOptionChoose).closest('.xans-element- .xans-product').find("" + this.TARGET_ELEMENT_CLASS + ""); //디자인이 없다면 패스 if ($(oTarget).length < 1) { return; } var sText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedText(oOptionChoose); //선택항목에 text가 있다면 //추후에 셀렉트박스가 추가된다면... *나 **가 선택되었다면 예외처리해야함 if (typeof(sText) !== 'undefined' && $.trim(sText) !== '') { $(oTarget).removeClass('ec-product-value').addClass('ec-product-value'); $(oTarget).html(sText); } else { $(oTarget).removeClass('ec-product-value'); $(oTarget).html($(oTarget).attr('data-option_msg')); } } }; /** * 뉴상품 옵션 셀렉트 공통파일 */ var EC_SHOP_FRONT_NEW_OPTION_COMMON = { cons : null, data : null, bind : null, validation : null, /** * 페이지 로드가 완료되었는지 */ isLoad : false, initObject : function() { this.cons = EC_SHOP_FRONT_NEW_OPTION_CONS; this.data = EC_SHOP_FRONT_NEW_OPTION_DATA; this.bind = EC_SHOP_FRONT_NEW_OPTION_BIND; this.validation = EC_SHOP_FRONT_NEW_OPTION_VALIDATION; }, /** * 페이지 로딩시 초기화 */ init : function() { var oThis = this; //조합분리형이지만 옵션이 1개인경우 var bIsSolidOption = false; //첫 로드시에는 첫번째 옵션만 검색 $('select[option_select_element="ec-option-select-finder"][option_sort_no="1"], ul[option_select_element="ec-option-select-finder"][option_sort_no="1"]').each(function() { //연동형이 아닌고 분리형일때만 실행 bIsSolidOption = false; if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(this) === true) { if (Olnk.isLinkageType($(this).attr('option_type')) === false) { if (parseInt($('[product_option_area="'+oThis.getOptionSelectGroup(this)+'"]').length) < 2) { bIsSolidOption = true; } oThis.data.initializeSoldoutFlag($(this)); oThis.setOptionText($(this), bIsSolidOption); } } }); }, /** * 옵션상품인데 모든옵션이 판매안함+진열안함일때 예외처리 * @param sProductOptionID 옵션 Selectbox ID */ isValidOptionDisplay : function(sProductOptionID) { var iOptionCount = 0; $('select[option_select_element="ec-option-select-finder"][id^="' + sProductOptionID + '"], ul[option_select_element="ec-option-select-finder"][ec-dev-id^="' + sProductOptionID + '"]').each(function() { if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { iOptionCount += $(this).find('li').length; } else { iOptionCount += $(this).find('option').length - 2; } }); return iOptionCount > 0; }, /** * 각 옵션에대해 전체품절인지 확인후 */ setOptionText : function(oOptionChoose, bIsSolidOption) { var bIsStyleButton = this.isOptionStyleButton(oOptionChoose); if (bIsStyleButton === true) { var oTargetOption = $(oOptionChoose).find('li'); } else { var oTargetOption = $(oOptionChoose).find('option').filter('[value!="*"][value!="**"]'); } var bIsDisplaySolout = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSoldoutOptionDisplay(); var iProductNum = this.getOptionProductNum(oOptionChoose); var oThis = this; $(oTargetOption).each(function() { var sValue = oThis.getOptionValue(oOptionChoose, $(this)); var isSoldout = EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue); var bIsDisplay = EC_SHOP_FRONT_NEW_OPTION_DATA.getDisplayFlag(iProductNum, sValue); var sOptionText = oThis.getOptionText(oOptionChoose, this); if (bIsDisplay === false) { $(this).remove(); return; } //조합분리형인데 옵션이 1개인경우 옵션추가금액을 세팅) if (bIsSolidOption === true) { var sItemCode = oThis.data.getItemCode(iProductNum, sValue); var sAddText = EC_SHOP_FRONT_NEW_OPTION_BIND.setAddText(iProductNum, sItemCode, oOptionChoose); if (sAddText !== '') { sOptionText = sOptionText + sAddText; } } if (isSoldout === true) { //품절표시안함일때 안보여주도록함(첫번째옵션이라서.. 어쩔수없이 여기서 ㅋ) //두번째옵션부터는 동적생성이니깐 bind에서처리 if (bIsDisplaySolout === false) { $(this).remove(); return; } //해당 옵션값 객첵가 넘어오면 바로 적용 if (bIsStyleButton === true) { $(this).addClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SOLDOUT_CLASS); } //분리형이면서 전체상품이 품절이면 if (bIsSolidOption !== true) { var sSoldoutText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getSoldoutText(oOptionChoose, sValue); sOptionText = sOptionText + ' ' + sSoldoutText; } } oThis.setText(this, sOptionText); }); }, /** * 품목이 아닌 각 옵션별로 전체품절인지 황니후 품절이면 품절문구 반환 * @param oOptionChoose * @param sValue * @returns {String} */ getSoldoutText : function(oOptionChoose, sValue) { var sText = ''; var iProductNum = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); if (EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue) === true) { return '[' + EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT.getSoldoutDiplayText(iProductNum) + ']'; } return sText; }, /** * 셀렉트박스형 옵션인지 버튼형 옵션이지 확인 * @param oOptionChoose 구분할 옵션박스 object * @returns true => 버튼형옵션, false => 기존 select형 옵션 */ isOptionStyleButton : function(oOptionChoose) { var sOptionStyle = $(oOptionChoose).attr(this.cons.OPTION_STYLE); if (sOptionStyle === 'preview' || sOptionStyle === 'button') { return true; } return false; }, /** * 해당 옵션의 옵션출력타입(분리형 : S, 일체형 : C) * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션타입 */ getOptionListingType : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return $(oOptionChoose).attr(this.cons.OPTION_LISTING_TYPE); }, /** * 해당 옵션의 옵션타입(조합형 : T, 연동형 : E, 독립형 : F) * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션타입 */ getOptionType : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return $(oOptionChoose).attr(this.cons.OPTION_TYPE); }, /** * 해당 옵션의 옵션그룹명을 가져온다 * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션그룹이름 */ getOptionSelectGroup : function(oOptionChoose) { return $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); }, /** * sOptionStyleConfirm 에 해당하는 옵션인지 확인 * @param oOptionChoose 구분할 옵션박스 object * @param sOptionStyleConfirm 옵션스타일(EC_SHOP_FRONT_NEW_OPTION_CONS : OPTION_STYLE_PREVIEW 또는 OPTION_STYLE_BUTTON) * @returns 확인결과 */ isOptionStyle : function(oOptionChoose, sOptionStyleConfirm) { var sOptionStype = $(oOptionChoose).attr(this.cons.OPTION_STYLE); if (sOptionStype === sOptionStyleConfirm) { return true; } return false; }, /** * 해당 옵션의 선택된 Text내용을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 옵션 내용Text */ getOptionSelectedText : function(oOptionChoose) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).attr('title'); } else { return $(oOptionChoose).find('option:selected').text(); } }, /** * 해당 옵션의 선택된 값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 옵션값 */ getOptionSelectedValue : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); if (this.isOptionStyleButton(oOptionChoose) === true) { var oTarget = $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); //버튼형옵션은 *, **값이 없기떄문에 선택된게 없다면 강제리턴 if (oTarget.length < 1) { return '*'; } else { return oTarget.attr('option_value'); } } else { var sValue = $(oOptionChoose).val(); return ($.trim(sValue) === '') ? '*' : sValue; } }, /** * 해당 Element의 값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param oOptionChoose 값을 가져오려는 옵션 항목 * @returns 옵션값 */ getOptionValue : function(oOptionChoose, oOptionChooseElement) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChooseElement).attr('option_value'); } else { return $(oOptionChooseElement).val(); } }, /** * 해당 Element의 Text값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param oOptionChoose 값을 가져오려는 옵션 항목 * @returns */ getOptionText : function(oOptionChoose, oOptionChooseElement) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChooseElement).attr('title'); } else { return $(oOptionChooseElement).text(); } }, /** * 선택된 옵션의 Element를 가져온다 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 선택옵션의 DOM Element */ getOptionSelectedElement : function(oOptionChoose) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); } else { return $(oOptionChoose).find('option:selected'); } }, /** * 해당 옵션의 상품번호를 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 상품번호 */ getOptionProductNum : function(oOptionChoose) { return parseInt($(oOptionChoose).attr(this.cons.OPTION_PRODUCT_NUM)); }, /** * 해당 옵션의 순번을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 해당 옵션의 순서 번호 */ getOptionSortNum : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return parseInt($(oOptionChoose).attr(this.cons.OPTION_SORT_NUM)); }, /** * 이벤트 옵션까지에대해 현재까지 선택된 옵션값 배열 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param bIsString 값이 true이면 선택된 옵션들을 구분자로 join해서 받아온다 * @returns 현재까지 선택된 옵션값 배열 */ getAllSelectedValue : function(oOptionChoose, bIsString) { var iOptionSortNum = this.getOptionSortNum(oOptionChoose); //지금까지 선택된 옵션의 값 var aSelectedValue = []; $('[product_option_area="'+$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME)+'"]').each(function() { if (parseInt($(this).attr('option_sort_no')) <= iOptionSortNum) { aSelectedValue.push(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue($(this))); } }); return (bIsString === true) ? aSelectedValue.join(this.cons.OPTION_GLUE) : aSelectedValue; }, /** * iSelectedOptionSortNum 의 하위옵션을 초기화(0일때는 모두초기화)ㅅ * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param iSelectedOptionSortNum 하위옵션을 초기화할 대상 옵션 순번 */ setInitializeDefault : function(oOptionChoose, iSelectedOptionSortNum) { var sOptionGroup = $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); var iProductNum = this.getOptionProductNum(oOptionChoose); this.bind.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum); }, /*리먼트에 선택한 옵션값 보여주기 */ var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM = { TARGET_ELEMENT_CLASS : '.ec-shop-front-product-option-desc-trigger', /** * 각 옵션선택시마다 이미지가 있다면 상세이미지에 반영되도록 함 * @param oOptionChoose 구분할 옵션박스 object * @returns null */ eachCallback : function(oOptionChoose) { //버튼 또는 미리보기 옵션이 아니면 리턴 if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) { return; } //셀렉터에 ""를 안붙이면 가끔 특정상횡에서 스크립트오류 var oTarget = $(oOptionChoose).closest('.xans-element- .xans-product').find("" + this.TARGET_ELEMENT_CLASS + ""); //디자인이 없다면 패스 if ($(oTarget).length < 1) { return; } var sText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedText(oOptionChoose); //선택항목에 text가 있다면 //추후에 셀렉트박스가 추가된다면... *나 **가 선택되었다면 예외처리해야함 if (typeof(sText) !== 'undefined' && $.trim(sText) !== '') { $(oTarget).removeClass('ec-product-value').addClass('ec-product-value'); $(oTarget).html(sText); } else { $(oTarget).removeClass('ec-product-value'); $(oTarget).html($(oTarget).attr('data-option_msg')); } } }; var EC_SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION = { oCommon : null, initObject : function() { if (this.oCommon !== null) { return; } this.oCommon = EC_SHOP_FRONT_NEW_OPTION_COMMON; }, sOptionKey : null, prefetech : function(oOptionChoose) { this.initObject(); if (oSingleSelection.isItemSelectionTypeM() === true) { return; } // 동일한 키로 선택된 상품이 없다면 prefetch는 할일이 없음 var oTarget = this.getDeleteTriggerElement(oOptionChoose); if (oTarget.size() === 0) { return; } if (this.oCommon.getOptionType(oOptionChoose) === 'F') { return this.prefetchOptionTypeF(oOptionChoose); } if (this.oCommon.getOptionType(oOptionChoose) === 'E') { return this.prefetchOptionTypeE(oOptionChoose); } oTarget.click(); }, prefetchOptionTypeE : function(oOptionChoose) { var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); if (sOptionGroup.indexOf('setproduct') < 0) { this.getDeleteTriggerElement(oOptionChoose).click(); return; } var oTarget = this.getDeleteTriggerElement(oOptionChoose); var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_')); var sOptionKey = $('#'+sOptionId+'_id').val(); this.sOptionKey = sOptionKey; var sContext = this.getDeleteTriggerContext(oOptionChoose); $(sContext).remove(); this.hookIndividualSetProductParameter(sOptionKey); }, prefetchOptionTypeF : function(oOptionChoose) { var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); var oTarget = this.getDeleteTriggerElement(oOptionChoose); var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_')); var sOptionKey = $('#'+sOptionId+'_id').val(); this.sOptionKey = sOptionKey; // 추가구성상품 if (sOptionGroup.indexOf('addproduct') > -1) { var aOptionInfo = $('#'+sOptionId+'_id').val().split('||'); sOptionKey = aOptionInfo[0]; this.sOptionKey = sOptionKey; ProductAdd.delOptionBoxData(sOptionKey); } // 일반상품, 추가구성상품 동일 TotalAddSale.removeProductData(sOptionKey); // 세트상품 if (sOptionGroup.indexOf('setproduct') > -1) { this.hookIndividualSetProductParameter(sOptionKey); } }, eachCallback : function(oOptionChoose) { if (oSingleSelection.isItemSelectionTypeM() === true) { return; } var sOptionType = this.oCommon.getOptionType(oOptionChoose); if (sOptionType === 'F') { return this.eachCallbackOptionTypeF(oOptionChoose); } if (sOptionType === 'E') { return this.eachCallbackOptionTypeE(oOptionChoose); } }, eachCallbackOptionTypeE : function(oOptionChoose) { // 뭔가 값이 선택됐을때는 원래 돌던대로 돌린다 if (this.oCommon.getOptionSelectedValue(oOptionChoose) !== '*') { return; } var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); // 선택한 값이 취소된 경우에만 이 로직을 실행한다 // 모두 선택인 경우에는 하나라도 선택되었는지 if (this.oCommon.validation.checkRequiredOption(sOptionGroup) === false) { bIsSelectedRequiredOption = this.oCommon.validation.isOptionSelected(oOptionChoose); } else { bIsSelectedRequiredOption = this.oCommon.validation.isSelectedRequiredOption(sOptionGroup); } // 뭔가 하나 선택되어있는 경우 if (this.oCommon.getItemCode(oOptionChoose) === false && bIsSelectedRequiredOption === true) { var oOptionGroup = this.oCommon.getOptionLastSelectedElement(sOptionGroup); if (sOptionGroup.indexOf('addproduct') > -1) { var iProductNum = this.oCommon.getOptionProductNum(oOptionChoose); if (this.oCommon.isOptionStyleButton(oOptionChoose) === true) { ProductAdd.setAddProductOptionPushButton(iProductNum); } } else { if (typeof(ProductSet) === 'object') { if (this.oCommon.isOptionStyleButton(oOptionGroup) === true) { var oOptionGroup = $('select[product_option_area_select="' + $(oOptionGroup).attr('product_option_area') + '"][id="' + $(oOptionGroup).attr('ec-dev-id') + '"]'); } oSingleSelection.setProductTargetKey(oOptionGroup, 'setproduct'); ProductSet.procOptionBox(oOptionGroup); } else { if (typeof(setPrice) === 'function') { var sID = this.oCommon.getOptionChooseID(oOptionGroup); setPrice(false, true, sID); } } } } else { if (sOptionGroup.indexOf('setproduct') === -1) { return; } this.hookIndividualSetProductParameter(this.sOptionKey); if (Object.keys(ProductSet.getSetIndividualList()).length > 0) { TotalAddSale.getCalculatorSalePrice(ProductSet.setTotalPrice); } } }, hookIndividualSetProductParameter : function(sOptionKey) { ProductSet.delOptionBoxData(sOptionKey); // 분리세트 상품 코드 삭제 var oSetIndividualList = ProductSet.getSetIndividualList(); delete oSetIndividualList[sOptionKey]; TotalAddSale.setParam('unit_set_product_no', oSetIndividualList); // 할인 금액 품목 코드 삭제 TotalAddSale.removeProductData(sOptionKey); // 아무 옵션이 없는 경우 if (Object.keys(oSetIndividualList).length === 0) { TotalAddSale.setParam('product', oProductList); TotalAddSale.setTotalAddSalePrice(0); ProductSet.setTotalPrice(); } else { var aProductNo = []; for (var i = 0 ; i < Object.keys(oSetIndividualList).length ; i++) { var iProductNum = oSetIndividualList[Object.keys(oSetIndividualList)[i]]; if (aProductNo.indexOf(iProductNum) === -1) { aProductNo.push(iProductNum); } }; if (aProductNo.length === 1) { TotalAddSale.setParam('product_no', aProductNo[0]); TotalAddSale.setParam('is_set', false); } else { TotalAddSale.setParam('product_no', iProductNo); TotalAddSale.setParam('is_set', true); } } }, eachCallbackOptionTypeF : function(oOptionChoose) { if (this.oCommon.getOptionSelectedValue(oOptionChoose) === '*') { var oTarget = this.getDeleteTriggerElement(oOptionChoose); // 옵션이 실제로 취소되었음 oTarget.click(); } else { // 다른 옵션으로 변경되었음 - 삭제 액션이 아니라 삭제된거처럼 만들어야함 var sContext = this.getDeleteTriggerContext(oOptionChoose); $(sContext).remove(); } return true; }, getDeleteTriggerElement : function(oOptionChoose) { var sSelector = this.getDeleteTriggerSelector(oOptionChoose); var sContext = this.getDeleteTriggerContext(oOptionChoose); return $(sSelector, sContext); }, getTargetKey : function(oOptionChoose) { // 기본상품(옵션없는 상품, 조합형옵션 상품, 연동형 옵션 상품, 일체형 세트상품) : 상품번호 // 독립형 옵션 상품 : 상품번호|옵션순서 // 분리세트 상품 : 구성상품번호|세트상품번호 // 분리세트상품의 독립형 옵션 상품 : 구성상품번호|세트상품번호|옵션순서 var sTargetKey = this.oCommon.getOptionProductNum(oOptionChoose); var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); if (sOptionGroup.indexOf('setproduct') > -1) { if (sSetProductType === 'S') { sTargetKey = sTargetKey + '|' + iProductNo } else { sTargetKey = iProductNo; } } if (this.oCommon.getOptionType(oOptionChoose) === 'F') { sTargetKey = sTargetKey + '|' + this.oCommon.getOptionSortNum(oOptionChoose); } return sTargetKey; }, getDeleteTriggerContext : function(oOptionChoose) { var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); var sContext = 'tr.add_product'; if (sOptionGroup.indexOf('addproduct') < 0) { sContext = 'tr.option_product'; } var sTargetKey = this.getTargetKey(oOptionChoose); return sContext+'[target-key='+sTargetKey+']'; }, getDeleteTriggerSelector : function(oOptionChoose) { var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); var sSelector = '.option_add_box_del'; if (sOptionGroup.indexOf('addproduct') < 0) { sSelector = '.option_box_del'; } return sSelector; } }; var oSingleSelection = function() { var sProductTargetKey = null; var sSingleQuantityInputSelector = 'input.single-quantity-input'; var sIndexKey = '#PRODUCTNUM#'; var sSingleObjectName = 'oSingleItemData['+sIndexKey+']'; var getTotalPriceSelector = function() { return $('#totalProducts .total:visible').size() > 0 ? '#totalProducts .total' : '.xans-product-detail #totalPrice .total, .xans-product-zoom #totalPrice .total'; }; var isItemSelectionTypeS = function() { return $(sSingleQuantityInputSelector).filter(':visible').size() > 0; }; var isItemSelectionTypeM = function() { return $(sSingleQuantityInputSelector).filter(':visible').size() === 0; }; var getProductNum = function(oQuantityObject) { if ($(oQuantityObject).hasClass('single-quantity-input') === true) { return parseInt($(oQuantityObject).attr('product-no'), 10); } if ($(oQuantityObject).attr('product-no')) { return $(oQuantityObject).attr('product-no'); } var sProductNumClass = $.grep($(oQuantityObject).attr('class').split(' '), function(sClassName,i) { return $.trim(sClassName).indexOf('product-no-') === 0; })[0]; return parseInt(sProductNumClass.replace('product-no-', ''), 10); }; var getOptionSequenceNum = function(oQuantityObject) { if ($(oQuantityObject).hasClass('single-quantity-input') === true) { return parseInt($(oQuantityObject).attr('option-sequence'), 10); } if ($(oQuantityObject).attr('has-option') === 'F') { return 1; } if ($(oQuantityObject).attr('option_type') === 'F' && $(oQuantityObject).attr('option_sort_no')) { return parseInt($(oQuantityObject).attr('option_sort_no'), 10); } var sSequenceClass = $.grep($(oQuantityObject).attr('class').split(' '), function(sClassName,i) { return $.trim(sClassName).indexOf('option-sequence-') === 0; })[0]; return parseInt(sSequenceClass.replace('option-sequence-', ''), 10); }; var setProductTargetKey = function(oElement, sType) { var iTargetProductNum = iProductNo; var sTargetKey = iProductNo; var iOptionSequence = 1; if (typeof(oElement) !== 'undefined') { if (oElement.hasClass('single-quantity-input') === true || oElement.hasClass('quantity-handle') === true) { iTargetProductNum = getProductNum(oElement); iOptionSequence = getOptionSequenceNum(oElement); } else { var oOptionChoose = EC_SHOP_FRONT_NEW_OPTION_COMMON.setOptionBoxElement(oElement); iTargetProductNum = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); if (isNaN(iTargetProductNum) === true) { iTargetProductNum = $(oElement).attr('product-no'); } iOptionSequence = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(oOptionChoose); } sTargetKey = iTargetProductNum; } if (sType === 'setproduct') { if (sSetProductType === 'S') { sTargetKey = iTargetProductNum+'|'+iProductNo; } } var bAddProductOptionF = false; var bSetProductOptionF = false; if (sType === 'addproduct') { var oOptionChoose = $('select#addproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence); bAddProductOptionF = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F'; } if (sType === 'setproduct') { var oOptionChoose = $('select#setproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence); bSetProductOptionF = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F'; } if ((typeof(sType) === 'undefined' && option_type === 'F') || bSetProductOptionF === true || bAddProductOptionF === true) { sTargetKey = sTargetKey+'|'+iOptionSequence; } sProductTargetKey = sTargetKey; } return { getProductTargetKey : function() { return sProductTargetKey; }, setProductTargetKey : function(oElement, sType) { return setProductTargetKey(oElement, sType); }, getTotalPriceSelector : function() { return getTotalPriceSelector(); }, getProductNum : function(oQuantityButtnObject) { return getProductNum(oQuantityButtnObject); }, getOptionSequence : function(oQuantityButtnObject) { return getOptionSequenceNum(oQuantityButtnObject); }, getQuantityInput : function(oQuantityButtonObject, sContext) { var iSequenceNum = getOptionSequenceNum(oQuantityButtonObject); var iProductNum = getProductNum(oQuantityButtonObject); if (typeof(sContext) === 'undefined') { sContext = null; } return $(sSingleQuantityInputSelector+'[option-sequence='+iSequenceNum+'][product-no='+iProductNum+']', sContext); }, isItemSelectionTypeS : function() { return isItemSelectionTypeS(); }, isItemSelectionTypeM : function() { return isItemSelectionTypeM(); } }; }(); /** * 뉴상품 옵션 셀렉트 공통파일 */ var EC_SHOP_FRONT_NEW_OPTION_COMMON = { cons : null, data : null, bind : null, validation : null, /** * 페이지 로드가 완료되었는지 */ isLoad : false, initObject : function() { this.cons = EC_SHOP_FRONT_NEW_OPTION_CONS; this.data = EC_SHOP_FRONT_NEW_OPTION_DATA; this.bind = EC_SHOP_FRONT_NEW_OPTION_BIND; this.validation = EC_SHOP_FRONT_NEW_OPTION_VALIDATION; }, /** * 페이지 로딩시 초기화 */ init : function() { var oThis = this; //조합분리형이지만 옵션이 1개인경우 var bIsSolidOption = false; //첫 로드시에는 첫번째 옵션만 검색 $('select[option_select_element="ec-option-select-finder"][option_sort_no="1"], ul[option_select_element="ec-option-select-finder"][option_sort_no="1"]').each(function() { //연동형이 아닌고 분리형일때만 실행 bIsSolidOption = false; if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(this) === true) { if (Olnk.isLinkageType($(this).attr('option_type')) === false) { if (parseInt($('[product_option_area="'+oThis.getOptionSelectGroup(this)+'"]').length) < 2) { bIsSolidOption = true; } oThis.data.initializeSoldoutFlag($(this)); oThis.setOptionText($(this), bIsSolidOption); } } }); }, /** * 옵션상품인데 모든옵션이 판매안함+진열안함일때 예외처리 * @param sProductOptionID 옵션 Selectbox ID */ isValidOptionDisplay : function(sProductOptionID) { var iOptionCount = 0; $('select[option_select_element="ec-option-select-finder"][id^="' + sProductOptionID + '"], ul[option_select_element="ec-option-select-finder"][ec-dev-id^="' + sProductOptionID + '"]').each(function() { if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { iOptionCount += $(this).find('li').length; } else { iOptionCount += $(this).find('option').length - 2; } }); return iOptionCount > 0; }, /** * 각 옵션에대해 전체품절인지 확인후 */ setOptionText : function(oOptionChoose, bIsSolidOption) { var bIsStyleButton = this.isOptionStyleButton(oOptionChoose); if (bIsStyleButton === true) { var oTargetOption = $(oOptionChoose).find('li'); } else { var oTargetOption = $(oOptionChoose).find('option').filter('[value!="*"][value!="**"]'); } var bIsDisplaySolout = EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isSoldoutOptionDisplay(); var iProductNum = this.getOptionProductNum(oOptionChoose); var oThis = this; $(oTargetOption).each(function() { var sValue = oThis.getOptionValue(oOptionChoose, $(this)); var isSoldout = EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue); var bIsDisplay = EC_SHOP_FRONT_NEW_OPTION_DATA.getDisplayFlag(iProductNum, sValue); var sOptionText = oThis.getOptionText(oOptionChoose, this); if (bIsDisplay === false) { $(this).remove(); return; } //조합분리형인데 옵션이 1개인경우 옵션추가금액을 세팅) if (bIsSolidOption === true) { var sItemCode = oThis.data.getItemCode(iProductNum, sValue); var sAddText = EC_SHOP_FRONT_NEW_OPTION_BIND.setAddText(iProductNum, sItemCode, oOptionChoose); if (sAddText !== '') { sOptionText = sOptionText + sAddText; } } if (isSoldout === true) { //품절표시안함일때 안보여주도록함(첫번째옵션이라서.. 어쩔수없이 여기서 ㅋ) //두번째옵션부터는 동적생성이니깐 bind에서처리 if (bIsDisplaySolout === false) { $(this).remove(); return; } //해당 옵션값 객첵가 넘어오면 바로 적용 if (bIsStyleButton === true) { $(this).addClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SOLDOUT_CLASS); } //분리형이면서 전체상품이 품절이면 if (bIsSolidOption !== true) { var sSoldoutText = EC_SHOP_FRONT_NEW_OPTION_COMMON.getSoldoutText(oOptionChoose, sValue); sOptionText = sOptionText + ' ' + sSoldoutText; } } oThis.setText(this, sOptionText); }); }, /** * 품목이 아닌 각 옵션별로 전체품절인지 황니후 품절이면 품절문구 반환 * @param oOptionChoose * @param sValue * @returns {String} */ getSoldoutText : function(oOptionChoose, sValue) { var sText = ''; var iProductNum = EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); if (EC_SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue) === true) { return '[' + EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT.getSoldoutDiplayText(iProductNum) + ']'; } return sText; }, /** * 셀렉트박스형 옵션인지 버튼형 옵션이지 확인 * @param oOptionChoose 구분할 옵션박스 object * @returns true => 버튼형옵션, false => 기존 select형 옵션 */ isOptionStyleButton : function(oOptionChoose) { var sOptionStyle = $(oOptionChoose).attr(this.cons.OPTION_STYLE); if (sOptionStyle === 'preview' || sOptionStyle === 'button' || sOptionStyle === 'radio') { return true; } return false; }, /** * 해당 옵션의 옵션출력타입(분리형 : S, 일체형 : C) * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션타입 */ getOptionListingType : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return $(oOptionChoose).attr(this.cons.OPTION_LISTING_TYPE); }, /** * 해당 옵션의 옵션타입(조합형 : T, 연동형 : E, 독립형 : F) * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션타입 */ getOptionType : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return $(oOptionChoose).attr(this.cons.OPTION_TYPE); }, /** * 해당 옵션의 옵션그룹명을 가져온다 * @param oOptionChoose 구분할 옵션박스 object * @returns 옵션그룹이름 */ getOptionSelectGroup : function(oOptionChoose) { return $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); }, /** * sOptionStyleConfirm 에 해당하는 옵션인지 확인 * @param oOptionChoose 구분할 옵션박스 object * @param sOptionStyleConfirm 옵션스타일(EC_SHOP_FRONT_NEW_OPTION_CONS : OPTION_STYLE_PREVIEW 또는 OPTION_STYLE_BUTTON) * @returns 확인결과 */ isOptionStyle : function(oOptionChoose, sOptionStyleConfirm) { var sOptionStype = $(oOptionChoose).attr(this.cons.OPTION_STYLE); if (sOptionStype === sOptionStyleConfirm) { return true; } return false; }, /** * 해당 옵션의 선택된 Text내용을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 옵션 내용Text */ getOptionSelectedText : function(oOptionChoose) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).attr('title'); } else { return $(oOptionChoose).find('option:selected').text(); } }, /** * 해당 옵션의 선택된 값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 옵션값 */ getOptionSelectedValue : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); if (this.isOptionStyleButton(oOptionChoose) === true) { var oTarget = $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); //버튼형옵션은 *, **값이 없기떄문에 선택된게 없다면 강제리턴 if (oTarget.length < 1) { return '*'; } else { return oTarget.attr('option_value'); } } else { var sValue = $(oOptionChoose).val(); return ($.trim(sValue) === '') ? '*' : sValue; } }, /** * 해당 Element의 값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param oOptionChoose 값을 가져오려는 옵션 항목 * @returns 옵션값 */ getOptionValue : function(oOptionChoose, oOptionChooseElement) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChooseElement).attr('option_value'); } else { return $(oOptionChooseElement).val(); } }, /** * 해당 Element의 Text값을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param oOptionChoose 값을 가져오려는 옵션 항목 * @returns */ getOptionText : function(oOptionChoose, oOptionChooseElement) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChooseElement).attr('title'); } else { return $(oOptionChooseElement).text(); } }, /** * 선택된 옵션의 Element를 가져온다 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 선택옵션의 DOM Element */ getOptionSelectedElement : function(oOptionChoose) { if (this.isOptionStyleButton(oOptionChoose) === true) { return $(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); } else { return $(oOptionChoose).find('option:selected'); } }, getOptionLastSelectedElement : function(sOptionGroup) { var oOptionGroup = this.getGroupOptionObject(sOptionGroup); var aTempResult = []; oOptionGroup.each(function(i) { if (EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(oOptionGroup[i]) !== '*') { aTempResult.push(oOptionGroup[i]); } }); return $(aTempResult[aTempResult.length - 1]); }, /** * 해당 옵션의 상품번호를 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 상품번호 */ getOptionProductNum : function(oOptionChoose) { return parseInt($(oOptionChoose).attr(this.cons.OPTION_PRODUCT_NUM)); }, /** * 해당 옵션의 순번을 가져옴 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @returns 해당 옵션의 순서 번호 */ getOptionSortNum : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); return parseInt($(oOptionChoose).attr(this.cons.OPTION_SORT_NUM)); }, /** * 이벤트 옵션까지에대해 현재까지 선택된 옵션값 배열 * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param bIsString 값이 true이면 선택된 옵션들을 구분자로 join해서 받아온다 * @returns 현재까지 선택된 옵션값 배열 */ getAllSelectedValue : function(oOptionChoose, bIsString) { var iOptionSortNum = this.getOptionSortNum(oOptionChoose); //지금까지 선택된 옵션의 값 var aSelectedValue = []; $('[product_option_area="'+$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME)+'"]').each(function() { if (parseInt($(this).attr('option_sort_no')) <= iOptionSortNum) { aSelectedValue.push(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue($(this))); } }); return (bIsString === true) ? aSelectedValue.join(this.cons.OPTION_GLUE) : aSelectedValue; }, /** * iSelectedOptionSortNum 의 하위옵션을 초기화(0일때는 모두초기화)ㅅ * @param oOptionChoose 값을 가져오려는 옵션박스 object * @param iSelectedOptionSortNum 하위옵션을 초기화할 대상 옵션 순번 */ setInitializeDefault : function(oOptionChoose, iSelectedOptionSortNum) { var sOptionGroup = $(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); var iProductNum = this.getOptionProductNum(oOptionChoose); this.bind.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum); }, /** * 외부에서 기존스크립트가 호출할때는 버튼형옵션객체가 아니라 숨겨진 셀렉트박스에서 호출하므로 버튼형옵션객체를 찾아서 리턴 */ setOptionBoxElement : function(oOptionChoose) { if (typeof($(oOptionChoose).attr('product_option_area_select')) !== 'undefined') { oOptionChoose = $('ul[product_option_area="'+$(oOptionChoose).attr('product_option_area_select')+'"][ec-dev-id="'+$(oOptionChoose).attr('id')+'"]'); } return oOptionChoose; }, /** * 선택한 옵션 하위옵션 모두 초기화(추가구성상품에서 연동형옵션때문에...) * @param oOptionChoose */ setAllClear : function(oOptionChoose) { oOptionChoose = this.setOptionBoxElement(oOptionChoose); var iSortNo = parseInt(this.getOptionSortNum(oOptionChoose)); $(this.getGroupOptionObject(this.getOptionSelectGroup(oOptionChoose))).each(function() { if (iSortNo < parseInt(EC_SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum($(this)))) { EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue($(this), '*'); } }); }, /** * 멀티옵션(구스킨)에서 사용할때 해당 옵션의 id값을 바꾸는기능이 있어서 추가 * @param oOptionChoose */ setID : function(oOptionChooseOrg, sId) { if ($(oOptionChooseOrg).attr('option_style') === 'select') { oOptionChoose = oOptionChooseOrg; } else { oOptionChoose = $(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]'); } if (this.isOptionStyleButton(oOptionChoose) === true) { $(oOptionChoose).attr('ec-dev-id', sId) $(oOptionChooseOrg).attr('id', sId); } else { $(oOptionChoose).attr('id', sId); } }, /** * 멀티옵션(구스킨)에서 사용할때 해당 옵션의 id값을 바꾸는기능이 있어서 추가 * @param oOptionChoose */ setGroupArea : function(oOptionChooseOrg, sGroupID) { if ($(oOptionChooseOrg).attr('option_style') === 'select') { oOptionChoose = oOptionChooseOrg; } else { oOptionChoose = $(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]'); } if (this.isOptionStyleButton(oOptionChoose) === true) { $(oOptionChoose).attr('product_option_area', sGroupID) $(oOptionChooseOrg).attr('product_option_area_select', sGroupID); } else { $(oOptionChoose).attr('product_option_area', sGroupID); } }, /** * 해당 선택한 옵션의 text값을 세팅 */ setText : function(oSelectecOptionChoose, sText) { oOptionChoose = this.setOptionBoxElement($(oSelectecOptionChoose).parent()); if (this.isOptionStyleButton(oOptionChoose) === true) { var sValue = $(oSelectecOptionChoose).attr('option_value'); var oTarget = $(oOptionChoose).find('li[option_value="'+sValue+'"]'); $(oTarget시 저장된 해당 옵션의 HTML을 가져온다 sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value); sOptionsHtml = $(sOptionsHtml).clone().removeClass(oObject.BUTTON_OPTION_DISABLE_CLASS); //마지막 옵션일 경우에는 if (bIsLastOption === true) { sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value); //진열안함이면 패스 if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) { bIsDisplay = false; } sAddText = oObject.setAddText(oObject.iProductNum, sItemCode); //품절상품인경우 품절class추가 if (oObject.common.isSoldout(oObject.iProductNum, sItemCode) === true) { $(sOptionsHtml).removeClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS); bIsSoldout = true; } } else { var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value; sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText); if (sAddText !== '') { $(sOptionsHtml).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS); bIsSoldout = true; } if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) { bIsDisplay = false; } } if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) { $(this).remove(); return; } oObject.oNextOptionTarget.append($(sOptionsHtml).attr('title', oOption.value + sAddText)); }); EC_SHOP_FRONT_NEW_OPTION_COMMON.setValue(this.oNextOptionTarget, '*', false); }, /** * 셀렉트박스형 옵션일 경우 selectbox초기화 및 해당 옵션값 Set * @param aOptions 옵션값 리스트 * @param sSelectedOption 현재까지 선택된 옵션조합 배열 */ setOptionHtmlForSelect : function(aOptions, sSelectedOption) { this.oNextOptionTarget.find('option').removeAttr('disabled'); //연동형일경우에는 초기화 시키고 disable제거 //if (Olnk.isLinkageType(this.sOptionType) === true && EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this.oNextOptionTarget)) { if (Olnk.isLinkageType(this.sOptionType) === true) { var sHtml = this.data.getDefaultOptionHTML(this.common.getOptionProductNum(this.oNextOptionTarget), this.common.getOptionSortNum(this.oNextOptionTarget)); $(this.oNextOptionTarget).find('option').remove(); $(this.oNextOptionTarget).append(sHtml); $(this.oNextOptionTarget).find('option').removeAttr('disabled'); $(this.oNextOptionTarget).val('*'); return; } //옵션이 아닌 Default선택값을 제외하고 모두 삭제 this.oNextOptionTarget.find('option[value!="*"][value!="**"]').remove(); //선택한 옵션의 다음순서옵션항목 var iNextOptionSortNum = this.common.getOptionSortNum(this.oNextOptionTarget); var bIsLastOption = false; //생성될 옵션이 마지막 옵션이면 옵션 Text에 추가 항목(옵션가 품절표시등)을 처리 if (parseInt(iNextOptionSortNum) === this.iOptionCount) { bIsLastOption = true; } var oObject = this; var sOptionsHtml = ''; var sItemCode = false; //옵션 셀렉트박스 Text에 추가될 문구 처리 var sAddText = ''; //품절옵션인데 품절옵션표시안함설정이면 삭제 var bIsSoldout = false; $(aOptions).each(function(i, oOption) { sAddText = ''; bIsSoldout = false; bIsDisplay = true; sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value); sOptionsHtml = $(sOptionsHtml).clone(); //마지막 옵션일 경우에는 설정에따라 옵션title에 추가금액등의 text를 붙인다 if (bIsLastOption === true) { sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value); //진열안함이면 패스 if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) { bIsDisplay = false; } sAddText = oObject.setAddText(oObject.iProductNum, sItemCode); bIsSoldout = EC_SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(oObject.iProductNum, sItemCode); } else { //품절문구(각 옵션마다도 보여줘야함...) var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value; sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText); bIsSoldout = (sAddText === '') ? false : true; if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) { bIsDisplay = false; } } if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) { $(this).remove(); return; } $(sOptionsHtml).val(oOption.value); $(sOptionsHtml).removeAttr('disabled'); $(sOptionsHtml).text(oOption.value + sAddText); oObject.oNextOptionTarget.append($(sOptionsHtml)); }); }, /** * 마지막 옵션에 추가될 추가항목들(추가금액, 품절 등) * @param iProductNum 상품번호 * @param sItemCode 아이템 코드 * @param oOptionElement 옵션셀렉트박스를 임의로 지정할경우 */ setAddText : function(iProductNum, sItemCode, oOptionElement) { var aText = []; if (typeof(oOptionElement) !== 'object') { var oOptionElement = this.oOptionObject; } $(this.aExtraOptionText).each(function() { if (typeof(this.get) === 'function') { aText.push(this.get(iProductNum, sItemCode, oOptionElement)); } }); return aText.join(''); }, /** * 옵션 선택박스(셀렉트박스나 버튼)에 click 또는 change에 대한 이벤트 할당 */ initChooseBox : function() { this.cons = EC_SHOP_FRONT_NEW_OPTION_CONS; this.common = EC_SHOP_FRONT_NEW_OPTION_COMMON; this.data = EC_SHOP_FRONT_NEW_OPTION_DATA; this.validation = EC_SHOP_FRONT_NEW_OPTION_VALIDATION; var oThis = this; //live로 할경우에 기존 이벤트가 없어짐. $('select[option_select_element="ec-option-select-finder"]').unbind().change(function() { if (oThis.common.isOptionStyleButton(this) === true) { return false; } //페이지 로드가 되었는지 확인. if (typeof(oThis.common.isLoad) === false) { $(this).val('*'); return false; } oThis.initialize(this, this); }); $('ul[option_select_element="ec-option-select-finder"] > li').unbind().live('click', function() { if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton($(this).parent('ul')) === false) { return false; } //페이지 로드가 되었는지 확인. if (typeof(EC_SHOP_FRONT_NEW_OPTION_COMMON.isLoad) === false) { return false; } oThis.initialize($(this).parent('ul'), this); }); }, /** * 멀팁옵션에서 옵션추가시 이벤트 재정의(버튼형은 live로 되어있으니 상관없고 select형만) * @param oOptionElement */ initChooseBoxMulti : function(oOptionElement) { var oThis = this; //live로 할경우에 기존 이벤트가 없어짐. $('.xans-product-multioption select[option_select_element="ec-option-select-finder"]').unbind().change(function() { if (oThis.common.isOptionStyleButton(this) === true) { return false; } //페이지 로드가 되었는지 확인. if (typeof(oThis.common.isLoad) === false) { $(this).val('*'); return false; } oThis.initialize(this, this); }); }, /** * 옵션 선택시 필요한 attribute값등을 SET */ setSelectedOptionConf : function() { //선택한 옵션 그룹 this.sOptionGroup = this.common.getOptionSelectGroup(this.oOptionObject); //선택한 옵션값 순번 this.iOptionIndex = parseInt(this.common.getOptionSortNum(this.oOptionObject)); //선택한 옵션 스타일 this.sOptionStyle = $(this.oOptionObject).attr(this.cons.OPTION_STYLE); //현재까지 선택한 옵션의 value값을 가져온다 this.aOptionValue = this.common.getAllSelectedValue(this.oOptionObject); //상풉번호 this.iProductNum = this.common.getOptionProductNum(this.oOptionObject); //옵션타입 this.sOptionType = this.common.getOptionType(this.oOptionObject); //품절 옵션 표시여부 this.bIsDisplaySolout = this.validation.isSoldoutOptionDisplay(); //선택한 옵션의 다음 옵션 Element //선택옵션을 제거한 다음옵션 //1 : 필수, 2 : 선택, 3 : 필수일때 1번옵션 선택후 다음옵션을 3번(연동형) //[option_sort_no"'+this.iOptionIndex+'"] oThis = this; this.oNextOptionTarget = null; $('[product_option_area="'+this.sOptionGroup+'"][option_product_no="'+this.iProductNum+'"]').each(function() { //현재선택한 옵션의 하위옵션이 아니라 상위옵션이면 패스 if (oThis.iOptionIndex >= parseInt(oThis.common.getOptionSortNum(this))) { return true;//continue } //선택옵션이면 패스 if (oThis.validation.isRequireOption(this) === false) { return true; } oThis.oNextOptionTarget = $(this); return false;//break }); //옵션 갯수 this.iOptionCount = $('[product_option_area="'+this.sOptionGroup+'"]').length; }, /** * 버튼식 옵션일 경우 선택한 옵션을 선택처리 */ setSelectButton : function(oSelectedOption, bIsUnset) { if (this.common.isOptionStyleButton(this.oOptionObject) === true) { //모두 선택이 안된상태로 이벤트 실행할수있도록 selected css를 지우고 리턴 if (bIsUnset === true) { $(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); return; } //이미 선택한 옵션값을 다시 클릭시에는 선택해제 if ($(oSelectedOption).hasClass(this.cons.BUTTON_OPTION_SELECTED_CLASS) === true) { $(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); this.common.setValue(this.oOptionObject, '*', false); } else { //버튼형식의 옵션일 경우 선택한 옵션을 선택처리(class 명을 추가) //선택불가일때는 선택된상태로 보이지 않도록 하고 클리만 가능하도록 한다 //disable상태이면 선택CSS는 적용되지 않게 처리 if ($(oSelectedOption).hasClass(this.cons.BUTTON_OPTION_DISABLE_CLASS) === false) { $(oSelectedOption).parent('ul').find('li').removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); $(oSelectedOption).addClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); } } } else { //셀렉트박스형 옵션일 경우 **를 선택했다면 옵션초기화 if (this.validation.isItemCode($(this.oOptionObject).val()) === false) { $(this.oOptionObject).val('*'); } } } }; var EC_SHOP_FRONT_NEW_OPTION_DATA = { /** * EC_SHOP_FRONT_NEW_OPTION_CONS 객체 Alias */ cons : EC_SHOP_FRONT_NEW_OPTION_CONS, /** * EC_SHOP_FRONT_NEW_OPTION_COMMON 객체 Alias */ common : EC_SHOP_FRONT_NEW_OPTION_COMMON, /** * 옵션값관 아이템코드 매칭 데이터(option_value_mapper) */ aOptioValueMapper : [], /** * 각 선택된 옵션값에대한 다음옵션값 리스트를 저장 * aOptionValueData[상품번호][빨강#$%대형] = array(key : 1, value : 옵션값, text : 옵션 Text) */ aOptionValueData : {}, /** * 각 상품의 품목데이터(재고 및 추가금액 정보) */ aItemStockData : {}, /** * 옵션의 디폴트 HTML을 저장해둠 */ aOptionDefaultData : {}, /** * 디폴트 옵션을 저장할떄 중복을 제거하기위해서 추가 */ aCacheDefaultProduct : [], /** * 버튼형 옵션 Element저장시 중복제거 */ aCacheButtonOption : [], /** * 버튼형 옵션의 경우 각 옵션값별 컬러칩/버튼이미지/버튼이름등을 저장해둔다 */ aButtonOptionDefaultData : [], /** * 추가금액 노출 설정 */ aOptionPriceDisplayConf : [], /** * 연동형 옵션의 옵션내용을 저장 */ aOlnkOptionData : [], /** * 각 옵션(품목이 아닌)마다 모두 품절이면 품절표시를 위해서 추가... */ aOptionSoldoutFlag : [], /** * 각 옵션(품목이 아닌)마다 모두 진열안함이면 false로 나오지 않게 하기 위해서 추가 */ aOptionDisplayFlag : [], /** * 페이지 로딩시 각 옵션선택박스의 옵션정보를 Parse */ initData : function() { var oThis = this; $('select[option_select_element="ec-option-select-finder"], ul[option_select_element="ec-option-select-finder"]').each(function() { //해당 옵션의 상품번호 var iProductNum = oThis.common.getOptionProductNum(this); //해당 옵션의 옵션순서번호 var iOptionSortNum = oThis.common.getOptionSortNum(this); var sCacheKey = iProductNum + oThis.cons.OPTION_GLUE + iOptionSortNum; EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOption(this, sCacheKey); //버튼형 옵션일 경우 각 Element를 캐싱 if (EC_SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForButtonOption(this, sCacheKey); } else { EC_SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForSelectOption(this, sCacheKey); //일반 셀렉트의 경우 기본값 (*, **)을 제외하고 삭제 //첫번째 필수값은 option들이 disable이 아니므로 disable된 옵션들만 삭제 var bIsProcLoading = true; //필수옵션만 삭제 if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this) === false) { bIsProcLoading = false; } //disable만 풀어준다 //연동형이지만 옵션추가버튼 사용시에는 지우지 않음... //기본으로 선택된값이 있다면 지우지 않음(구스킨 관심상품, 뉴스킨 장바구니등에서는 일단 선택한 옵션을 보여주고 선택후부터 순차로딩) var sValue = $(this).find('option[selected="selected"]').attr('value'); if (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sValue) === true || (Olnk.isLinkageType(oThis.common.getOptionType(this)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true))) { bIsProcLoading = false $(this).find('option').removeAttr('disabled'); } if (bIsProcLoading === true) { $(this).find('option[value!="*"][value!="**"]:disabled').remove('option'); } } }); }, /** * 각 상품의 옵션 디폴트 옵션 HTML을 저장해둔다 * @param oOptionChoose 값을 가져오려는 옵션박스 object */ initializeOption : function(oOptionChoose, sCacheKey) { //이미 데이터가 있다면 패스 if ($.inArray(sCacheKey, this.aCacheDefaultProduct) > -1) { return; } this.aCacheDefaultProduct.push(sCacheKey); this.aOptionDefaultData[sCacheKey] = $(oOptionChoose).html(); }, initializeOptionForSelectOption : function(oOptionChoose, sCacheKey) { var iProductNum = $(oOptionChoose).attr('option_product_no'); var oThis = this; //같은 상품이 여러개있을수있으므로 이미 캐싱이 안된 상품만 if ($.inArray(sCacheKey, this.aCacheButtonOption) < 0) { var bDisabled = false; if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) { bDisabled = true; } this.aCacheButtonOption.push(sCacheKey); this.aButtonOptionDefaultData[sCacheKey] = []; $(oOptionChoose).find('option').each(function() { if (bDisabled === true) { $(this).removeAttr('disabled'); } oThis.aButtonOptionDefaultData[sCacheKey][$(this).val()] = $(' ').append($(this).clone()).html(); }); } }, /** * 셀렉트박스 형식이 아닌 버튼이나 이미지형 옵션일 경우 HTML자체를 옵션값 별로 저장해둔다. * writejs쓰기싫음여 */ initializeOptionForButtonOption : function(oOptionChoose, sCacheKey) { var oThis = this; var iProductNum = $(oOptionChoose).attr('option_product_no'); //같은 상품이 여러개있을수있으므로 이미 캐싱이 안된 상품만 if ($.inArray(sCacheKey, this.aCacheButtonOption) < 0) { var bDisabled = false; if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || EC_SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) { bDisabled = true; } this.aCacheButtonOption.push(sCacheKey); this.aButtonOptionDefaultData[sCacheKey] = []; $(oOptionChoose).find('li').each(function() { if (bDisabled === true) { $(this).removeClass(EC_SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS); } oThis.aButtonOptionDefaultData[sCacheKey][$(this).attr('option_value')] = $('').append($(this).clone()).html(); }); } var sSelect = '