
var html_fields = new Array;

function checkTagParamValidation(param){
	var validParams = ['src','title', 'data', 'id', 'width', 'height', 'onmouseover', 'onmousemove', 'onmouseout', 'hspace', 'usemap', 'method', 'shape', 'coords','type', 'value', 'action', 'colspan', 'cellspacing', 'cellpadding' , 'rowspan', 'target', 'onclick', 'onkeypress', 'class', 'href', 'style', 'name', 'align', 'valign', 'bgcolor','border', 'alt', 'cellspacing', 'cellpadding'];
	for(var i = 0; i<validParams.length; i++){
		if(param.toLowerCase() == validParams[i]){
			return true;
		}
	}
	return false;
}

function checkTagValidation(tagName){
	var validTags = ['noindex', 'a', 'i', 'em' ,'object', 'input', 'embed', 'form', 'param', 'map', 'area', 'b',  'script', 'strong', 'ul', 'img', 'li', 'ol', 'br', 'td', 'tr', 'table', 'tbody', 'div', 'p','hr', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote'];
	for(var i = 0; i<validTags.length; i++){
		if(tagName == validTags[i]){
			return true;
		}
	}
	return false;
}

function readTag(tag_data){
	tag_data = tag_data.toString();
	var obj = 'middle';
	var prev_obj = '';
	var vars = new Object;
	var current_property_name = '';
	var current_property_value_opener = ' ';
	
	for(var i=0; i<tag_data.length; i++){
		var symbol = tag_data.substr(i,1);
		switch(obj){
			case "middle":
				if(symbol != ' '){
					switch(prev_obj){
						case '':
							obj = 'tag_name';
							vars['tag'] = symbol;
						break;

						case 'tag_name':
							obj = 'property_name';
							current_property_name = symbol;
						break;		
						
						case 'property_value':
							obj = 'property_name';
							current_property_name = symbol;
						break;	
						
						case 'property_name':
							if(symbol == '='){
								obj = 'property_eq';
							} else {
								vars[current_property_name] = null;
								obj = 'property_name';
								current_property_name = symbol;								
							}
						break;								
						
						case 'property_eq':						
							obj = 'property_value';
							if(symbol == '"' || symbol == '\''){
								current_property_value_opener = symbol;
							} else {
								current_property_value_opener = ' ';
								vars[current_property_name] = symbol;
							}
						break;	

					}	
				}
			break;
			case "tag_name":
				if(symbol != ' '){
					vars['tag']+= symbol;
				} else {
					prev_obj = obj;
					obj = 'middle';
					current_property_name = '';
				}
			break;
			case "property_name":
				if(symbol != ' ' && symbol != '='){
					if(current_property_name == null || current_property_name == undefined){
						current_property_name = '';
					}

					current_property_name+= symbol;
				} else {
					if(symbol == ' '){
						prev_obj = obj;
						obj = 'middle';
					}
					if(symbol == '='){
						prev_obj = obj;
						obj = 'property_eq';
					}

				}								
			break;

			case "property_eq":
				prev_obj = obj;
				if(symbol != " "){
					obj = 'property_value';
					if(symbol == '"' || symbol == '\''){
						current_property_value_opener = symbol;
					} else {
						current_property_value_opener = ' ';
						vars[current_property_name] = symbol;
					}	
				} else {
					obj = 'middle';					
				}
					
			break;
			
			case "property_value":
				if(symbol != current_property_value_opener){
					if(vars[current_property_name] == null || vars[current_property_name] == undefined){
						vars[current_property_name] = '';
					}
					vars[current_property_name]+= symbol;
				} else {
					prev_obj = obj;
					obj = 'middle';
					current_property_name = '';
				}				
			break;			
		}
	}
	return vars;
}
function closeSlashOrder(tagName){
	var startSlashTags = ['noindex','a', 'b', 'i', 'em','script', 'strong', 'ul', 'li', 'ol', 'td', 'tr', 'table', 'tbody', 'div', 'p','hr', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote'];
	for(var i = 0; i<startSlashTags.length; i++){
		if(tagName == startSlashTags[i]){
			return 'start'
		}
	}
	return 'end';
}

function rep(m, tag_data){
	var endTag = false;		
	if(tag_data.match(/^\//i)){
		var endTag = true;		
		tag_data = tag_data.replace(/^\//, '');
	}
	if(tag_data.match(/\/$/i)){
		var endTag = true;		
		tag_data = tag_data.replace(/\/$/, '');
	}

	var startSlash = '';
	var endSlash = '';
	
	var vars = readTag(tag_data);
	
	if(endTag == true){
		if(closeSlashOrder(vars['tag'].toLowerCase()) == 'start'){
			startSlash = '/';
		} else {
			endSlash = '/'
		}
	}
	
	if(checkTagValidation(vars['tag'].toLowerCase()) == true){

		var params = new Array;
		params.push(vars['tag'].toLowerCase());
	
		for(var attr in vars){
			if(attr != 'tag' && checkTagParamValidation(attr.toLowerCase()) == true){
				if(vars[attr] != null){
					params.push(attr.toLowerCase()+' = '+'"'+vars[attr]+'"');
				} else {
					params.push(attr.toLowerCase());				
				}
			}
		}	
		var result = startSlash + params.join(' ') + endSlash;
		return '<'+ result + '>';
	} else {
		return '';
	}

}


function _rep(m, tag){
		
	var pats = /^ *([\/A-Za-z0-9]+) */i
	var ims = tag.match(pats);
	if(fullTag != tagName){
		var endTag = true;
	} else {
		var endTag = false;
	}

	var paramsList = new Array;
	var closeTag = false;
	
	var paramsSting = '';
	var endSlash = '';
	var startSlash = '';

	
	var fullTag = ims[1].toLowerCase();
	var tagName = fullTag.replace('/', '');
	
	var pats = /([A-Za-z0-9]+) *={1} *["']{1}([^"']*)["']{1}/ig
	var ims = tag.match(pats);	
	
	var params = new Object;
	if(ims){
		for(var i=0; i<ims.length; i++){
			var param = ims[i].split('=');
			if(checkTagParamValidation(param[0].toLowerCase())){

				params[param[0].toLowerCase()] = param[1];
			}
		}
	}
	
	var pats = /([A-Za-z0-9]+) *={1} *([^"' ]+)/ig
	
	var ims = tag.match(pats);	
	if(ims){
		for(var i=0; i<ims.length; i++){
			var param = ims[i].split('=');
			if(checkTagParamValidation(param[0].toLowerCase())){

				param[1] = '"'+param[1]+'"';					
				params[param[0].toLowerCase()] = param[1];
			}
		}
	}


	delete params;
	if(fullTag == 'br' || fullTag == 'hr'){
		startSlash = '/';
	}
	if(fullTag == 'img'){
		endSlash = '/';
	}
	if(tagName == 'tbody' || tagName == 'tr'){
		params = new Object;
	}
	if(tagName == 'table' || tagName == 'td'){

	}
	
	if(endTag == true){
		params = new Object;
	}
	
	for(var attr in params){
		paramsList.push(attr+'='+params[attr]);
	}
	
	paramsString = paramsList.join(' ');

	if(paramsString != ''){
		var result = '<'+startSlash+fullTag +' '+ paramsString + endSlash+'>';
	} else {
		var result = '<'+ startSlash + fullTag + endSlash +'>';
	}
	if(checkTagValidation(tagName)){
		return  result;
	}
	
}

function parseHTMLtoXHTML(HTML){
	HTML = HTML.replace(/<p><\/p>/gi, '<p>&nbsp;</p>');
	var pattern = /<([^><]+)>/g;
		XHTML = HTML.replace(pattern, rep);

	//	Удаление комментариев
	return XHTML;
}

function onEditorLoad(id) {
	var field = id.replace(/_frame$/i, '');
    var editor = document.getElementById(id);
    if (editor) {
        editor.contentWindow.setSource(document.getElementById(field).value);
    }
}
function onEditorSave(id) {
	var field = id.replace(/_frame$/i, '');	
    var editor = document.getElementById(id);
    if (editor) {
		editor.contentWindow.parseAnchors();
		editor.contentWindow.updateVisual();
		document.getElementById(field).value = parseHTMLtoXHTML(editor.contentWindow.parseToXHTML());
    }
}

function editorsPreSave(){
	for(var i in html_fields){
		onEditorSave(html_fields[i]+'_frame');
	}
}