/**
 * @type   : prototype_function
 * @access : public
 * @desc   : 자바스크립트의 내장 객체인 String 객체에 trim 메소드를 추가한다. trim 메소드는 스트링의 앞과 뒤에
 *           있는 white space 를 제거한다.
 * <pre>
 *     var str = " abcde "
 *     str = str.trim();
 * </pre>
 * 위의 예에서 str는 "abede"가 된다.
 * @return : trimed String.
 * @author : 임재현
 */
String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

/**
 * @type   : function
 * @access : public
 * @desc   : 값이 null 이거나 white space 문자로만 이루어진 경우 true를 리턴한다.
 * <pre>
 *     cfIsNull("  ");
 * </pre>
 * 위와같이 사용했을 경우 true를 리턴한다.
 * @sig    : value
 * @param  : value required 입력값
 * @return : boolean. null(혹은 white space) 여부
 * @author : 임재현
 */
function cfIsNull(value) {
	if (value == null ||
	    (typeof(value) == "string" && value.trim() == "")
	   ) {
		return true;
	}

	return false;
}

/**
 * @type   : function
 * @access : public
 * @desc   : textarea의 value에 대한 maxLength Check.
 * <pre>
 *   <textarea id="pageHtml" name="pageHtml" rows=5 class="input_textarea" onkeyup="cfChkMaxlength(this.id, 1000)"></textarea></td>
 * </pre>
 * 위와같이 사용했을 경우 Keyup Event 발생시 length를 check한다.
 * @sig    : value
 * @param  : value required document.getElementById(elementId), maxLength
 * @return : boolean.
 * @author : hosung
 * @Revision :
 * 	2008.08.28 maxlength 가 넘을경우에는 maxlength 만큼만 끊어서 assign 시킨다.
 * 			   alert 메세지는 각 화면단에서 message.properties를 참조하여 작성한다.
 *
 */
function cfChkMaxlength(element, maxlength){
  if ( document.getElementById(element).value.length > maxlength ) {
    document.getElementById(element).value = document.getElementById(element).value.substring("0",maxlength );
    document.getElementById(element).focus();
    return true;
  } else {
  	return false;
  }
}

/**
 * @type   : function
 * @access : public
 * @desc   : 기본적으로 입력받은 두 날짜값 (YYYY-MM-DD 형태)을 비교하여 의 날짜가 뒤의 날짜보다 크면 false 를 리턴한다.
 * <pre>
 *   if( !cfCheckTwoDate(document.getElementById("startDate"), document.getElementById("endDate")) )
 *   {
 *       alert('Start date must be earlier than End date');
 *       return;
 *   }
 * </pre>
 * 위와같이 사용했을 경우 true를 리턴한다.
 * @sig    : value
 * @param  : value required document.getElementById(elementId), document.getElementById(elementId)
 * @return : boolean.
 * @author : hosung
 * @Revision :
 *
 */

function cfCheckTwoDate(startDate, endDate) {
    var sDate = startDate.value.substring(0,4);
    var eDate = endDate.value.substring(0,4);

    if(cfIsNull(startDate.value) || cfIsNull(endDate.value))
      return false;

  else {
    sDate += startDate.value.substring(5,7);
    sDate += startDate.value.substring(8,10);
    eDate += endDate.value.substring(5,7);
    eDate += endDate.value.substring(8,10);
  }

    if (eval(sDate > eDate )) {return false;}
      return true;
}
/**
 * @type   : function
 * @access : public
 * @desc   : 기본적으로 입력받은 두 날짜값 (YYYY-MM-DD 형태)을 비교하여 의 날짜가 뒤의 날짜보다 크면 false 를 리턴한다.
 * <pre>
 *   if( !cfCheckTwoDateDefault(document.getElementById("startDate"), document.getElementById("endDate")) )
 *   {
 *       alert('Start date must be earlier than End date');
 *       return;
 *   }
 * </pre>
 * 위와같이 사용했을 경우 true를 리턴한다.
 * @sig    : value
 * @param  : value required document.getElementById(elementId), document.getElementById(elementId)
 * @return : boolean.
 * @author : hosung
 * @Revision :
 *    2008.07.23 기존 cfCheckTwoDate() function을 수정하지 않고 새로 생성. 차이점은 두 document.getElementById(elementId).value가 Null일때는 true를 리턴한다.
 */
