<?php
/*

___Canvas Import Functions______________________________________

Imports function name and variable definitions from an XML file.

________________________________________________________________

*/


function canvas_delete_block($block_id) {
	global $wpdb, $canvas;
	$wpdb->query("DELETE FROM ".$canvas->main." WHERE block_id = '$block_id'");
	if($variables = $wpdb->get_results("SELECT variable_id, type FROM ".$canvas->variables." WHERE parent = '$block_id'")) {
		foreach($variables as $variable) {
			$wpdb->query("DELETE FROM ".$canvas->variables." WHERE parent = '$block_id'");
			if($variable->type == 'Radio' || $variable->type == 'Image' || $variable->type == 'Select')
				$wpdb->query("DELETE FROM ".$canvas->options." WHERE var_id = '".$variable->variable_id."'");
		}
	}
}

function canvas_delete_block_by_mod_ID($customWriteModuleId) {
	global $wpdb, $canvas;

	if ($blocks = $wpdb->get_results("SELECT block_id FROM ".$canvas->main." WHERE module_id = ".$customWriteModuleId)){
		foreach($blocks as $block) 
			canvas_delete_block($block->block_id);
	}
}




function canvas_import_form() {
?>
<div class="lbContent">
<h3>Import from XML
<p>If you're using a correctly built Canvas-compatible theme, you can import layout schemes from other users.</p>
<a id="cancel" href="javascript:void(0)" class="lbAction" rel="cancel">Cancel</a>
</h3>
<div>
	<form id="canvas_export">
		<p>Canvas can load layout and Canvas plugin data through a special XML file. To import a layout, be sure to use an XML file for the theme that you are currently working with.</p>
		<p>Importing from XML is still experimental, and may result in loss of Canvas-related data.</p>
		<label class="textbox">Path to the XML file on your server:<input class="text" type="text" id="path_to_xml" name="path_to_xml" value="" /></label>
		<input type="button" id="import_canvas" name="import_canvas" value="Import" onclick="Canvas.importXml()"/>
	</form>
	<p id="export_message"></p>
</div>
</div>

<?php
}

function canvas_import_layout($filename) {
	if(!file_exists($filename)) { echo 'File does not exist.'; return; }
	global $wpdb, $canvas, $imported_theme, $imported_blocks, $imported_variables, $id, $current_tag;
	$imported_theme = array();
	$imported_blocks = array();
	canvas_reload();

	if(!($xmlparser = xml_parser_create()))
		$error = "ERROR: Cannot create parser for ".$filename;
	xml_set_element_handler($xmlparser, "startElement", "endElement");
	xml_set_character_data_handler($xmlparser, "canvas_import_layout_XML");

	if(!($fp = fopen($filename, "r")))
		$error = "ERROR: Cannot open ".$filename;
	while($data = fread($fp, 4096)) {
		$data = eregi_replace(">"."[[:space:]]+"."<","><",$data);
        $data = eregi_replace(">"."[[:space:]]+",">",$data);
        $data = eregi_replace("[[:space:]]+"."<","<",$data);
		
		if (!xml_parse($xmlparser, $data, feof($fp)))
			$error = "XML error parsing ".$filename;
	}
	xml_parser_free($xmlparser);

	$block_ids = $wpdb->get_results("SELECT block_id FROM ".$canvas->main." WHERE theme = '".get_option('template')."'");
	foreach($block_ids as $block_id) {
		canvas_delete_block($block_id->block_id);
	}
	canvas_install(); // clean install

	foreach($imported_blocks as $key => $block) {
		$old_block = $wpdb->get_results("SELECT block_id, zone FROM ".$canvas->main." WHERE ubi = '".$block['ubi']."'");
		$old_block = $old_block[0];
		//if($old_block->zone != 'shelf') $old_block = canvas_duplicate_block($old_block->block_id);
		
		$wpdb->query("UPDATE ".$canvas->main." SET zone = '".$block['zone']."', position = '".$block['position']."' WHERE block_id = '".$old_block->block_id."'");
		if($imported_variables && $block['type'] == 'plugin') {
			foreach($imported_variables[$key] as $variables) {
				$wpdb->query("UPDATE ".$canvas->variables." SET value = '".addslashes($variables['value'])."' WHERE variable_name = '".addslashes($variables['name'])."' AND parent = '".$old_block->block_id."'");
			}
		}
	}
}

