/*
 * ▷ global.js
 */

var userfolder;
var designpath;
var setUF = function (uf) {
	userfolder = uf;
	designpath = './users/' + uf + '/design/';
}


/**
 * SET EDITOR */
function setEditor (ids, skin, width) 
{
	tinyMCE.init({
		mode : "exact",
		elements : ids,
		forced_root_block : false,
		theme : 'advanced',
		theme_advanced_resize_horizontal : false,
		skin : (skin == 'black' ? 'default' : 'o2k7'),
		plugins : "insertdatetime,media,contextmenu",
		width: (width == null ? '100%' : width),
		remove_linebreaks:"1",
		dialog_type:"modal",
		theme_advanced_fonts:"맑은고딕=malgun gothic;새굴림=New Gulim;굴림=gulim;돋움=dotum;궁서=gungsuh;바탕=batang;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Tahoma=tahoma,arial,helvetica,sans-serif;Verdana=verdana,geneva;",
		theme_advanced_buttons1 : "bold,italic,underline,strikethrough,hr,justifyleft,justifycenter,justifyright,justifyfull,fontselect,fontsizeselect,",
		theme_advanced_buttons2 : "cut,copy,paste,pastetext,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,code,media,|,insertdate,inserttime,|,forecolor,backcolor",
		theme_advanced_buttons3 : "",
		theme_advanced_buttons4 : "",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_statusbar_location : "bottom",
		theme_advanced_resizing : true,
		// force new line to br instead of p
		force_br_newlines : true,
        forced_root_block : '',
		cleanup: false,
		content_css : designpath + (skin == 'black' ? '_common/css/editor-content-dark.css' : '_common/css/editor-content.css')
	});
}

// global prototype
// _______________________________________________

	String.prototype.trim = function()
	{
		var TRIM_PATTERN = /(^\s*)|(\s*$)/g;	
		return this.replace(TRIM_PATTERN, "");
	}
	
	String.prototype.comma = function() 
	{ 
		var l_text=this; 
		var l_pattern=/^(-?\d+)(\d{3})($|\..*$)/; 
		
		  if(l_pattern.test(l_text)){ 
			l_text=l_text.replace(l_pattern,function(str,p1,p2,p3) 
			{ 
			  return p1.comma() + ("," + p2 + p3); 
			}); 
		  } 
		
		return l_text; 
	}
		
	// 문자열을 UTF-8로 변환했을 경우 차지하게 되는 byte 수를 리턴한다.
	String.prototype.getsize = function () {
		if (this == null || this.length == 0) {
		  return 0;
		}
		var size = 0;
		
		for (var i = 0; i < this.length; i++) {
		  size += _charByteSize(this.charAt(i));
		}
		return size;
	}
	
	/*Array.prototype.asdasdasdin_array = function ( str )
	{	
		for( var i = 0; i < this.length; i++ )
		{
			if( str == this[i] )
			{
				return true;
			}
		}
		return false;
	}*/
	
	String.prototype.isMedia = function ()
	{
		var imageExt = ['swf', 'bmp', 'jpg', 'jpeg', 'gif', 'png'];
		//return imageExt.inArray(this);
	}