function cfCheckTwoDateDefault (startDate, endDate) {
    var sDate = startDate.value.substring(0,4);
    var eDate = endDate.value.substring(0,4);

    if(cfIsNull(startDate.value) || cfIsNull(endDate.value))
      return true;

  else {
    sDate += startDate.value.substring(5,7);
    sDate += startDate.value.substring(8,10);
    eDate += endDate.value.substring(5,7);
    eDate += endDate.value.substring(8,10);
  }
    if (eval(sDate > eDate )) {return false;}
      return true;
}

/**
 * @type   : function
 * @access : public
 * @desc   : check the extension of file [obj : an object which should be compare, extData : compare to target.]
 * <pre>
 * !cfExtChk(document.getElementById("zipFile"), "<c:out value="${zipFileExtData.code}"/>" )
 * </pre>
 * @sig    : value
 * @param  : required where   required parsedNode
 * @author : hosung
 * @return : boolean
 */
function cfExtChk(obj, extData) {
	var dot  = obj.value.lastIndexOf(".");
	var	ext = obj.value.substring(dot+1).toUpperCase();
	var re = /, /gi;
    var array = extData.substring(1,extData.length -1).replace(re, ",").split(",");
	for (var i = 0; i < array.length; i ++) {
		if(array[i] ==  ext) return true;
	}
	return false;
}

function cfDateChk(dateData) {
	var firstBar = dateData.indexOf('-');
	var secondBar = dateData.indexOf('-', firstBar+1);
	if ( firstBar == -1 || secondBar == -1 ) return false;
    var myYear = dateData.substring(0, firstBar);
    var myMonth = dateData.substring(firstBar+1, secondBar);
    var myDate = dateData.substring(secondBar+1, dateData.length);
    var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if ( myYear.length == 0 || myMonth.length != 2 || myDate.length != 2 ) return false;
    if ( (myYear % 1000 != 0) && (myYear % 4 == 0) ) months[1] = 29;
    if ( myDate == null || myDate == "" || myDate > months[myMonth-1] || myDate < 1 ) return false;
    if ( myMonth == null || myMonth == "" || myMonth < 1 || myMonth > 12 ) return false;
    if ( myYear == null || myYear == "" ) return false;
    if ( myMonth % 1 != 0 || myYear % 1 != 0 || myDate % 1 != 0 ) return false;

    return true;
}

function cfEmailChk(emailData) {
	var atChr = emailData.indexOf('@');
	var dotChr = emailData.indexOf('.');
	if ( atChr == -1 || dotChr == -1 ) return false;
    var sep1 = emailData.substring(0, atChr);
    var sep2 = emailData.substring(atChr+1, dotChr);
    var sep3 = emailData.substring(dotChr+1, emailData.length);
    if ( sep1.length == 0 || sep2.length == 0 || sep3.length == 0 ) return false;

    return true;
}

function cfLengthChk( inputData, min, max ) {
    if ( inputData.length < min || inputData.length > max ) {
      return false;
    }
    return true;
}


function cfVersionChk(strVersion) {
	//var re = /^\d+\.\d+$/gi;
	//var re2 = /^\d+\.\d+\.\d+$/gi;

	//if ( re.test(strVersion) || re2.test(strVersion) ) {
	//	return true;
	//} else {
	//	return false;
	//}
	var arrNumber = strVersion.split(".");

	if ( !(arrNumber.length == 2 || arrNumber.length == 3) ) {return false;}

	for (var i = 0; i < arrNumber.length; i ++) {
		if ( isNaN(arrNumber[i]) || arrNumber[i].trim() == "") {return false;}
	}

	return true;
}