function canvas_import_plugin($moduleID, $filename, $position, $modTitle, $template_page, $duplicate_id, $block_id = -1) {

	global $wpdb, $canvas;
	if(substr($filename, -13) == 'configure.xml') {
		$plugin = canvas_get_plugin($filename, $modTitle);
		$path = $plugin->functionPath;
		list($plugin_id, $position) = canvas_install_plugin_data($moduleID, $plugin, $position, $template_page, $duplicate_id, $block_id);		
		if (!empty($plugin->variables)) {

			// Import or update variables
			foreach($plugin->variables as $variable) {
				//$name = $path.'_'.str_replace(array(' ','.'), '_', addslashes($variable['name']));
				$name = str_replace(array(' ','.'), '_', addslashes($variable['name']));
				$type = $variable['type'];
				$default = addslashes($variable['default']);
				$description = addslashes($variable['description']);
				$options = $variable['option'];
				canvas_install_variable_data($name, $plugin_id, $type, $default, $description, $options);
			}
		}
		// Delete obselete variables
		$blockVars = $wpdb->get_results("SELECT * FROM ".$canvas->variables." WHERE parent = '$plugin_id'");
		foreach($blockVars as $blockVar){
			$found = false;
			if (!empty($plugin->variables)){
				foreach($plugin->variables as $variable) {
					//$name = $path.'_'.str_replace(array(' ','.'), '_', addslashes($variable['name']));
					$name = str_replace(array(' ','.'), '_', addslashes($variable['name']));
					if ($name == $blockVar->variable_name) $found = true;
				}
			}
			if (!$found){
				$wpdb->query("DELETE FROM ".$canvas->variables." WHERE variable_id = ". $blockVar->variable_id);
			}
		}
		
	}
	return $plugin;
}


function get_template_pages($template) {
	$result = array();
	$filename = ABSPATH.'/wp-content/themes/'.$template.'/canvas.php';

	if(file_exists($filename)) {
		$file_data = implode('', file($filename));
		preg_match_all("|<!-- Canvas Page:(\s*)(.*) -->|", $file_data, $pages);

		if(!empty($pages[2])) {
			foreach($pages[2] as $page) {
				list($page_name, $id) = split('\s*\|\s*',$page);
				$result[] = trim($id);
			}
		}
	}

	return $result;
}