// functions
// _______________________________________________

	function in_array (str, array) 
	{
		for( var i = 0; i < array.length; i++ )
		{
			if( str == array[i] )
			{
				return true;
			}
		}
		return false;
	}

	function ctc(userfolder, text)
	{   
		if(window.clipboardData) {   
			window.clipboardData.setData('text', text);   
		} else {   
			var clipboarddiv=document.getElementById('divclipboardswf');   
			
			if(clipboarddiv==null)
			{   
			   clipboarddiv=document.createElement('div');   
				   clipboarddiv.setAttribute("name", "divclipboardswf");
			   clipboarddiv.setAttribute("id", "divclipboardswf");   
			   document.body.appendChild(clipboarddiv);   
			}  
			
			clipboarddiv.innerHTML='<embed src="./users/' + userfolder + '/design/_common/img/clipboard.swf" FlashVars="clipboard=' +
			encodeURIComponent(text) + '" width="100" height="100" type="application/x-shockwave-flash"></embed>';
		}   
		alert('클립보드에 복사되었습니다.\nCTRL+V 로 붙여넣기 하세요.');
		return false;   
	}



	function mf(s,id,w,h,vars)
	{
		return '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"\
		codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"\
		width="' + w + '" height="' + h + '" id="' + id + '">\
		<param name="wmode" value="transparent" />\
		<param name="movie" value="' + s + '" />\
		<param name="flashVars" value="' + vars + '" />\
		<param name="quality" value="high" />\
		<embed src="' + s + '" quality="high" wmode="transparent" type="application/x-shockwave-flash" \
		pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?p1_prod_version=shockwaveflash" \
		width="' + w + '" height="' + h + '" name="' + id + '" flashVars="' + vars + '"></embed></object>';
	}
	
	// generate flash script
	var gf = function (url, id, width, height, vars) 
	{
		B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/[-1]=='a'?'FF':'\v'=='v'?'IE':/a/.__proto__=='//'?'Saf':/s/.test(/a/.toString)?'Chr':/^function \(/.test([].sort)?'Op':'Unknown';
	
		if (B == 'IE' || B == 'Chr') {
			var txt = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"' +
				(width ? ' width="' + width + '"' : '') + (height ? ' height="' + height + '"' : '') +
				'id="' + id + '" align="middle">' + "\n"; 
			txt+= '<param name="allowScriptAccess" value="always" />';
			txt+= '<param name="flashVars" value="' + vars + '" />';
			txt+= '<param name="movie" value="' + url + '" />';
			txt+= '<param name="quality" value="high" />';
			txt+= '<param name="wmode" value="transparent" />';
			txt+= '<embed src="' + url + '" quality="high" wmode="transparent" style="' + 
			(width ? ' width:' + width + 'px;' : '') + (height ? ' height:' + height + 'px;' : '') +
			'" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashVars="' + vars + '"></embed>';
			txt+= '</object>';
	
			return txt;
			//eval("window." + id + " = document.getElementById('" + id + "');");
		} else {
			txt = '<embed id="'+id+'" src="'+url+'" quality="high" wmode="transparent" style="width:'+width+'px; height:'+height+'px;" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashVars="'+vars+'"></embed>';
			return txt;
	//        document.write(txt);
		}
	}
	
	// write document contents
	function documentwrite(src)
	{
		document.write(src);
	}
	
	

	var _charByteSize = function(ch) {
		if (ch == null || ch.length == 0) {
		  return 0;
		}
		
		var charCode = ch.charCodeAt(0);
		
		if (charCode <= 0x00007F) {
		  return 1;
		} else if (charCode <= 0x0007FF) {
		  return 2;
		} else if (charCode <= 0x00FFFF) {
		  return 3;
		} else {
		  return 4;
		}
	}

	var checkisnumber = function (str) 
	{
		//var pattern = /(^[a-zA-Z0-9\-_]+$)/;
		var pattern = /(^[0-9]+$)/;
		return pattern.test(str);
	}
	
	var setText = function (obj, str)
	{
		if (obj) {
			if (document.all) {
				obj.innerText = str;
			} else {
				obj.textContent = str;
			}
		} else {
			return false;
		}
	}
	
	var getText = function (obj)
	{
		if (obj) {
			if (document.all) {
				return obj.innerText;
			} else {
				return obj.textContent;
			}
		} else {
			return false;
		}
	}
	
	var setHTML = function (obj, str)
	{
		if (obj) {
			obj.innerHTML = str;
		} else {
			return false;
		}
	}
	
	var getHTML = function (obj)
	{
		if (obj) {
			return obj.innerHTML;
		} else {
			return false;
		}
	}
	
	var transModName = function (str)
	{
		str = str.trim()
		str = str.replace(" ", "_");
		
		return str;
	}
	
	var RGB2HTML = function (red, green, blue)
	{
		var decColor = red + 256 * green + 65536 * blue;
		return decColor.toString(16);
	}
		
	var serialize = function ( mixed_value ) {
		// http://kevin.vanzonneveld.net
		// +   original by: Arpad Ray (mailto:arpad@php.net)
		// +   improved by: Dino
		// +   bugfixed by: Andrej Pavlovic
		// +   bugfixed by: Garagoth
		// %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
		// %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
		// *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
		// *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
		// *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
		// *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
	 
		var _getType = function( inp ) {
			var type = typeof inp, match;
			var key;
			if (type == 'object' && !inp) {
				return 'null';
			}
			if (type == "object") {
				if (!inp.constructor) {
					return 'object';
				}
				var cons = inp.constructor.toString();
				if (match = cons.match(/(\w+)\(/)) {
					cons = match[1].toLowerCase();
				}
				var types = ["boolean", "number", "string", "array"];
				for (key in types) {
					if (cons == types[key]) {
						type = types[key];
						break;
					}
				}
			}
			return type;
		};
		var type = _getType(mixed_value);
		var val, ktype = '';

		switch (type) {
			case "function": 
				val = ""; 
				break;
			case "undefined":
				val = "N";
				break;
			case "boolean":
				val = "b:" + (mixed_value ? "1" : "0");
				break;
			case "number":
				val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
				break;
			case "string":
				val = "s:" + mixed_value.getsize() + ":\"" + mixed_value + "\"";
				break;
			case "array":
			case "object":
				val = "a";
				/*
				if (type == "object") {
					var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
					if (objname == undefined) {
						return;
					}
					objname[1] = serialize(objname[1]);
					val = "O" + objname[1].substring(1, objname[1].length - 1);
				}
				*/
				var count = 0;
				var vals = "";
				var okey;
				var key;
				for (key in mixed_value) {
					ktype = _getType(mixed_value[key]);
					if (ktype == "function") { 
						continue; 
					}
					
					okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
					vals += serialize(okey) +
							serialize(mixed_value[key]);
					count++;
				}
				val += ":" + count + ":{" + vals + "}";
				break;
		}
		if (type != "object" && type != "array") val += ";";
		return val;
	}
	
	var unserialize = function (data){
		// http://kevin.vanzonneveld.net
		// +     original by: Arpad Ray (mailto:arpad@php.net)
		// +     improved by: Pedro Tainha (http://www.pedrotainha.com)
		// +     bugfixed by: dptr1988
		// +      revised by: d3x
		// +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// %            note: We feel the main purpose of this function should be to ease the transport of data between php & js
		// %            note: Aiming for PHP-compatibility, we have to translate objects to arrays 
		// *       example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
		// *       returns 1: ['Kevin', 'van', 'Zonneveld']
		// *       example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
		// *       returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}
		
		var error = function (type, msg, filename, line){throw new window[type](msg, filename, line);};
		var read_until = function (data, offset, stopchr){
			var buf = [];
			var chr = data.slice(offset, offset + 1);
			var i = 2;
			while(chr != stopchr){
				if((i+offset) > data.length){
					error('Error', 'Invalid');
				}
				buf.push(chr);
				chr = data.slice(offset + (i - 1),offset + i);
				i += 1;
			}
			return [buf.length, buf.join('')];
		};
		var read_chrs = function (data, offset, length){
			buf = [];
			for(var i = 0;i < length;i++){
				var chr = data.slice(offset + (i - 1),offset + i);
				buf.push(chr);
			}
			return [buf.length, buf.join('')];
		};
		var _unserialize = function (data, offset){
			if(!offset) offset = 0;
			var buf = [];
			var dtype = (data.slice(offset, offset + 1)).toLowerCase();
			
			var dataoffset = offset + 2;
			var typeconvert = new Function('x', 'return x');
			var chrs = 0;
			var datalength = 0;
			
			switch(dtype){
				case "i":
					typeconvert = new Function('x', 'return parseInt(x)');
					var readData = read_until(data, dataoffset, ';');
					var chrs = readData[0];
					var readdata = readData[1];
					dataoffset += chrs + 1;
				break;
				case "b":
					typeconvert = new Function('x', 'return (parseInt(x) == 1)');
					var readData = read_until(data, dataoffset, ';');
					var chrs = readData[0];
					var readdata = readData[1];
					dataoffset += chrs + 1;
				break;
				case "d":
					typeconvert = new Function('x', 'return parseFloat(x)');
					var readData = read_until(data, dataoffset, ';');
					var chrs = readData[0];
					var readdata = readData[1];
					dataoffset += chrs + 1;
				break;
				case "n":
					readdata = null;
				break;
				case "s":
					var ccount = read_until(data, dataoffset, ':');
					var chrs = ccount[0];
					var stringlength = ccount[1];
					dataoffset += chrs + 2;
					
					var readData = read_chrs(data, dataoffset+1, parseInt(stringlength));
					var chrs = readData[0];
					var readdata = readData[1];
					dataoffset += chrs + 2;
					if(chrs != parseInt(stringlength) && chrs != readdata.length){
						error('SyntaxError', 'String length mismatch');
					}
				break;
				case "a":
					var readdata = {};
					
					var keyandchrs = read_until(data, dataoffset, ':');
					var chrs = keyandchrs[0];
					var keys = keyandchrs[1];
					dataoffset += chrs + 2;
					
					for(var i = 0;i < parseInt(keys);i++){
						var kprops = _unserialize(data, dataoffset);
						var kchrs = kprops[1];
						var key = kprops[2];
						dataoffset += kchrs;
						
						var vprops = _unserialize(data, dataoffset);
						var vchrs = vprops[1];
						var value = vprops[2];
						dataoffset += vchrs;
						
						readdata[key] = value;
					}
					
					dataoffset += 1;
				break;
				default:
					error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
				break;
			}
			return [dtype, dataoffset - offset, typeconvert(readdata)];
		};
		return _unserialize(data, 0)[2];
	}