// Setting default value - [select], [radio]
function setSelect(elName, targetValue){
    var el;
    el = document.getElementById(elName);

    switch (el.type) {
        case 'select-one':
            for (var i = 0; i < el.length; i++) {
                if (el.options[i].value == targetValue) {
                    el.options[i].selected = true;
                }
            }
            break;

        case 'radio':
            var radioEl = document.getElementsByName(elName);
            ;
            for (var i = 0; i < radioEl.length; i++) {
                if (radioEl[i].value == targetValue) {
                    radioEl[i].checked = true;
                    break;
                }
            }
            break;
    }
}


/**
 * Log
 * ex) log( 'Hisam?' )
 */
function log( msg ) {
   debug( msg );
   updateLineNumberOfLog();
}

/**
 * Append to log element
 * msg : appending msg
 *
 * ex) debug( "message" )
 */
 function debug( msg ) {
   var bgcolor = '';
   var rowCnt = document.getElementById('rowCnt');
   if( !rowCnt ) {
      rowCnt = document.createElement("div");
      rowCnt.id = 'rowCnt';
      bgcolor = 'yellow';
      document.body.appendChild( rowCnt );
   } else {
      bgcolor = '#FFFFFF';
      document.body.removeChild(rowCnt);
   }

   var log = document.getElementById('log');
   if( !log ) {
      log = document.createElement("div");
      log.id = 'log';

     log.style.height = '100px';
     log.style.border = 'solid 1px';
     log.style.borderColor = 'red';
     log.style.overflowY = 'auto';
     document.body.appendChild( log );
   }

   msg = "[" + (document.getElementById('log').childNodes.length+1) + "]" + msg;
   var txt = document.createTextNode( msg );
   var newLine = document.createElement("div");
   newLine.style.background = bgcolor;
   newLine.appendChild(txt);

   var targetEl = document.body;
   log.appendChild( newLine );
}

// Update line number of log
function updateLineNumberOfLog() {
   var logEl = document.getElementById('log');

   var lineNumberEl = document.getElementById('lineNumberOflog');
   if( !lineNumberEl ) {
      lineNumberEl = document.createElement("div");
      lineNumberEl.id    = 'lineNumberOflog';
      lineNumberEl.value = 0;
      document.body.appendChild( lineNumberEl );
   }

   var msg = "Line Number : ";
   replaceText( lineNumberEl, msg + logEl.childNodes.length );

   var clearEl  = document.getElementById('clear');
   if( !clearEl ) {
      var clearEl  = document.createElement("div");
      clearEl.id = 'clear';
      clearEl.innerHTML = '[Clear]';
      clearEl.style.cursor= 'hand';
      clearEl.onclick= function() {
         document.body.removeChild(document.getElementById('log'));
         document.body.removeChild(document.getElementById('lineNumberOflog'));
         document.body.removeChild(this);
      }
   }

   document.body.appendChild( clearEl);
}

/**
 * Replace text
 * ex) replaceText( targetElement, "replace text" )
 */
function replaceText(el, text) {
  if(el != null) {
    clearText(el);
    var newNode = document.createTextNode(text);
    el.appendChild(newNode);
  }
}

/**
 * Clear text
 * ex) clearText( targetElement )
 */
 function clearText(el) {
  if(el != null) {
    if(el.childNodes) {
      for(var i = 0; i < el.childNodes.length; i++) {
        var childNode = el.childNodes[i];
        el.removeChild(childNode);
      }
    }
  }
}

/**
 * Get text
 * ex) getText( targetElement )
 */
function getText(el) {
  var text = "";
  if(el != null) {
    if(el.childNodes) {
      for(var i = 0; i < el.childNodes.length; i++) {
        var childNode = el.childNodes[i];
        if(childNode.nodeValue != null) {
          text = text + childNode.nodeValue;
        }
      }
    }
  }
  return text;
}


function cutStrByByte(str, max) {
    var byteLength = 0;
    var result= "";
    for (var inx = 0; inx < str.length; inx++) {
        var oneChar = escape(str.charAt(inx));
        if ( oneChar.length == 1 ) {
            byteLength ++;
        } else if (oneChar.indexOf("%u") != -1) {
            byteLength += 2;
        } else if (oneChar.indexOf("%") != -1) {
            byteLength += oneChar.length/3;
        }
        result = result + str.charAt(inx);
        if(byteLength >= max){
        	result = result + "..";
        	break;
        }
    }
    return result;
}