function canvas_import_plugins($position, $dir='') {
	global $wpdb, $canvas;

	include_once "RCCWP_Application.php";
	$customModules = RCCWP_CustomWriteModule::GetCustomModules();
	$currDuplicates = $wpdb->get_results("SELECT * FROM ".$canvas->duplicates);

	$template = get_option('template');
	$template_pages = get_template_pages($template);


	
	$currModules = $wpdb->get_results("SELECT * FROM ".$canvas->main);
	foreach($currModules as $currModule){

		// Delete obselete modules
		$found = false;
		foreach($customModules as $customModule){
			if ($customModule->id == $currModule->module_id) $found = true;
		}
		if (!$found){
			canvas_delete_block_by_mod_ID($currModule->module_id);
			$wpdb->query("DELETE FROM ".$canvas->duplicates." WHERE module_id = '$currModule->module_id'");
		}

		// Delete obselete duplicates
		$found = false;
		foreach($currDuplicates as $currDuplicate){
			if ($currDuplicate->duplicate_id == $currModule->duplicate_id) $found = true;
		}
		if (!$found && $currModule->duplicate_id != 0){
			canvas_delete_block($currModule->block_id);
		}


		
	}



	// Insert/Update modules in canvas table	
	foreach($customModules as $customModule){
	
		foreach($template_pages as $template_page){
	
			$currModules = $wpdb->get_results("SELECT * FROM ".$canvas->main." WHERE module_id = '$customModule->id' AND theme = '".get_option('template')."' AND page='$template_page'"); 


			// --- The module doesn't exist in the database, insert it for the first time
			if (!$currModules){	
				$configFile = $dir.$customModule->name."/configure.xml"; 
				if (file_exists($configFile)){
					$plugin = canvas_import_plugin($customModule->id, $configFile, $position, $customModule->name, $template_page, 0);
					$position++;
				}
			}

			// --- If a duplicate doesn't exist, insert it
			$currDuplicates = $wpdb->get_results("SELECT * FROM ".$canvas->duplicates." WHERE module_id = '$customModule->id'");
			foreach($currDuplicates as $currDuplicate){ 
				if (!$wpdb->get_results("SELECT * FROM ".$canvas->main." WHERE module_id = '$customModule->id' AND theme = '".get_option('template')."' AND page='$template_page' AND duplicate_id = $currDuplicate->duplicate_id")){
					$configFile = $dir.$customModule->name."/configure.xml"; 
					if (file_exists($configFile)){
						$plugin = canvas_import_plugin($customModule->id, $configFile, $position, $currDuplicate->duplicate_name, $template_page, $currDuplicate->duplicate_id);
						$position++;
					}
				}
			}


			// --- Update each instance of this module
			foreach($currModules as $currModule){
				$configFile = $dir.$customModule->name."/configure.xml";

				// Get module name
				include_once('RCCWP_CustomWriteModule.php');
				$customWriteModule = RCCWP_CustomWriteModule::Get($currModule->module_id);
				$currModule->module_name = $customWriteModule->name; 

				$modID = $currModule->block_id;
				$modName = $currModule->module_name;
				$modTemplateName = $currModule->template_name; // $wpdb->get_var("SELECT template_name FROM ".$canvas->main." WHERE module_name = '$customModule->name' AND theme = '".get_option('template')."'");
				$modTemplateSize = $currModule->template_size; //$wpdb->get_var("SELECT template_size FROM ".$canvas->main." WHERE module_name = '$customModule->name' AND theme = '".get_option('template')."'");

				// Check whether there is a custom configure.xml defined for this module
				$overidConfig = get_module_template_folder($modName, $modTemplateName, $modTemplateSize)."configure.xml";
				
				if (file_exists($overidConfig))
					$configFile = $overidConfig; 

				if (file_exists($configFile)){
					$plugin = canvas_import_plugin($customModule->id, $configFile, $position, $modName, $template_page, $currDuplicate->duplicate_id, $modID);
					$position++;
				}
			}
			
		}
	}

	
	return array($plugin, $position);
}


function canvas_install_plugin_data($moduleID, $plugin, $position, $template_page, $duplicate_id, $block_id = -1) {
	global $wpdb, $canvas;
	//$name = addslashes($plugin->functionName);
	$author = $plugin->functionAuthor;
	$uri = $plugin->functionUri;
	$description = addslashes($plugin->functionDesc);
	$group = $plugin->functionGroup;
	$path = $plugin->functionPath;
	$ubi = md5($name.$author.$uri.$description.$group.$path);
	if ($block_id == -1){
	//if (!$wpdb->get_var("SELECT module_id FROM ".$canvas->main." WHERE module_id = $moduleID AND theme = '".get_option('template')."' AND page='$template_page'") ) {
		// install module for the first time
		$wpdb->query("INSERT INTO ".$canvas->main." (module_id, type, zone, position, author, description, block_group, uri, path, theme, ubi, duplicate_id, page) VALUES ($moduleID, 'plugin','shelf','$position','$author','$description','$group','$uri','$path','".get_option('template')."','$ubi', $duplicate_id, '$template_page')");		
    		$position++;
		$plugin_id = mysql_insert_id($wpdb->dbh);
    	}
	else{
		
		//if ($wpdb->get_var("SELECT block_id FROM ".$canvas->main." WHERE block_id = $block_id"))
			//If this the main module, not a duplicate, update its name
			$wpdb->query("UPDATE ".$canvas->main.
				" SET author = '$author', description = '$description', path ='$path'".
				" WHERE block_id = $block_id");		
		//..else
		//	$wpdb->query("UPDATE ".$canvas->main.
		//		" SET author = '$author', description = '$description', path ='$path'".
		//		" WHERE block_id = $block_id");

		$plugin_id = $wpdb->get_var("SELECT block_id FROM ".$canvas->main." WHERE block_id = $block_id");
		$position =  $wpdb->get_var("SELECT position FROM ".$canvas->main." WHERE  block_id = $block_id");
	}
    	

    	return array($plugin_id,$position);
}