function getByte(s){
	var sum = 0;
	var len = s.length;
	for (var i=0; i<len; i++) {
		var ch = s.substring(i, i + 1);
		var en = escape(ch);
		if ( en.length <= 4 ) {
			sum++;
		} else {
			sum += 3;
		}
	}
	return sum;
}

/**
 * @type   : function
 * @access : public
 * @desc   : onkeyup 이벤트에 사용. 숫자, '.'만 입력 가능
 * @param  : Object(input<text>)
 * @return : string
 * @author : 양성규
 */
function cfNumberKeyup(object) {
	var resultCharacters = "";
	var sNumber = object.value;
	for(var i = 0; i < sNumber.length; i++) {
		var c = sNumber.charCodeAt(i);
		if(i == 0 && c == 46) {
			sNumber = "0"+object.value;
		}
		if(c == 45 || c == 46 || (c >= 48 && c <= 57)) { // only numeric
			resultCharacters += sNumber.charAt(i);
		}
	}
	object.value = resultCharacters;
}

/**
 * @type   : function
 * @access : public
 * @desc   : 라디오 타입의 Input Object 선택 여부 체크
 * @param  : Object(input<radio>)
 * @return : true or false
 * @author : 양성규
 */
function cfRadioUnchecked(object) {
	for(var i = 0; i < object.length; i++) {
		if(object[i].checked) {
			return false;
		} else {
			continue;
		}
	}
	return true;
}

/**
 * @type   : function
 * @access : public
 * @desc   : 라디오 타입의 Input Object 의 Selected Index 를 조회
 * @param  : Object(input<radio>)
 * @return : Integer
 * @author : 양성규
 */
function getSelectedRadioIndex(object) {
	for(var i = 0; i < object.length; i++) {
		if(object[i].checked) {
			return i;
		} else {
			continue;
		}
	}
	return null;
}


// copy machine
function copyForm(src, target) {
    for(var i = 0; i < src.length; i++) {
        var el = src[i];
        if( el.type && el.type == 'hidden' ) {
        	var isExist = false;
        	for(var j = 0; j < target.length; j++){
            	if(el.name == target[j].name ) {
            		//log("copy form: " + target[j].name);
            		isExist = true;
            		break;
            	}
            }

        	if( isExist == true ) {
        		continue;
        	}

        	//log( 'copied>> ' + el.name  + "["+el.value+"]");
        	var tmp = document.createElement("input");
            tmp.type = "hidden";
            tmp.name = el.name;
            tmp.value = el.value;
            target.appendChild( tmp );
        }
    }
}


// generate tag element(after tag save)
function generateNewTag( val ) {
	var newTag = "";
	var valArr = val.split(",");
	for(var i = 0; i < valArr.length; i++) {
		var newVal = $.trim(valArr[i]);
		if( newVal == '' || newVal == ',' ) continue;
		if( i != 0 ) newTag+=", ";
	    newTag = newTag + "<SPAN><A href=\"javascript:searchKwd('tag','"+newVal+"')\">" + newVal + "</A></SPAN>&nbsp;"
	            + "<img src=\"/images/common/btn_close2.gif\" alt=\"delete\" objectName=\""+newVal+"\" style=\"cursor: pointer\" onclick=\"evalDeleteTag(this)\" />";
	}

    return newTag;
}

// callback of save tag
function callbackOfSaveTag(json) {
	if( json.isSuccess[0].$text == "true" ) {
	    var tagArea = $('#tagArea');
	    var oldTag = tagArea.html();
	    var newTag = generateNewTag( $('#tags').val() );
	    if (oldTag == "") {
	        tagArea.html( newTag );
	    } else {
	        tagArea.html( oldTag + ", " + newTag );
	    }

	    $('#tags').val('');
	    $('#tags').select();
	} else {
		alert(json.msg[0].$text);
	}
}