function canvas_install_variable_data($name, $parent, $type, $default, $description, $options) {
	global $wpdb, $canvas;
	
	if (!$wpdb->get_var("SELECT variable_name FROM ".$canvas->variables." WHERE variable_name = '$name' AND parent = '$parent'") ) {
		$wpdb->query("INSERT INTO ".$canvas->variables." (variable_name,parent,type,value,default_value,description) VALUES ('$name','$parent','$type','$default','$default','$description')");
		$var_id = $wpdb->get_var("SELECT variable_id FROM ".$canvas->variables." WHERE variable_name = '$name' AND parent = '$parent'");
		
		if (!empty($options)) {
		  foreach($options as $option) {
			$option_name = addslashes($option['name']);
			$option_value = addslashes($option['value']);
			$option_params = addslashes($option['params']);
			$wpdb->query("INSERT INTO ".$canvas->options." (var_id, option_text, option_value, option_params) VALUES ('$var_id','$option_name','$option_value','$option_params')");
          	  }
		}
	}
	else{ 
		$extraParam = '';
		if ('__RESETDEFAULT__' == $wpdb->get_var("SELECT default_value FROM ".$canvas->variables." WHERE variable_name = '$name' AND parent = '$parent'"))
			$extraParam = ", value = '$default' ";
			
		$wpdb->query("UPDATE ".$canvas->variables.
				" SET type = '$type', default_value = '$default', description = '$description' ". $extraParam.
				" WHERE variable_name = '$name' AND parent = '$parent'");
		$var_id = $wpdb->get_var("SELECT variable_id FROM ".$canvas->variables." WHERE variable_name = '$name' AND parent = '$parent'");
		$wpdb->query("DELETE FROM ".$canvas->options." WHERE var_id = '$var_id'");
		
		if (!empty($options)) {
		  foreach($options as $option) {
			$option_name = addslashes($option['name']);
			$option_value = addslashes($option['value']);
			$option_params = addslashes($option['params']);
			$wpdb->query("INSERT INTO ".$canvas->options." (var_id,option_text,option_value, option_params) VALUES ('$var_id','$option_name','$option_value','$option_params')");
          	  }
		}
	}
}



function canvas_restore_form($xml_path) {
?>
<div class="lbContent">
<h3>Restore from XML
<p>Attempt to restore this theme's layout to the default settings.</p>
<a id="cancel" href="javascript:void(0)" class="lbAction" rel="cancel">Cancel</a>
</h3>
<div>
	<form id="canvas_export">
		<p>Canvas will attempt to restore your current theme's layout and plugin settings to those specified by the author in the original XML file.</p>
		<p>Importing from XML is still experimental, and may result in loss of Canvas-related data.</p>
		<input class="text" type="hidden" id="path_to_xml" name="path_to_xml" value="<?php echo $xml_path; ?>&restore=true" />
		<input type="button" id="import_canvas" name="import_canvas" value="Restore" onclick="Canvas.importXml()"/>
	</form>
	<p id="export_message"></p>
</div>
</div>

<?php
}

?>